]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
47e72a49eb3269cf3b13e9f8143c413dd5a7ae85
[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         var isImplemented$4 = function () {
277                 var assign = Object.assign, obj;
278                 if (typeof assign !== "function") return false;
279                 obj = { foo: "raz" };
280                 assign(obj, { bar: "dwa" }, { trzy: "trzy" });
281                 return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
282         };
283
284         var isImplemented$5 = function () {
285                 try {
286                         Object.keys("primitive");
287                         return true;
288                 } catch (e) {
289                         return false;
290                 }
291         };
292
293         var keys = Object.keys;
294
295         var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
296
297         var keys$1 = isImplemented$5() ? Object.keys : shim$4;
298
299         var max$1   = Math.max;
300
301         var shim$5 = function (dest, src /*, …srcn*/) {
302                 var error, i, length = max$1(arguments.length, 2), assign;
303                 dest = Object(validValue(dest));
304                 assign = function (key) {
305                         try {
306                                 dest[key] = src[key];
307                         } catch (e) {
308                                 if (!error) error = e;
309                         }
310                 };
311                 for (i = 1; i < length; ++i) {
312                         src = arguments[i];
313                         keys$1(src).forEach(assign);
314                 }
315                 if (error !== undefined) throw error;
316                 return dest;
317         };
318
319         var assign = isImplemented$4()
320                 ? Object.assign
321                 : shim$5;
322
323         var forEach = Array.prototype.forEach, create$2 = Object.create;
324
325         var process$1 = function (src, obj) {
326                 var key;
327                 for (key in src) obj[key] = src[key];
328         };
329
330         // eslint-disable-next-line no-unused-vars
331         var normalizeOptions = function (opts1 /*, …options*/) {
332                 var result = create$2(null);
333                 forEach.call(arguments, function (options) {
334                         if (!isValue(options)) return;
335                         process$1(Object(options), result);
336                 });
337                 return result;
338         };
339
340         // Deprecated
341
342         var isCallable = function (obj) {
343          return typeof obj === "function";
344         };
345
346         var str = "razdwatrzy";
347
348         var isImplemented$6 = function () {
349                 if (typeof str.contains !== "function") return false;
350                 return (str.contains("dwa") === true) && (str.contains("foo") === false);
351         };
352
353         var indexOf$1 = String.prototype.indexOf;
354
355         var shim$6 = function (searchString/*, position*/) {
356                 return indexOf$1.call(this, searchString, arguments[1]) > -1;
357         };
358
359         var contains = isImplemented$6()
360                 ? String.prototype.contains
361                 : shim$6;
362
363         var d_1 = createCommonjsModule(function (module) {
364
365         var d;
366
367         d = module.exports = function (dscr, value/*, options*/) {
368                 var c, e, w, options, desc;
369                 if ((arguments.length < 2) || (typeof dscr !== 'string')) {
370                         options = value;
371                         value = dscr;
372                         dscr = null;
373                 } else {
374                         options = arguments[2];
375                 }
376                 if (dscr == null) {
377                         c = w = true;
378                         e = false;
379                 } else {
380                         c = contains.call(dscr, 'c');
381                         e = contains.call(dscr, 'e');
382                         w = contains.call(dscr, 'w');
383                 }
384
385                 desc = { value: value, configurable: c, enumerable: e, writable: w };
386                 return !options ? desc : assign(normalizeOptions(options), desc);
387         };
388
389         d.gs = function (dscr, get, set/*, options*/) {
390                 var c, e, options, desc;
391                 if (typeof dscr !== 'string') {
392                         options = set;
393                         set = get;
394                         get = dscr;
395                         dscr = null;
396                 } else {
397                         options = arguments[3];
398                 }
399                 if (get == null) {
400                         get = undefined;
401                 } else if (!isCallable(get)) {
402                         options = get;
403                         get = set = undefined;
404                 } else if (set == null) {
405                         set = undefined;
406                 } else if (!isCallable(set)) {
407                         options = set;
408                         set = undefined;
409                 }
410                 if (dscr == null) {
411                         c = true;
412                         e = false;
413                 } else {
414                         c = contains.call(dscr, 'c');
415                         e = contains.call(dscr, 'e');
416                 }
417
418                 desc = { get: get, set: set, configurable: c, enumerable: e };
419                 return !options ? desc : assign(normalizeOptions(options), desc);
420         };
421         });
422
423         var eventEmitter = createCommonjsModule(function (module, exports) {
424
425         var apply = Function.prototype.apply, call = Function.prototype.call
426           , create = Object.create, defineProperty = Object.defineProperty
427           , defineProperties = Object.defineProperties
428           , hasOwnProperty = Object.prototype.hasOwnProperty
429           , descriptor = { configurable: true, enumerable: false, writable: true }
430
431           , on, once, off, emit, methods, descriptors, base;
432
433         on = function (type, listener) {
434                 var data;
435
436                 validCallable(listener);
437
438                 if (!hasOwnProperty.call(this, '__ee__')) {
439                         data = descriptor.value = create(null);
440                         defineProperty(this, '__ee__', descriptor);
441                         descriptor.value = null;
442                 } else {
443                         data = this.__ee__;
444                 }
445                 if (!data[type]) data[type] = listener;
446                 else if (typeof data[type] === 'object') data[type].push(listener);
447                 else data[type] = [data[type], listener];
448
449                 return this;
450         };
451
452         once = function (type, listener) {
453                 var once, self;
454
455                 validCallable(listener);
456                 self = this;
457                 on.call(this, type, once = function () {
458                         off.call(self, type, once);
459                         apply.call(listener, this, arguments);
460                 });
461
462                 once.__eeOnceListener__ = listener;
463                 return this;
464         };
465
466         off = function (type, listener) {
467                 var data, listeners, candidate, i;
468
469                 validCallable(listener);
470
471                 if (!hasOwnProperty.call(this, '__ee__')) return this;
472                 data = this.__ee__;
473                 if (!data[type]) return this;
474                 listeners = data[type];
475
476                 if (typeof listeners === 'object') {
477                         for (i = 0; (candidate = listeners[i]); ++i) {
478                                 if ((candidate === listener) ||
479                                                 (candidate.__eeOnceListener__ === listener)) {
480                                         if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
481                                         else listeners.splice(i, 1);
482                                 }
483                         }
484                 } else {
485                         if ((listeners === listener) ||
486                                         (listeners.__eeOnceListener__ === listener)) {
487                                 delete data[type];
488                         }
489                 }
490
491                 return this;
492         };
493
494         emit = function (type) {
495                 var i, l, listener, listeners, args;
496
497                 if (!hasOwnProperty.call(this, '__ee__')) return;
498                 listeners = this.__ee__[type];
499                 if (!listeners) return;
500
501                 if (typeof listeners === 'object') {
502                         l = arguments.length;
503                         args = new Array(l - 1);
504                         for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
505
506                         listeners = listeners.slice();
507                         for (i = 0; (listener = listeners[i]); ++i) {
508                                 apply.call(listener, this, args);
509                         }
510                 } else {
511                         switch (arguments.length) {
512                         case 1:
513                                 call.call(listeners, this);
514                                 break;
515                         case 2:
516                                 call.call(listeners, this, arguments[1]);
517                                 break;
518                         case 3:
519                                 call.call(listeners, this, arguments[1], arguments[2]);
520                                 break;
521                         default:
522                                 l = arguments.length;
523                                 args = new Array(l - 1);
524                                 for (i = 1; i < l; ++i) {
525                                         args[i - 1] = arguments[i];
526                                 }
527                                 apply.call(listeners, this, args);
528                         }
529                 }
530         };
531
532         methods = {
533                 on: on,
534                 once: once,
535                 off: off,
536                 emit: emit
537         };
538
539         descriptors = {
540                 on: d_1(on),
541                 once: d_1(once),
542                 off: d_1(off),
543                 emit: d_1(emit)
544         };
545
546         base = defineProperties({}, descriptors);
547
548         module.exports = exports = function (o) {
549                 return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
550         };
551         exports.methods = methods;
552         });
553         var eventEmitter_1 = eventEmitter.methods;
554
555         var validTypes = { object: true, symbol: true };
556
557         var isImplemented$7 = function () {
558                 var symbol;
559                 if (typeof Symbol !== 'function') return false;
560                 symbol = Symbol('test symbol');
561                 try { String(symbol); } catch (e) { return false; }
562
563                 // Return 'true' also for polyfills
564                 if (!validTypes[typeof Symbol.iterator]) return false;
565                 if (!validTypes[typeof Symbol.toPrimitive]) return false;
566                 if (!validTypes[typeof Symbol.toStringTag]) return false;
567
568                 return true;
569         };
570
571         var isSymbol = function (x) {
572                 if (!x) return false;
573                 if (typeof x === 'symbol') return true;
574                 if (!x.constructor) return false;
575                 if (x.constructor.name !== 'Symbol') return false;
576                 return (x[x.constructor.toStringTag] === 'Symbol');
577         };
578
579         var validateSymbol = function (value) {
580                 if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
581                 return value;
582         };
583
584         var create$3 = Object.create, defineProperties = Object.defineProperties
585           , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
586           , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
587           , isNativeSafe;
588
589         if (typeof Symbol === 'function') {
590                 NativeSymbol = Symbol;
591                 try {
592                         String(NativeSymbol());
593                         isNativeSafe = true;
594                 } catch (ignore) {}
595         }
596
597         var generateName = (function () {
598                 var created = create$3(null);
599                 return function (desc) {
600                         var postfix = 0, name, ie11BugWorkaround;
601                         while (created[desc + (postfix || '')]) ++postfix;
602                         desc += (postfix || '');
603                         created[desc] = true;
604                         name = '@@' + desc;
605                         defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
606                                 // For IE11 issue see:
607                                 // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
608                                 //    ie11-broken-getters-on-dom-objects
609                                 // https://github.com/medikoo/es6-symbol/issues/12
610                                 if (ie11BugWorkaround) return;
611                                 ie11BugWorkaround = true;
612                                 defineProperty$1(this, name, d_1(value));
613                                 ie11BugWorkaround = false;
614                         }));
615                         return name;
616                 };
617         }());
618
619         // Internal constructor (not one exposed) for creating Symbol instances.
620         // This one is used to ensure that `someSymbol instanceof Symbol` always return false
621         HiddenSymbol = function Symbol(description) {
622                 if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
623                 return SymbolPolyfill(description);
624         };
625
626         // Exposed `Symbol` constructor
627         // (returns instances of HiddenSymbol)
628         var polyfill = SymbolPolyfill = function Symbol(description) {
629                 var symbol;
630                 if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
631                 if (isNativeSafe) return NativeSymbol(description);
632                 symbol = create$3(HiddenSymbol.prototype);
633                 description = (description === undefined ? '' : String(description));
634                 return defineProperties(symbol, {
635                         __description__: d_1('', description),
636                         __name__: d_1('', generateName(description))
637                 });
638         };
639         defineProperties(SymbolPolyfill, {
640                 for: d_1(function (key) {
641                         if (globalSymbols[key]) return globalSymbols[key];
642                         return (globalSymbols[key] = SymbolPolyfill(String(key)));
643                 }),
644                 keyFor: d_1(function (s) {
645                         var key;
646                         validateSymbol(s);
647                         for (key in globalSymbols) if (globalSymbols[key] === s) return key;
648                 }),
649
650                 // To ensure proper interoperability with other native functions (e.g. Array.from)
651                 // fallback to eventual native implementation of given symbol
652                 hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
653                 isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
654                         SymbolPolyfill('isConcatSpreadable')),
655                 iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
656                 match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
657                 replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
658                 search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
659                 species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
660                 split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
661                 toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
662                 toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
663                 unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
664         });
665
666         // Internal tweaks for real symbol producer
667         defineProperties(HiddenSymbol.prototype, {
668                 constructor: d_1(SymbolPolyfill),
669                 toString: d_1('', function () { return this.__name__; })
670         });
671
672         // Proper implementation of methods exposed on Symbol.prototype
673         // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
674         defineProperties(SymbolPolyfill.prototype, {
675                 toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
676                 valueOf: d_1(function () { return validateSymbol(this); })
677         });
678         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
679                 var symbol = validateSymbol(this);
680                 if (typeof symbol === 'symbol') return symbol;
681                 return symbol.toString();
682         }));
683         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
684
685         // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
686         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
687                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
688
689         // Note: It's important to define `toPrimitive` as last one, as some implementations
690         // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
691         // And that may invoke error in definition flow:
692         // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
693         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
694                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
695
696         var es6Symbol = isImplemented$7() ? Symbol : polyfill;
697
698         var objToString = Object.prototype.toString
699           , id = objToString.call(
700                 (function () {
701                         return arguments;
702                 })()
703         );
704
705         var isArguments = function (value) {
706                 return objToString.call(value) === id;
707         };
708
709         var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
710
711         var isString = function (value) {
712                 return (
713                         typeof value === "string" ||
714                         (value &&
715                                 typeof value === "object" &&
716                                 (value instanceof String || objToString$1.call(value) === id$1)) ||
717                         false
718                 );
719         };
720
721         var iteratorSymbol = es6Symbol.iterator
722           , isArray        = Array.isArray;
723
724         var isIterable = function (value) {
725                 if (!isValue(value)) return false;
726                 if (isArray(value)) return true;
727                 if (isString(value)) return true;
728                 if (isArguments(value)) return true;
729                 return typeof value[iteratorSymbol] === "function";
730         };
731
732         var validIterable = function (value) {
733                 if (!isIterable(value)) throw new TypeError(value + " is not iterable");
734                 return value;
735         };
736
737         var isImplemented$8 = function () {
738                 var from = Array.from, arr, result;
739                 if (typeof from !== "function") return false;
740                 arr = ["raz", "dwa"];
741                 result = from(arr);
742                 return Boolean(result && (result !== arr) && (result[1] === "dwa"));
743         };
744
745         var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
746
747         var isFunction = function (value) {
748                 return typeof value === "function" && objToString$2.call(value) === id$2;
749         };
750
751         var iteratorSymbol$1 = es6Symbol.iterator
752           , isArray$1        = Array.isArray
753           , call           = Function.prototype.call
754           , desc           = { configurable: true, enumerable: true, writable: true, value: null }
755           , defineProperty$2 = Object.defineProperty;
756
757         // eslint-disable-next-line complexity, max-lines-per-function
758         var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
759                 var mapFn = arguments[1]
760                   , thisArg = arguments[2]
761                   , Context
762                   , i
763                   , j
764                   , arr
765                   , length
766                   , code
767                   , iterator
768                   , result
769                   , getIterator
770                   , value;
771
772                 arrayLike = Object(validValue(arrayLike));
773
774                 if (isValue(mapFn)) validCallable(mapFn);
775                 if (!this || this === Array || !isFunction(this)) {
776                         // Result: Plain array
777                         if (!mapFn) {
778                                 if (isArguments(arrayLike)) {
779                                         // Source: Arguments
780                                         length = arrayLike.length;
781                                         if (length !== 1) return Array.apply(null, arrayLike);
782                                         arr = new Array(1);
783                                         arr[0] = arrayLike[0];
784                                         return arr;
785                                 }
786                                 if (isArray$1(arrayLike)) {
787                                         // Source: Array
788                                         arr = new Array(length = arrayLike.length);
789                                         for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
790                                         return arr;
791                                 }
792                         }
793                         arr = [];
794                 } else {
795                         // Result: Non plain array
796                         Context = this;
797                 }
798
799                 if (!isArray$1(arrayLike)) {
800                         if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
801                                 // Source: Iterator
802                                 iterator = validCallable(getIterator).call(arrayLike);
803                                 if (Context) arr = new Context();
804                                 result = iterator.next();
805                                 i = 0;
806                                 while (!result.done) {
807                                         value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
808                                         if (Context) {
809                                                 desc.value = value;
810                                                 defineProperty$2(arr, i, desc);
811                                         } else {
812                                                 arr[i] = value;
813                                         }
814                                         result = iterator.next();
815                                         ++i;
816                                 }
817                                 length = i;
818                         } else if (isString(arrayLike)) {
819                                 // Source: String
820                                 length = arrayLike.length;
821                                 if (Context) arr = new Context();
822                                 for (i = 0, j = 0; i < length; ++i) {
823                                         value = arrayLike[i];
824                                         if (i + 1 < length) {
825                                                 code = value.charCodeAt(0);
826                                                 // eslint-disable-next-line max-depth
827                                                 if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
828                                         }
829                                         value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
830                                         if (Context) {
831                                                 desc.value = value;
832                                                 defineProperty$2(arr, j, desc);
833                                         } else {
834                                                 arr[j] = value;
835                                         }
836                                         ++j;
837                                 }
838                                 length = j;
839                         }
840                 }
841                 if (length === undefined) {
842                         // Source: array or array-like
843                         length = toPosInteger(arrayLike.length);
844                         if (Context) arr = new Context(length);
845                         for (i = 0; i < length; ++i) {
846                                 value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
847                                 if (Context) {
848                                         desc.value = value;
849                                         defineProperty$2(arr, i, desc);
850                                 } else {
851                                         arr[i] = value;
852                                 }
853                         }
854                 }
855                 if (Context) {
856                         desc.value = null;
857                         arr.length = length;
858                 }
859                 return arr;
860         };
861
862         var from_1 = isImplemented$8()
863                 ? Array.from
864                 : shim$7;
865
866         var copy = function (obj/*, propertyNames, options*/) {
867                 var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
868                 if (copy !== obj && !propertyNames) return copy;
869                 var result = {};
870                 if (propertyNames) {
871                         from_1(propertyNames, function (propertyName) {
872                                 if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
873                         });
874                 } else {
875                         assign(result, obj);
876                 }
877                 return result;
878         };
879
880         var bind                    = Function.prototype.bind
881           , call$1                    = Function.prototype.call
882           , keys$2                    = Object.keys
883           , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
884
885         var _iterate = function (method, defVal) {
886                 return function (obj, cb /*, thisArg, compareFn*/) {
887                         var list, thisArg = arguments[2], compareFn = arguments[3];
888                         obj = Object(validValue(obj));
889                         validCallable(cb);
890
891                         list = keys$2(obj);
892                         if (compareFn) {
893                                 list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
894                         }
895                         if (typeof method !== "function") method = list[method];
896                         return call$1.call(method, list, function (key, index) {
897                                 if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
898                                 return call$1.call(cb, thisArg, obj[key], key, obj, index);
899                         });
900                 };
901         };
902
903         var forEach$1 = _iterate("forEach");
904
905         var call$2     = Function.prototype.call;
906
907         var map$1 = function (obj, cb /*, thisArg*/) {
908                 var result = {}, thisArg = arguments[2];
909                 validCallable(cb);
910                 forEach$1(obj, function (value, key, targetObj, index) {
911                         result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
912                 });
913                 return result;
914         };
915
916         var callable         = validCallable
917
918           , bind$1 = Function.prototype.bind, defineProperty$3 = Object.defineProperty
919           , hasOwnProperty = Object.prototype.hasOwnProperty
920           , define;
921
922         define = function (name, desc, options) {
923                 var value = validValue(desc) && callable(desc.value), dgs;
924                 dgs = copy(desc);
925                 delete dgs.writable;
926                 delete dgs.value;
927                 dgs.get = function () {
928                         if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
929                         desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
930                         defineProperty$3(this, name, desc);
931                         return this[name];
932                 };
933                 return dgs;
934         };
935
936         var autoBind = function (props/*, options*/) {
937                 var options = normalizeOptions(arguments[1]);
938                 if (options.resolveContext != null) validCallable(options.resolveContext);
939                 return map$1(props, function (desc, name) { return define(name, desc, options); });
940         };
941
942         var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
943
944         var es6Iterator = Iterator = function (list, context) {
945                 if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
946                 defineProperties$1(this, {
947                         __list__: d_1("w", validValue(list)),
948                         __context__: d_1("w", context),
949                         __nextIndex__: d_1("w", 0)
950                 });
951                 if (!context) return;
952                 validCallable(context.on);
953                 context.on("_add", this._onAdd);
954                 context.on("_delete", this._onDelete);
955                 context.on("_clear", this._onClear);
956         };
957
958         // Internal %IteratorPrototype% doesn't expose its constructor
959         delete Iterator.prototype.constructor;
960
961         defineProperties$1(
962                 Iterator.prototype,
963                 assign(
964                         {
965                                 _next: d_1(function () {
966                                         var i;
967                                         if (!this.__list__) return undefined;
968                                         if (this.__redo__) {
969                                                 i = this.__redo__.shift();
970                                                 if (i !== undefined) return i;
971                                         }
972                                         if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
973                                         this._unBind();
974                                         return undefined;
975                                 }),
976                                 next: d_1(function () {
977                                         return this._createResult(this._next());
978                                 }),
979                                 _createResult: d_1(function (i) {
980                                         if (i === undefined) return { done: true, value: undefined };
981                                         return { done: false, value: this._resolve(i) };
982                                 }),
983                                 _resolve: d_1(function (i) {
984                                         return this.__list__[i];
985                                 }),
986                                 _unBind: d_1(function () {
987                                         this.__list__ = null;
988                                         delete this.__redo__;
989                                         if (!this.__context__) return;
990                                         this.__context__.off("_add", this._onAdd);
991                                         this.__context__.off("_delete", this._onDelete);
992                                         this.__context__.off("_clear", this._onClear);
993                                         this.__context__ = null;
994                                 }),
995                                 toString: d_1(function () {
996                                         return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
997                                 })
998                         },
999                         autoBind({
1000                                 _onAdd: d_1(function (index) {
1001                                         if (index >= this.__nextIndex__) return;
1002                                         ++this.__nextIndex__;
1003                                         if (!this.__redo__) {
1004                                                 defineProperty$4(this, "__redo__", d_1("c", [index]));
1005                                                 return;
1006                                         }
1007                                         this.__redo__.forEach(function (redo, i) {
1008                                                 if (redo >= index) this.__redo__[i] = ++redo;
1009                                         }, this);
1010                                         this.__redo__.push(index);
1011                                 }),
1012                                 _onDelete: d_1(function (index) {
1013                                         var i;
1014                                         if (index >= this.__nextIndex__) return;
1015                                         --this.__nextIndex__;
1016                                         if (!this.__redo__) return;
1017                                         i = this.__redo__.indexOf(index);
1018                                         if (i !== -1) this.__redo__.splice(i, 1);
1019                                         this.__redo__.forEach(function (redo, j) {
1020                                                 if (redo > index) this.__redo__[j] = --redo;
1021                                         }, this);
1022                                 }),
1023                                 _onClear: d_1(function () {
1024                                         if (this.__redo__) clear.call(this.__redo__);
1025                                         this.__nextIndex__ = 0;
1026                                 })
1027                         })
1028                 )
1029         );
1030
1031         defineProperty$4(
1032                 Iterator.prototype,
1033                 es6Symbol.iterator,
1034                 d_1(function () {
1035                         return this;
1036                 })
1037         );
1038
1039         var array = createCommonjsModule(function (module) {
1040
1041
1042
1043         var defineProperty = Object.defineProperty, ArrayIterator;
1044
1045         ArrayIterator = module.exports = function (arr, kind) {
1046                 if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
1047                 es6Iterator.call(this, arr);
1048                 if (!kind) kind = "value";
1049                 else if (contains.call(kind, "key+value")) kind = "key+value";
1050                 else if (contains.call(kind, "key")) kind = "key";
1051                 else kind = "value";
1052                 defineProperty(this, "__kind__", d_1("", kind));
1053         };
1054         if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
1055
1056         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1057         delete ArrayIterator.prototype.constructor;
1058
1059         ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
1060                 _resolve: d_1(function (i) {
1061                         if (this.__kind__ === "value") return this.__list__[i];
1062                         if (this.__kind__ === "key+value") return [i, this.__list__[i]];
1063                         return i;
1064                 })
1065         });
1066         defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
1067         });
1068
1069         var string = createCommonjsModule(function (module) {
1070
1071
1072
1073         var defineProperty = Object.defineProperty, StringIterator;
1074
1075         StringIterator = module.exports = function (str) {
1076                 if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
1077                 str = String(str);
1078                 es6Iterator.call(this, str);
1079                 defineProperty(this, "__length__", d_1("", str.length));
1080         };
1081         if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
1082
1083         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1084         delete StringIterator.prototype.constructor;
1085
1086         StringIterator.prototype = Object.create(es6Iterator.prototype, {
1087                 _next: d_1(function () {
1088                         if (!this.__list__) return undefined;
1089                         if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
1090                         this._unBind();
1091                         return undefined;
1092                 }),
1093                 _resolve: d_1(function (i) {
1094                         var char = this.__list__[i], code;
1095                         if (this.__nextIndex__ === this.__length__) return char;
1096                         code = char.charCodeAt(0);
1097                         if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
1098                         return char;
1099                 })
1100         });
1101         defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
1102         });
1103
1104         var iteratorSymbol$2 = es6Symbol.iterator;
1105
1106         var get = function (obj) {
1107                 if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
1108                 if (isArguments(obj)) return new array(obj);
1109                 if (isString(obj)) return new string(obj);
1110                 return new array(obj);
1111         };
1112
1113         var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
1114
1115         var forOf = function (iterable, cb /*, thisArg*/) {
1116                 var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
1117                 if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
1118                 else if (isString(iterable)) mode = "string";
1119                 else iterable = get(iterable);
1120
1121                 validCallable(cb);
1122                 doBreak = function () {
1123                         broken = true;
1124                 };
1125                 if (mode === "array") {
1126                         some.call(iterable, function (value) {
1127                                 call$3.call(cb, thisArg, value, doBreak);
1128                                 return broken;
1129                         });
1130                         return;
1131                 }
1132                 if (mode === "string") {
1133                         length = iterable.length;
1134                         for (i = 0; i < length; ++i) {
1135                                 char = iterable[i];
1136                                 if (i + 1 < length) {
1137                                         code = char.charCodeAt(0);
1138                                         if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
1139                                 }
1140                                 call$3.call(cb, thisArg, char, doBreak);
1141                                 if (broken) break;
1142                         }
1143                         return;
1144                 }
1145                 result = iterable.next();
1146
1147                 while (!result.done) {
1148                         call$3.call(cb, thisArg, result.value, doBreak);
1149                         if (broken) return;
1150                         result = iterable.next();
1151                 }
1152         };
1153
1154         var iterator = createCommonjsModule(function (module) {
1155
1156         var toStringTagSymbol = es6Symbol.toStringTag
1157
1158           , defineProperty = Object.defineProperty
1159           , SetIterator;
1160
1161         SetIterator = module.exports = function (set, kind) {
1162                 if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
1163                 es6Iterator.call(this, set.__setData__, set);
1164                 if (!kind) kind = 'value';
1165                 else if (contains.call(kind, 'key+value')) kind = 'key+value';
1166                 else kind = 'value';
1167                 defineProperty(this, '__kind__', d_1('', kind));
1168         };
1169         if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
1170
1171         SetIterator.prototype = Object.create(es6Iterator.prototype, {
1172                 constructor: d_1(SetIterator),
1173                 _resolve: d_1(function (i) {
1174                         if (this.__kind__ === 'value') return this.__list__[i];
1175                         return [this.__list__[i], this.__list__[i]];
1176                 }),
1177                 toString: d_1(function () { return '[object Set Iterator]'; })
1178         });
1179         defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
1180         });
1181
1182         // Exports true if environment provides native `Set` implementation,
1183
1184         var isNativeImplemented = (function () {
1185                 if (typeof Set === 'undefined') return false;
1186                 return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
1187         }());
1188
1189         var iterator$1       = validIterable
1190
1191           , call$4 = Function.prototype.call
1192           , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
1193           , SetPoly, getValues, NativeSet;
1194
1195         if (isNativeImplemented) NativeSet = Set;
1196
1197         var polyfill$1 = SetPoly = function Set(/*iterable*/) {
1198                 var iterable = arguments[0], self;
1199                 if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
1200                 if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
1201                 else self = this;
1202                 if (iterable != null) iterator$1(iterable);
1203                 defineProperty$5(self, '__setData__', d_1('c', []));
1204                 if (!iterable) return self;
1205                 forOf(iterable, function (value) {
1206                         if (eIndexOf.call(this, value) !== -1) return;
1207                         this.push(value);
1208                 }, self.__setData__);
1209                 return self;
1210         };
1211
1212         if (isNativeImplemented) {
1213                 if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
1214                 SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
1215         }
1216
1217         eventEmitter(Object.defineProperties(SetPoly.prototype, {
1218                 add: d_1(function (value) {
1219                         if (this.has(value)) return this;
1220                         this.emit('_add', this.__setData__.push(value) - 1, value);
1221                         return this;
1222                 }),
1223                 clear: d_1(function () {
1224                         if (!this.__setData__.length) return;
1225                         clear.call(this.__setData__);
1226                         this.emit('_clear');
1227                 }),
1228                 delete: d_1(function (value) {
1229                         var index = eIndexOf.call(this.__setData__, value);
1230                         if (index === -1) return false;
1231                         this.__setData__.splice(index, 1);
1232                         this.emit('_delete', index, value);
1233                         return true;
1234                 }),
1235                 entries: d_1(function () { return new iterator(this, 'key+value'); }),
1236                 forEach: d_1(function (cb/*, thisArg*/) {
1237                         var thisArg = arguments[1], iterator, result, value;
1238                         validCallable(cb);
1239                         iterator = this.values();
1240                         result = iterator._next();
1241                         while (result !== undefined) {
1242                                 value = iterator._resolve(result);
1243                                 call$4.call(cb, thisArg, value, value, this);
1244                                 result = iterator._next();
1245                         }
1246                 }),
1247                 has: d_1(function (value) {
1248                         return (eIndexOf.call(this.__setData__, value) !== -1);
1249                 }),
1250                 keys: d_1(getValues = function () { return this.values(); }),
1251                 size: d_1.gs(function () { return this.__setData__.length; }),
1252                 values: d_1(function () { return new iterator(this); }),
1253                 toString: d_1(function () { return '[object Set]'; })
1254         }));
1255         defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
1256         defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
1257
1258         var es6Set = isImplemented() ? Set : polyfill$1;
1259
1260         var isImplemented$9 = function () {
1261                 var map, iterator, result;
1262                 if (typeof Map !== 'function') return false;
1263                 try {
1264                         // WebKit doesn't support arguments and crashes
1265                         map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
1266                 } catch (e) {
1267                         return false;
1268                 }
1269                 if (String(map) !== '[object Map]') return false;
1270                 if (map.size !== 3) return false;
1271                 if (typeof map.clear !== 'function') return false;
1272                 if (typeof map.delete !== 'function') return false;
1273                 if (typeof map.entries !== 'function') return false;
1274                 if (typeof map.forEach !== 'function') return false;
1275                 if (typeof map.get !== 'function') return false;
1276                 if (typeof map.has !== 'function') return false;
1277                 if (typeof map.keys !== 'function') return false;
1278                 if (typeof map.set !== 'function') return false;
1279                 if (typeof map.values !== 'function') return false;
1280
1281                 iterator = map.entries();
1282                 result = iterator.next();
1283                 if (result.done !== false) return false;
1284                 if (!result.value) return false;
1285                 if (result.value[0] !== 'raz') return false;
1286                 if (result.value[1] !== 'one') return false;
1287
1288                 return true;
1289         };
1290
1291         var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
1292
1293         // eslint-disable-next-line no-unused-vars
1294         var primitiveSet = function (arg /*, …args*/) {
1295                 var set = create$4(null);
1296                 forEach$2.call(arguments, function (name) {
1297                         set[name] = true;
1298                 });
1299                 return set;
1300         };
1301
1302         var iteratorKinds = primitiveSet('key',
1303                 'value', 'key+value');
1304
1305         var iterator$2 = createCommonjsModule(function (module) {
1306
1307         var toStringTagSymbol = es6Symbol.toStringTag
1308
1309           , defineProperties = Object.defineProperties
1310           , unBind = es6Iterator.prototype._unBind
1311           , MapIterator;
1312
1313         MapIterator = module.exports = function (map, kind) {
1314                 if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
1315                 es6Iterator.call(this, map.__mapKeysData__, map);
1316                 if (!kind || !iteratorKinds[kind]) kind = 'key+value';
1317                 defineProperties(this, {
1318                         __kind__: d_1('', kind),
1319                         __values__: d_1('w', map.__mapValuesData__)
1320                 });
1321         };
1322         if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
1323
1324         MapIterator.prototype = Object.create(es6Iterator.prototype, {
1325                 constructor: d_1(MapIterator),
1326                 _resolve: d_1(function (i) {
1327                         if (this.__kind__ === 'value') return this.__values__[i];
1328                         if (this.__kind__ === 'key') return this.__list__[i];
1329                         return [this.__list__[i], this.__values__[i]];
1330                 }),
1331                 _unBind: d_1(function () {
1332                         this.__values__ = null;
1333                         unBind.call(this);
1334                 }),
1335                 toString: d_1(function () { return '[object Map Iterator]'; })
1336         });
1337         Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
1338                 d_1('c', 'Map Iterator'));
1339         });
1340
1341         // Exports true if environment provides native `Map` implementation,
1342
1343         var isNativeImplemented$1 = (function () {
1344                 if (typeof Map === 'undefined') return false;
1345                 return (Object.prototype.toString.call(new Map()) === '[object Map]');
1346         }());
1347
1348         var iterator$3       = validIterable
1349
1350           , call$5 = Function.prototype.call
1351           , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
1352           , MapPoly;
1353
1354         var polyfill$2 = MapPoly = function (/*iterable*/) {
1355                 var iterable = arguments[0], keys, values, self;
1356                 if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
1357                 if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
1358                         self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
1359                 } else {
1360                         self = this;
1361                 }
1362                 if (iterable != null) iterator$3(iterable);
1363                 defineProperties$2(self, {
1364                         __mapKeysData__: d_1('c', keys = []),
1365                         __mapValuesData__: d_1('c', values = [])
1366                 });
1367                 if (!iterable) return self;
1368                 forOf(iterable, function (value) {
1369                         var key = validValue(value)[0];
1370                         value = value[1];
1371                         if (eIndexOf.call(keys, key) !== -1) return;
1372                         keys.push(key);
1373                         values.push(value);
1374                 }, self);
1375                 return self;
1376         };
1377
1378         if (isNativeImplemented$1) {
1379                 if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
1380                 MapPoly.prototype = Object.create(Map.prototype, {
1381                         constructor: d_1(MapPoly)
1382                 });
1383         }
1384
1385         eventEmitter(defineProperties$2(MapPoly.prototype, {
1386                 clear: d_1(function () {
1387                         if (!this.__mapKeysData__.length) return;
1388                         clear.call(this.__mapKeysData__);
1389                         clear.call(this.__mapValuesData__);
1390                         this.emit('_clear');
1391                 }),
1392                 delete: d_1(function (key) {
1393                         var index = eIndexOf.call(this.__mapKeysData__, key);
1394                         if (index === -1) return false;
1395                         this.__mapKeysData__.splice(index, 1);
1396                         this.__mapValuesData__.splice(index, 1);
1397                         this.emit('_delete', index, key);
1398                         return true;
1399                 }),
1400                 entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
1401                 forEach: d_1(function (cb/*, thisArg*/) {
1402                         var thisArg = arguments[1], iterator, result;
1403                         validCallable(cb);
1404                         iterator = this.entries();
1405                         result = iterator._next();
1406                         while (result !== undefined) {
1407                                 call$5.call(cb, thisArg, this.__mapValuesData__[result],
1408                                         this.__mapKeysData__[result], this);
1409                                 result = iterator._next();
1410                         }
1411                 }),
1412                 get: d_1(function (key) {
1413                         var index = eIndexOf.call(this.__mapKeysData__, key);
1414                         if (index === -1) return;
1415                         return this.__mapValuesData__[index];
1416                 }),
1417                 has: d_1(function (key) {
1418                         return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
1419                 }),
1420                 keys: d_1(function () { return new iterator$2(this, 'key'); }),
1421                 set: d_1(function (key, value) {
1422                         var index = eIndexOf.call(this.__mapKeysData__, key), emit;
1423                         if (index === -1) {
1424                                 index = this.__mapKeysData__.push(key) - 1;
1425                                 emit = true;
1426                         }
1427                         this.__mapValuesData__[index] = value;
1428                         if (emit) this.emit('_add', index, key);
1429                         return this;
1430                 }),
1431                 size: d_1.gs(function () { return this.__mapKeysData__.length; }),
1432                 values: d_1(function () { return new iterator$2(this, 'value'); }),
1433                 toString: d_1(function () { return '[object Map]'; })
1434         }));
1435         Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
1436                 return this.entries();
1437         }));
1438         Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
1439
1440         var es6Map = isImplemented$9() ? Map : polyfill$2;
1441
1442         var toStr = Object.prototype.toString;
1443
1444         var isArguments$1 = function isArguments(value) {
1445                 var str = toStr.call(value);
1446                 var isArgs = str === '[object Arguments]';
1447                 if (!isArgs) {
1448                         isArgs = str !== '[object Array]' &&
1449                                 value !== null &&
1450                                 typeof value === 'object' &&
1451                                 typeof value.length === 'number' &&
1452                                 value.length >= 0 &&
1453                                 toStr.call(value.callee) === '[object Function]';
1454                 }
1455                 return isArgs;
1456         };
1457
1458         var keysShim;
1459         if (!Object.keys) {
1460                 // modified from https://github.com/es-shims/es5-shim
1461                 var has = Object.prototype.hasOwnProperty;
1462                 var toStr$1 = Object.prototype.toString;
1463                 var isArgs = isArguments$1; // eslint-disable-line global-require
1464                 var isEnumerable = Object.prototype.propertyIsEnumerable;
1465                 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
1466                 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
1467                 var dontEnums = [
1468                         'toString',
1469                         'toLocaleString',
1470                         'valueOf',
1471                         'hasOwnProperty',
1472                         'isPrototypeOf',
1473                         'propertyIsEnumerable',
1474                         'constructor'
1475                 ];
1476                 var equalsConstructorPrototype = function (o) {
1477                         var ctor = o.constructor;
1478                         return ctor && ctor.prototype === o;
1479                 };
1480                 var excludedKeys = {
1481                         $applicationCache: true,
1482                         $console: true,
1483                         $external: true,
1484                         $frame: true,
1485                         $frameElement: true,
1486                         $frames: true,
1487                         $innerHeight: true,
1488                         $innerWidth: true,
1489                         $outerHeight: true,
1490                         $outerWidth: true,
1491                         $pageXOffset: true,
1492                         $pageYOffset: true,
1493                         $parent: true,
1494                         $scrollLeft: true,
1495                         $scrollTop: true,
1496                         $scrollX: true,
1497                         $scrollY: true,
1498                         $self: true,
1499                         $webkitIndexedDB: true,
1500                         $webkitStorageInfo: true,
1501                         $window: true
1502                 };
1503                 var hasAutomationEqualityBug = (function () {
1504                         /* global window */
1505                         if (typeof window === 'undefined') { return false; }
1506                         for (var k in window) {
1507                                 try {
1508                                         if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
1509                                                 try {
1510                                                         equalsConstructorPrototype(window[k]);
1511                                                 } catch (e) {
1512                                                         return true;
1513                                                 }
1514                                         }
1515                                 } catch (e) {
1516                                         return true;
1517                                 }
1518                         }
1519                         return false;
1520                 }());
1521                 var equalsConstructorPrototypeIfNotBuggy = function (o) {
1522                         /* global window */
1523                         if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1524                                 return equalsConstructorPrototype(o);
1525                         }
1526                         try {
1527                                 return equalsConstructorPrototype(o);
1528                         } catch (e) {
1529                                 return false;
1530                         }
1531                 };
1532
1533                 keysShim = function keys(object) {
1534                         var isObject = object !== null && typeof object === 'object';
1535                         var isFunction = toStr$1.call(object) === '[object Function]';
1536                         var isArguments = isArgs(object);
1537                         var isString = isObject && toStr$1.call(object) === '[object String]';
1538                         var theKeys = [];
1539
1540                         if (!isObject && !isFunction && !isArguments) {
1541                                 throw new TypeError('Object.keys called on a non-object');
1542                         }
1543
1544                         var skipProto = hasProtoEnumBug && isFunction;
1545                         if (isString && object.length > 0 && !has.call(object, 0)) {
1546                                 for (var i = 0; i < object.length; ++i) {
1547                                         theKeys.push(String(i));
1548                                 }
1549                         }
1550
1551                         if (isArguments && object.length > 0) {
1552                                 for (var j = 0; j < object.length; ++j) {
1553                                         theKeys.push(String(j));
1554                                 }
1555                         } else {
1556                                 for (var name in object) {
1557                                         if (!(skipProto && name === 'prototype') && has.call(object, name)) {
1558                                                 theKeys.push(String(name));
1559                                         }
1560                                 }
1561                         }
1562
1563                         if (hasDontEnumBug) {
1564                                 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1565
1566                                 for (var k = 0; k < dontEnums.length; ++k) {
1567                                         if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
1568                                                 theKeys.push(dontEnums[k]);
1569                                         }
1570                                 }
1571                         }
1572                         return theKeys;
1573                 };
1574         }
1575         var implementation = keysShim;
1576
1577         var slice = Array.prototype.slice;
1578
1579
1580         var origKeys = Object.keys;
1581         var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
1582
1583         var originalKeys = Object.keys;
1584
1585         keysShim$1.shim = function shimObjectKeys() {
1586                 if (Object.keys) {
1587                         var keysWorksWithArguments = (function () {
1588                                 // Safari 5.0 bug
1589                                 var args = Object.keys(arguments);
1590                                 return args && args.length === arguments.length;
1591                         }(1, 2));
1592                         if (!keysWorksWithArguments) {
1593                                 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
1594                                         if (isArguments$1(object)) {
1595                                                 return originalKeys(slice.call(object));
1596                                         }
1597                                         return originalKeys(object);
1598                                 };
1599                         }
1600                 } else {
1601                         Object.keys = keysShim$1;
1602                 }
1603                 return Object.keys || keysShim$1;
1604         };
1605
1606         var objectKeys = keysShim$1;
1607
1608         var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1609
1610         var toStr$2 = Object.prototype.toString;
1611         var concat = Array.prototype.concat;
1612         var origDefineProperty = Object.defineProperty;
1613
1614         var isFunction$1 = function (fn) {
1615                 return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
1616         };
1617
1618         var arePropertyDescriptorsSupported = function () {
1619                 var obj = {};
1620                 try {
1621                         origDefineProperty(obj, 'x', { enumerable: false, value: obj });
1622                         // eslint-disable-next-line no-unused-vars, no-restricted-syntax
1623                         for (var _ in obj) { // jscs:ignore disallowUnusedVariables
1624                                 return false;
1625                         }
1626                         return obj.x === obj;
1627                 } catch (e) { /* this is IE 8. */
1628                         return false;
1629                 }
1630         };
1631         var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
1632
1633         var defineProperty$6 = function (object, name, value, predicate) {
1634                 if (name in object && (!isFunction$1(predicate) || !predicate())) {
1635                         return;
1636                 }
1637                 if (supportsDescriptors) {
1638                         origDefineProperty(object, name, {
1639                                 configurable: true,
1640                                 enumerable: false,
1641                                 value: value,
1642                                 writable: true
1643                         });
1644                 } else {
1645                         object[name] = value;
1646                 }
1647         };
1648
1649         var defineProperties$3 = function (object, map) {
1650                 var predicates = arguments.length > 2 ? arguments[2] : {};
1651                 var props = objectKeys(map);
1652                 if (hasSymbols) {
1653                         props = concat.call(props, Object.getOwnPropertySymbols(map));
1654                 }
1655                 for (var i = 0; i < props.length; i += 1) {
1656                         defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
1657                 }
1658         };
1659
1660         defineProperties$3.supportsDescriptors = !!supportsDescriptors;
1661
1662         var defineProperties_1 = defineProperties$3;
1663
1664         /* eslint no-invalid-this: 1 */
1665
1666         var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
1667         var slice$1 = Array.prototype.slice;
1668         var toStr$3 = Object.prototype.toString;
1669         var funcType = '[object Function]';
1670
1671         var implementation$1 = function bind(that) {
1672             var target = this;
1673             if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
1674                 throw new TypeError(ERROR_MESSAGE + target);
1675             }
1676             var args = slice$1.call(arguments, 1);
1677
1678             var bound;
1679             var binder = function () {
1680                 if (this instanceof bound) {
1681                     var result = target.apply(
1682                         this,
1683                         args.concat(slice$1.call(arguments))
1684                     );
1685                     if (Object(result) === result) {
1686                         return result;
1687                     }
1688                     return this;
1689                 } else {
1690                     return target.apply(
1691                         that,
1692                         args.concat(slice$1.call(arguments))
1693                     );
1694                 }
1695             };
1696
1697             var boundLength = Math.max(0, target.length - args.length);
1698             var boundArgs = [];
1699             for (var i = 0; i < boundLength; i++) {
1700                 boundArgs.push('$' + i);
1701             }
1702
1703             bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
1704
1705             if (target.prototype) {
1706                 var Empty = function Empty() {};
1707                 Empty.prototype = target.prototype;
1708                 bound.prototype = new Empty();
1709                 Empty.prototype = null;
1710             }
1711
1712             return bound;
1713         };
1714
1715         var functionBind = Function.prototype.bind || implementation$1;
1716
1717         var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
1718
1719         var isPrimitive = function isPrimitive(value) {
1720                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
1721         };
1722
1723         var fnToStr = Function.prototype.toString;
1724
1725         var constructorRegex = /^\s*class\b/;
1726         var isES6ClassFn = function isES6ClassFunction(value) {
1727                 try {
1728                         var fnStr = fnToStr.call(value);
1729                         return constructorRegex.test(fnStr);
1730                 } catch (e) {
1731                         return false; // not a function
1732                 }
1733         };
1734
1735         var tryFunctionObject = function tryFunctionToStr(value) {
1736                 try {
1737                         if (isES6ClassFn(value)) { return false; }
1738                         fnToStr.call(value);
1739                         return true;
1740                 } catch (e) {
1741                         return false;
1742                 }
1743         };
1744         var toStr$4 = Object.prototype.toString;
1745         var fnClass = '[object Function]';
1746         var genClass = '[object GeneratorFunction]';
1747         var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1748
1749         var isCallable$1 = function isCallable(value) {
1750                 if (!value) { return false; }
1751                 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
1752                 if (typeof value === 'function' && !value.prototype) { return true; }
1753                 if (hasToStringTag) { return tryFunctionObject(value); }
1754                 if (isES6ClassFn(value)) { return false; }
1755                 var strClass = toStr$4.call(value);
1756                 return strClass === fnClass || strClass === genClass;
1757         };
1758
1759         var getDay = Date.prototype.getDay;
1760         var tryDateObject = function tryDateObject(value) {
1761                 try {
1762                         getDay.call(value);
1763                         return true;
1764                 } catch (e) {
1765                         return false;
1766                 }
1767         };
1768
1769         var toStr$5 = Object.prototype.toString;
1770         var dateClass = '[object Date]';
1771         var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1772
1773         var isDateObject = function isDateObject(value) {
1774                 if (typeof value !== 'object' || value === null) { return false; }
1775                 return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
1776         };
1777
1778         /* eslint complexity: [2, 17], max-statements: [2, 33] */
1779         var shams = function hasSymbols() {
1780                 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
1781                 if (typeof Symbol.iterator === 'symbol') { return true; }
1782
1783                 var obj = {};
1784                 var sym = Symbol('test');
1785                 var symObj = Object(sym);
1786                 if (typeof sym === 'string') { return false; }
1787
1788                 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
1789                 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
1790
1791                 // temp disabled per https://github.com/ljharb/object.assign/issues/17
1792                 // if (sym instanceof Symbol) { return false; }
1793                 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
1794                 // if (!(symObj instanceof Symbol)) { return false; }
1795
1796                 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
1797                 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
1798
1799                 var symVal = 42;
1800                 obj[sym] = symVal;
1801                 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
1802                 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
1803
1804                 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
1805
1806                 var syms = Object.getOwnPropertySymbols(obj);
1807                 if (syms.length !== 1 || syms[0] !== sym) { return false; }
1808
1809                 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
1810
1811                 if (typeof Object.getOwnPropertyDescriptor === 'function') {
1812                         var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
1813                         if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
1814                 }
1815
1816                 return true;
1817         };
1818
1819         var origSymbol = commonjsGlobal.Symbol;
1820
1821
1822         var hasSymbols$1 = function hasNativeSymbols() {
1823                 if (typeof origSymbol !== 'function') { return false; }
1824                 if (typeof Symbol !== 'function') { return false; }
1825                 if (typeof origSymbol('foo') !== 'symbol') { return false; }
1826                 if (typeof Symbol('bar') !== 'symbol') { return false; }
1827
1828                 return shams();
1829         };
1830
1831         var isSymbol$1 = createCommonjsModule(function (module) {
1832
1833         var toStr = Object.prototype.toString;
1834         var hasSymbols = hasSymbols$1();
1835
1836         if (hasSymbols) {
1837                 var symToStr = Symbol.prototype.toString;
1838                 var symStringRegex = /^Symbol\(.*\)$/;
1839                 var isSymbolObject = function isRealSymbolObject(value) {
1840                         if (typeof value.valueOf() !== 'symbol') {
1841                                 return false;
1842                         }
1843                         return symStringRegex.test(symToStr.call(value));
1844                 };
1845
1846                 module.exports = function isSymbol(value) {
1847                         if (typeof value === 'symbol') {
1848                                 return true;
1849                         }
1850                         if (toStr.call(value) !== '[object Symbol]') {
1851                                 return false;
1852                         }
1853                         try {
1854                                 return isSymbolObject(value);
1855                         } catch (e) {
1856                                 return false;
1857                         }
1858                 };
1859         } else {
1860
1861                 module.exports = function isSymbol(value) {
1862                         // this environment does not support Symbols.
1863                         return false;
1864                 };
1865         }
1866         });
1867
1868         var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1869
1870
1871
1872
1873
1874
1875         var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
1876                 if (typeof O === 'undefined' || O === null) {
1877                         throw new TypeError('Cannot call method on ' + O);
1878                 }
1879                 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
1880                         throw new TypeError('hint must be "string" or "number"');
1881                 }
1882                 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
1883                 var method, result, i;
1884                 for (i = 0; i < methodNames.length; ++i) {
1885                         method = O[methodNames[i]];
1886                         if (isCallable$1(method)) {
1887                                 result = method.call(O);
1888                                 if (isPrimitive(result)) {
1889                                         return result;
1890                                 }
1891                         }
1892                 }
1893                 throw new TypeError('No default value');
1894         };
1895
1896         var GetMethod = function GetMethod(O, P) {
1897                 var func = O[P];
1898                 if (func !== null && typeof func !== 'undefined') {
1899                         if (!isCallable$1(func)) {
1900                                 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
1901                         }
1902                         return func;
1903                 }
1904                 return void 0;
1905         };
1906
1907         // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
1908         var es2015 = function ToPrimitive(input) {
1909                 if (isPrimitive(input)) {
1910                         return input;
1911                 }
1912                 var hint = 'default';
1913                 if (arguments.length > 1) {
1914                         if (arguments[1] === String) {
1915                                 hint = 'string';
1916                         } else if (arguments[1] === Number) {
1917                                 hint = 'number';
1918                         }
1919                 }
1920
1921                 var exoticToPrim;
1922                 if (hasSymbols$2) {
1923                         if (Symbol.toPrimitive) {
1924                                 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
1925                         } else if (isSymbol$1(input)) {
1926                                 exoticToPrim = Symbol.prototype.valueOf;
1927                         }
1928                 }
1929                 if (typeof exoticToPrim !== 'undefined') {
1930                         var result = exoticToPrim.call(input, hint);
1931                         if (isPrimitive(result)) {
1932                                 return result;
1933                         }
1934                         throw new TypeError('unable to convert exotic object to primitive');
1935                 }
1936                 if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
1937                         hint = 'string';
1938                 }
1939                 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
1940         };
1941
1942         var es6 = es2015;
1943
1944         /* globals
1945                 Set,
1946                 Map,
1947                 WeakSet,
1948                 WeakMap,
1949
1950                 Promise,
1951
1952                 Symbol,
1953                 Proxy,
1954
1955                 Atomics,
1956                 SharedArrayBuffer,
1957
1958                 ArrayBuffer,
1959                 DataView,
1960                 Uint8Array,
1961                 Float32Array,
1962                 Float64Array,
1963                 Int8Array,
1964                 Int16Array,
1965                 Int32Array,
1966                 Uint8ClampedArray,
1967                 Uint16Array,
1968                 Uint32Array,
1969         */
1970
1971         var undefined$1; // eslint-disable-line no-shadow-restricted-names
1972
1973         var ThrowTypeError = Object.getOwnPropertyDescriptor
1974                 ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
1975                 : function () { throw new TypeError(); };
1976
1977         var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1978
1979         var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
1980         var generatorFunction = undefined$1;
1981         var asyncFunction = undefined$1;
1982         var asyncGenFunction = undefined$1;
1983
1984         var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
1985
1986         var INTRINSICS = {
1987                 '$ %Array%': Array,
1988                 '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
1989                 '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
1990                 '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
1991                 '$ %ArrayPrototype%': Array.prototype,
1992                 '$ %ArrayProto_entries%': Array.prototype.entries,
1993                 '$ %ArrayProto_forEach%': Array.prototype.forEach,
1994                 '$ %ArrayProto_keys%': Array.prototype.keys,
1995                 '$ %ArrayProto_values%': Array.prototype.values,
1996                 '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
1997                 '$ %AsyncFunction%': asyncFunction,
1998                 '$ %AsyncFunctionPrototype%': undefined$1,
1999                 '$ %AsyncGenerator%': undefined$1,
2000                 '$ %AsyncGeneratorFunction%': asyncGenFunction,
2001                 '$ %AsyncGeneratorPrototype%': undefined$1,
2002                 '$ %AsyncIteratorPrototype%': undefined$1,
2003                 '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
2004                 '$ %Boolean%': Boolean,
2005                 '$ %BooleanPrototype%': Boolean.prototype,
2006                 '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
2007                 '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
2008                 '$ %Date%': Date,
2009                 '$ %DatePrototype%': Date.prototype,
2010                 '$ %decodeURI%': decodeURI,
2011                 '$ %decodeURIComponent%': decodeURIComponent,
2012                 '$ %encodeURI%': encodeURI,
2013                 '$ %encodeURIComponent%': encodeURIComponent,
2014                 '$ %Error%': Error,
2015                 '$ %ErrorPrototype%': Error.prototype,
2016                 '$ %eval%': eval, // eslint-disable-line no-eval
2017                 '$ %EvalError%': EvalError,
2018                 '$ %EvalErrorPrototype%': EvalError.prototype,
2019                 '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
2020                 '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
2021                 '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
2022                 '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
2023                 '$ %Function%': Function,
2024                 '$ %FunctionPrototype%': Function.prototype,
2025                 '$ %Generator%': undefined$1,
2026                 '$ %GeneratorFunction%': generatorFunction,
2027                 '$ %GeneratorPrototype%': undefined$1,
2028                 '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
2029                 '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2030                 '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
2031                 '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2032                 '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
2033                 '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
2034                 '$ %isFinite%': isFinite,
2035                 '$ %isNaN%': isNaN,
2036                 '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
2037                 '$ %JSON%': JSON,
2038                 '$ %JSONParse%': JSON.parse,
2039                 '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
2040                 '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
2041                 '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
2042                 '$ %Math%': Math,
2043                 '$ %Number%': Number,
2044                 '$ %NumberPrototype%': Number.prototype,
2045                 '$ %Object%': Object,
2046                 '$ %ObjectPrototype%': Object.prototype,
2047                 '$ %ObjProto_toString%': Object.prototype.toString,
2048                 '$ %ObjProto_valueOf%': Object.prototype.valueOf,
2049                 '$ %parseFloat%': parseFloat,
2050                 '$ %parseInt%': parseInt,
2051                 '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
2052                 '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
2053                 '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
2054                 '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
2055                 '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
2056                 '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
2057                 '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
2058                 '$ %RangeError%': RangeError,
2059                 '$ %RangeErrorPrototype%': RangeError.prototype,
2060                 '$ %ReferenceError%': ReferenceError,
2061                 '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
2062                 '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
2063                 '$ %RegExp%': RegExp,
2064                 '$ %RegExpPrototype%': RegExp.prototype,
2065                 '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
2066                 '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
2067                 '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
2068                 '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
2069                 '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
2070                 '$ %String%': String,
2071                 '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
2072                 '$ %StringPrototype%': String.prototype,
2073                 '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
2074                 '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,
2075                 '$ %SyntaxError%': SyntaxError,
2076                 '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
2077                 '$ %ThrowTypeError%': ThrowTypeError,
2078                 '$ %TypedArray%': TypedArray,
2079                 '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1,
2080                 '$ %TypeError%': TypeError,
2081                 '$ %TypeErrorPrototype%': TypeError.prototype,
2082                 '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array,
2083                 '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype,
2084                 '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray,
2085                 '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype,
2086                 '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array,
2087                 '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype,
2088                 '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array,
2089                 '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype,
2090                 '$ %URIError%': URIError,
2091                 '$ %URIErrorPrototype%': URIError.prototype,
2092                 '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap,
2093                 '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype,
2094                 '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet,
2095                 '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype
2096         };
2097
2098         var GetIntrinsic = function GetIntrinsic(name, allowMissing) {
2099                 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2100                         throw new TypeError('"allowMissing" argument must be a boolean');
2101                 }
2102
2103                 var key = '$ ' + name;
2104                 if (!(key in INTRINSICS)) {
2105                         throw new SyntaxError('intrinsic ' + name + ' does not exist!');
2106                 }
2107
2108                 // istanbul ignore if // hopefully this is impossible to test :-)
2109                 if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
2110                         throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2111                 }
2112                 return INTRINSICS[key];
2113         };
2114
2115         var $TypeError = GetIntrinsic('%TypeError%');
2116         var $SyntaxError = GetIntrinsic('%SyntaxError%');
2117
2118
2119
2120         var predicates = {
2121           // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2122           'Property Descriptor': function isPropertyDescriptor(ES, Desc) {
2123             if (ES.Type(Desc) !== 'Object') {
2124               return false;
2125             }
2126             var allowed = {
2127               '[[Configurable]]': true,
2128               '[[Enumerable]]': true,
2129               '[[Get]]': true,
2130               '[[Set]]': true,
2131               '[[Value]]': true,
2132               '[[Writable]]': true
2133             };
2134
2135             for (var key in Desc) { // eslint-disable-line
2136               if (src(Desc, key) && !allowed[key]) {
2137                 return false;
2138               }
2139             }
2140
2141             var isData = src(Desc, '[[Value]]');
2142             var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2143             if (isData && IsAccessor) {
2144               throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
2145             }
2146             return true;
2147           }
2148         };
2149
2150         var assertRecord = function assertRecord(ES, recordType, argumentName, value) {
2151           var predicate = predicates[recordType];
2152           if (typeof predicate !== 'function') {
2153             throw new $SyntaxError('unknown record type: ' + recordType);
2154           }
2155           if (!predicate(ES, value)) {
2156             throw new $TypeError(argumentName + ' must be a ' + recordType);
2157           }
2158           console.log(predicate(ES, value), value);
2159         };
2160
2161         var _isNaN = Number.isNaN || function isNaN(a) {
2162                 return a !== a;
2163         };
2164
2165         var $isNaN = Number.isNaN || function (a) { return a !== a; };
2166
2167         var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
2168
2169         var has$1 = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
2170
2171         var $assign = Object.assign;
2172
2173         var assign$1 = function assign(target, source) {
2174                 if ($assign) {
2175                         return $assign(target, source);
2176                 }
2177
2178                 for (var key in source) {
2179                         if (has$1(source, key)) {
2180                                 target[key] = source[key];
2181                         }
2182                 }
2183                 return target;
2184         };
2185
2186         var sign$1 = function sign(number) {
2187                 return number >= 0 ? 1 : -1;
2188         };
2189
2190         var mod = function mod(number, modulo) {
2191                 var remain = number % modulo;
2192                 return Math.floor(remain >= 0 ? remain : remain + modulo);
2193         };
2194
2195         var isPrimitive$1 = function isPrimitive(value) {
2196                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2197         };
2198
2199         var toStr$6 = Object.prototype.toString;
2200
2201
2202
2203
2204
2205         // http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
2206         var ES5internalSlots = {
2207                 '[[DefaultValue]]': function (O) {
2208                         var actualHint;
2209                         if (arguments.length > 1) {
2210                                 actualHint = arguments[1];
2211                         } else {
2212                                 actualHint = toStr$6.call(O) === '[object Date]' ? String : Number;
2213                         }
2214
2215                         if (actualHint === String || actualHint === Number) {
2216                                 var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2217                                 var value, i;
2218                                 for (i = 0; i < methods.length; ++i) {
2219                                         if (isCallable$1(O[methods[i]])) {
2220                                                 value = O[methods[i]]();
2221                                                 if (isPrimitive(value)) {
2222                                                         return value;
2223                                                 }
2224                                         }
2225                                 }
2226                                 throw new TypeError('No default value');
2227                         }
2228                         throw new TypeError('invalid [[DefaultValue]] hint supplied');
2229                 }
2230         };
2231
2232         // http://ecma-international.org/ecma-262/5.1/#sec-9.1
2233         var es5 = function ToPrimitive(input) {
2234                 if (isPrimitive(input)) {
2235                         return input;
2236                 }
2237                 if (arguments.length > 1) {
2238                         return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
2239                 }
2240                 return ES5internalSlots['[[DefaultValue]]'](input);
2241         };
2242
2243         var $Object = GetIntrinsic('%Object%');
2244         var $TypeError$1 = GetIntrinsic('%TypeError%');
2245         var $String = GetIntrinsic('%String%');
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259         // https://es5.github.io/#x9
2260         var ES5 = {
2261                 ToPrimitive: es5,
2262
2263                 ToBoolean: function ToBoolean(value) {
2264                         return !!value;
2265                 },
2266                 ToNumber: function ToNumber(value) {
2267                         return +value; // eslint-disable-line no-implicit-coercion
2268                 },
2269                 ToInteger: function ToInteger(value) {
2270                         var number = this.ToNumber(value);
2271                         if (_isNaN(number)) { return 0; }
2272                         if (number === 0 || !_isFinite(number)) { return number; }
2273                         return sign$1(number) * Math.floor(Math.abs(number));
2274                 },
2275                 ToInt32: function ToInt32(x) {
2276                         return this.ToNumber(x) >> 0;
2277                 },
2278                 ToUint32: function ToUint32(x) {
2279                         return this.ToNumber(x) >>> 0;
2280                 },
2281                 ToUint16: function ToUint16(value) {
2282                         var number = this.ToNumber(value);
2283                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2284                         var posInt = sign$1(number) * Math.floor(Math.abs(number));
2285                         return mod(posInt, 0x10000);
2286                 },
2287                 ToString: function ToString(value) {
2288                         return $String(value);
2289                 },
2290                 ToObject: function ToObject(value) {
2291                         this.CheckObjectCoercible(value);
2292                         return $Object(value);
2293                 },
2294                 CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
2295                         /* jshint eqnull:true */
2296                         if (value == null) {
2297                                 throw new $TypeError$1(optMessage || 'Cannot call method on ' + value);
2298                         }
2299                         return value;
2300                 },
2301                 IsCallable: isCallable$1,
2302                 SameValue: function SameValue(x, y) {
2303                         if (x === y) { // 0 === -0, but they are not identical.
2304                                 if (x === 0) { return 1 / x === 1 / y; }
2305                                 return true;
2306                         }
2307                         return _isNaN(x) && _isNaN(y);
2308                 },
2309
2310                 // https://www.ecma-international.org/ecma-262/5.1/#sec-8
2311                 Type: function Type(x) {
2312                         if (x === null) {
2313                                 return 'Null';
2314                         }
2315                         if (typeof x === 'undefined') {
2316                                 return 'Undefined';
2317                         }
2318                         if (typeof x === 'function' || typeof x === 'object') {
2319                                 return 'Object';
2320                         }
2321                         if (typeof x === 'number') {
2322                                 return 'Number';
2323                         }
2324                         if (typeof x === 'boolean') {
2325                                 return 'Boolean';
2326                         }
2327                         if (typeof x === 'string') {
2328                                 return 'String';
2329                         }
2330                 },
2331
2332                 // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2333                 IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
2334                         if (this.Type(Desc) !== 'Object') {
2335                                 return false;
2336                         }
2337                         var allowed = {
2338                                 '[[Configurable]]': true,
2339                                 '[[Enumerable]]': true,
2340                                 '[[Get]]': true,
2341                                 '[[Set]]': true,
2342                                 '[[Value]]': true,
2343                                 '[[Writable]]': true
2344                         };
2345
2346                         for (var key in Desc) { // eslint-disable-line
2347                                 if (src(Desc, key) && !allowed[key]) {
2348                                         return false;
2349                                 }
2350                         }
2351
2352                         var isData = src(Desc, '[[Value]]');
2353                         var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2354                         if (isData && IsAccessor) {
2355                                 throw new $TypeError$1('Property Descriptors may not be both accessor and data descriptors');
2356                         }
2357                         return true;
2358                 },
2359
2360                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
2361                 IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
2362                         if (typeof Desc === 'undefined') {
2363                                 return false;
2364                         }
2365
2366                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2367
2368                         if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) {
2369                                 return false;
2370                         }
2371
2372                         return true;
2373                 },
2374
2375                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
2376                 IsDataDescriptor: function IsDataDescriptor(Desc) {
2377                         if (typeof Desc === 'undefined') {
2378                                 return false;
2379                         }
2380
2381                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2382
2383                         if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) {
2384                                 return false;
2385                         }
2386
2387                         return true;
2388                 },
2389
2390                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
2391                 IsGenericDescriptor: function IsGenericDescriptor(Desc) {
2392                         if (typeof Desc === 'undefined') {
2393                                 return false;
2394                         }
2395
2396                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2397
2398                         if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
2399                                 return true;
2400                         }
2401
2402                         return false;
2403                 },
2404
2405                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
2406                 FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
2407                         if (typeof Desc === 'undefined') {
2408                                 return Desc;
2409                         }
2410
2411                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2412
2413                         if (this.IsDataDescriptor(Desc)) {
2414                                 return {
2415                                         value: Desc['[[Value]]'],
2416                                         writable: !!Desc['[[Writable]]'],
2417                                         enumerable: !!Desc['[[Enumerable]]'],
2418                                         configurable: !!Desc['[[Configurable]]']
2419                                 };
2420                         } else if (this.IsAccessorDescriptor(Desc)) {
2421                                 return {
2422                                         get: Desc['[[Get]]'],
2423                                         set: Desc['[[Set]]'],
2424                                         enumerable: !!Desc['[[Enumerable]]'],
2425                                         configurable: !!Desc['[[Configurable]]']
2426                                 };
2427                         } else {
2428                                 throw new $TypeError$1('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
2429                         }
2430                 },
2431
2432                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
2433                 ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
2434                         if (this.Type(Obj) !== 'Object') {
2435                                 throw new $TypeError$1('ToPropertyDescriptor requires an object');
2436                         }
2437
2438                         var desc = {};
2439                         if (src(Obj, 'enumerable')) {
2440                                 desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
2441                         }
2442                         if (src(Obj, 'configurable')) {
2443                                 desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
2444                         }
2445                         if (src(Obj, 'value')) {
2446                                 desc['[[Value]]'] = Obj.value;
2447                         }
2448                         if (src(Obj, 'writable')) {
2449                                 desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
2450                         }
2451                         if (src(Obj, 'get')) {
2452                                 var getter = Obj.get;
2453                                 if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
2454                                         throw new TypeError('getter must be a function');
2455                                 }
2456                                 desc['[[Get]]'] = getter;
2457                         }
2458                         if (src(Obj, 'set')) {
2459                                 var setter = Obj.set;
2460                                 if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
2461                                         throw new $TypeError$1('setter must be a function');
2462                                 }
2463                                 desc['[[Set]]'] = setter;
2464                         }
2465
2466                         if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) {
2467                                 throw new $TypeError$1('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
2468                         }
2469                         return desc;
2470                 }
2471         };
2472
2473         var es5$1 = ES5;
2474
2475         var regexExec = RegExp.prototype.exec;
2476         var gOPD = Object.getOwnPropertyDescriptor;
2477
2478         var tryRegexExecCall = function tryRegexExec(value) {
2479                 try {
2480                         var lastIndex = value.lastIndex;
2481                         value.lastIndex = 0;
2482
2483                         regexExec.call(value);
2484                         return true;
2485                 } catch (e) {
2486                         return false;
2487                 } finally {
2488                         value.lastIndex = lastIndex;
2489                 }
2490         };
2491         var toStr$7 = Object.prototype.toString;
2492         var regexClass = '[object RegExp]';
2493         var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
2494
2495         var isRegex = function isRegex(value) {
2496                 if (!value || typeof value !== 'object') {
2497                         return false;
2498                 }
2499                 if (!hasToStringTag$2) {
2500                         return toStr$7.call(value) === regexClass;
2501                 }
2502
2503                 var descriptor = gOPD(value, 'lastIndex');
2504                 var hasLastIndexDataProperty = descriptor && src(descriptor, 'value');
2505                 if (!hasLastIndexDataProperty) {
2506                         return false;
2507                 }
2508
2509                 return tryRegexExecCall(value);
2510         };
2511
2512         var $TypeError$2 = GetIntrinsic('%TypeError%');
2513         var $SyntaxError$1 = GetIntrinsic('%SyntaxError%');
2514         var $Array = GetIntrinsic('%Array%');
2515         var $String$1 = GetIntrinsic('%String%');
2516         var $Object$1 = GetIntrinsic('%Object%');
2517         var $Number = GetIntrinsic('%Number%');
2518         var $Symbol = GetIntrinsic('%Symbol%', true);
2519         var $RegExp = GetIntrinsic('%RegExp%');
2520
2521         var hasSymbols$4 = !!$Symbol;
2522
2523
2524
2525
2526         var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
2527
2528
2529
2530
2531
2532         var parseInteger = parseInt;
2533
2534         var arraySlice = functionBind.call(Function.call, $Array.prototype.slice);
2535         var strSlice = functionBind.call(Function.call, $String$1.prototype.slice);
2536         var isBinary = functionBind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
2537         var isOctal = functionBind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
2538         var regexExec$1 = functionBind.call(Function.call, $RegExp.prototype.exec);
2539         var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
2540         var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
2541         var hasNonWS = functionBind.call(Function.call, $RegExp.prototype.test, nonWSregex);
2542         var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
2543         var isInvalidHexLiteral = functionBind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
2544         var $charCodeAt = functionBind.call(Function.call, $String$1.prototype.charCodeAt);
2545
2546         var toStr$8 = functionBind.call(Function.call, Object.prototype.toString);
2547
2548         var $NumberValueOf = functionBind.call(Function.call, GetIntrinsic('%NumberPrototype%').valueOf);
2549         var $BooleanValueOf = functionBind.call(Function.call, GetIntrinsic('%BooleanPrototype%').valueOf);
2550         var $StringValueOf = functionBind.call(Function.call, GetIntrinsic('%StringPrototype%').valueOf);
2551         var $DateValueOf = functionBind.call(Function.call, GetIntrinsic('%DatePrototype%').valueOf);
2552
2553         var $floor = Math.floor;
2554         var $abs = Math.abs;
2555
2556         var $ObjectCreate = Object.create;
2557         var $gOPD = $Object$1.getOwnPropertyDescriptor;
2558
2559         var $isExtensible = $Object$1.isExtensible;
2560
2561         var $defineProperty = $Object$1.defineProperty;
2562
2563         // whitespace from: http://es5.github.io/#x15.5.4.20
2564         // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
2565         var ws = [
2566                 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
2567                 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
2568                 '\u2029\uFEFF'
2569         ].join('');
2570         var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
2571         var replace = functionBind.call(Function.call, $String$1.prototype.replace);
2572         var trim = function (value) {
2573                 return replace(value, trimRegex, '');
2574         };
2575
2576
2577
2578
2579
2580         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
2581         var ES6 = assign$1(assign$1({}, es5$1), {
2582
2583                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
2584                 Call: function Call(F, V) {
2585                         var args = arguments.length > 2 ? arguments[2] : [];
2586                         if (!this.IsCallable(F)) {
2587                                 throw new $TypeError$2(F + ' is not a function');
2588                         }
2589                         return F.apply(V, args);
2590                 },
2591
2592                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
2593                 ToPrimitive: es6,
2594
2595                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
2596                 // ToBoolean: ES5.ToBoolean,
2597
2598                 // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
2599                 ToNumber: function ToNumber(argument) {
2600                         var value = isPrimitive$1(argument) ? argument : es6(argument, $Number);
2601                         if (typeof value === 'symbol') {
2602                                 throw new $TypeError$2('Cannot convert a Symbol value to a number');
2603                         }
2604                         if (typeof value === 'string') {
2605                                 if (isBinary(value)) {
2606                                         return this.ToNumber(parseInteger(strSlice(value, 2), 2));
2607                                 } else if (isOctal(value)) {
2608                                         return this.ToNumber(parseInteger(strSlice(value, 2), 8));
2609                                 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
2610                                         return NaN;
2611                                 } else {
2612                                         var trimmed = trim(value);
2613                                         if (trimmed !== value) {
2614                                                 return this.ToNumber(trimmed);
2615                                         }
2616                                 }
2617                         }
2618                         return $Number(value);
2619                 },
2620
2621                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
2622                 // ToInteger: ES5.ToNumber,
2623
2624                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
2625                 // ToInt32: ES5.ToInt32,
2626
2627                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
2628                 // ToUint32: ES5.ToUint32,
2629
2630                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
2631                 ToInt16: function ToInt16(argument) {
2632                         var int16bit = this.ToUint16(argument);
2633                         return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
2634                 },
2635
2636                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
2637                 // ToUint16: ES5.ToUint16,
2638
2639                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
2640                 ToInt8: function ToInt8(argument) {
2641                         var int8bit = this.ToUint8(argument);
2642                         return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
2643                 },
2644
2645                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
2646                 ToUint8: function ToUint8(argument) {
2647                         var number = this.ToNumber(argument);
2648                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2649                         var posInt = sign$1(number) * $floor($abs(number));
2650                         return mod(posInt, 0x100);
2651                 },
2652
2653                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
2654                 ToUint8Clamp: function ToUint8Clamp(argument) {
2655                         var number = this.ToNumber(argument);
2656                         if (_isNaN(number) || number <= 0) { return 0; }
2657                         if (number >= 0xFF) { return 0xFF; }
2658                         var f = $floor(argument);
2659                         if (f + 0.5 < number) { return f + 1; }
2660                         if (number < f + 0.5) { return f; }
2661                         if (f % 2 !== 0) { return f + 1; }
2662                         return f;
2663                 },
2664
2665                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
2666                 ToString: function ToString(argument) {
2667                         if (typeof argument === 'symbol') {
2668                                 throw new $TypeError$2('Cannot convert a Symbol value to a string');
2669                         }
2670                         return $String$1(argument);
2671                 },
2672
2673                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
2674                 ToObject: function ToObject(value) {
2675                         this.RequireObjectCoercible(value);
2676                         return $Object$1(value);
2677                 },
2678
2679                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
2680                 ToPropertyKey: function ToPropertyKey(argument) {
2681                         var key = this.ToPrimitive(argument, $String$1);
2682                         return typeof key === 'symbol' ? key : this.ToString(key);
2683                 },
2684
2685                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
2686                 ToLength: function ToLength(argument) {
2687                         var len = this.ToInteger(argument);
2688                         if (len <= 0) { return 0; } // includes converting -0 to +0
2689                         if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
2690                         return len;
2691                 },
2692
2693                 // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
2694                 CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
2695                         if (toStr$8(argument) !== '[object String]') {
2696                                 throw new $TypeError$2('must be a string');
2697                         }
2698                         if (argument === '-0') { return -0; }
2699                         var n = this.ToNumber(argument);
2700                         if (this.SameValue(this.ToString(n), argument)) { return n; }
2701                         return void 0;
2702                 },
2703
2704                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
2705                 RequireObjectCoercible: es5$1.CheckObjectCoercible,
2706
2707                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
2708                 IsArray: $Array.isArray || function IsArray(argument) {
2709                         return toStr$8(argument) === '[object Array]';
2710                 },
2711
2712                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
2713                 // IsCallable: ES5.IsCallable,
2714
2715                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
2716                 IsConstructor: function IsConstructor(argument) {
2717                         return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
2718                 },
2719
2720                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
2721                 IsExtensible: Object.preventExtensions
2722                         ? function IsExtensible(obj) {
2723                                 if (isPrimitive$1(obj)) {
2724                                         return false;
2725                                 }
2726                                 return $isExtensible(obj);
2727                         }
2728                         : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
2729
2730                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
2731                 IsInteger: function IsInteger(argument) {
2732                         if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) {
2733                                 return false;
2734                         }
2735                         var abs = $abs(argument);
2736                         return $floor(abs) === abs;
2737                 },
2738
2739                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
2740                 IsPropertyKey: function IsPropertyKey(argument) {
2741                         return typeof argument === 'string' || typeof argument === 'symbol';
2742                 },
2743
2744                 // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
2745                 IsRegExp: function IsRegExp(argument) {
2746                         if (!argument || typeof argument !== 'object') {
2747                                 return false;
2748                         }
2749                         if (hasSymbols$4) {
2750                                 var isRegExp = argument[$Symbol.match];
2751                                 if (typeof isRegExp !== 'undefined') {
2752                                         return es5$1.ToBoolean(isRegExp);
2753                                 }
2754                         }
2755                         return isRegex(argument);
2756                 },
2757
2758                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
2759                 // SameValue: ES5.SameValue,
2760
2761                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
2762                 SameValueZero: function SameValueZero(x, y) {
2763                         return (x === y) || (_isNaN(x) && _isNaN(y));
2764                 },
2765
2766                 /**
2767                  * 7.3.2 GetV (V, P)
2768                  * 1. Assert: IsPropertyKey(P) is true.
2769                  * 2. Let O be ToObject(V).
2770                  * 3. ReturnIfAbrupt(O).
2771                  * 4. Return O.[[Get]](P, V).
2772                  */
2773                 GetV: function GetV(V, P) {
2774                         // 7.3.2.1
2775                         if (!this.IsPropertyKey(P)) {
2776                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2777                         }
2778
2779                         // 7.3.2.2-3
2780                         var O = this.ToObject(V);
2781
2782                         // 7.3.2.4
2783                         return O[P];
2784                 },
2785
2786                 /**
2787                  * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
2788                  * 1. Assert: IsPropertyKey(P) is true.
2789                  * 2. Let func be GetV(O, P).
2790                  * 3. ReturnIfAbrupt(func).
2791                  * 4. If func is either undefined or null, return undefined.
2792                  * 5. If IsCallable(func) is false, throw a TypeError exception.
2793                  * 6. Return func.
2794                  */
2795                 GetMethod: function GetMethod(O, P) {
2796                         // 7.3.9.1
2797                         if (!this.IsPropertyKey(P)) {
2798                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2799                         }
2800
2801                         // 7.3.9.2
2802                         var func = this.GetV(O, P);
2803
2804                         // 7.3.9.4
2805                         if (func == null) {
2806                                 return void 0;
2807                         }
2808
2809                         // 7.3.9.5
2810                         if (!this.IsCallable(func)) {
2811                                 throw new $TypeError$2(P + 'is not a function');
2812                         }
2813
2814                         // 7.3.9.6
2815                         return func;
2816                 },
2817
2818                 /**
2819                  * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
2820                  * 1. Assert: Type(O) is Object.
2821                  * 2. Assert: IsPropertyKey(P) is true.
2822                  * 3. Return O.[[Get]](P, O).
2823                  */
2824                 Get: function Get(O, P) {
2825                         // 7.3.1.1
2826                         if (this.Type(O) !== 'Object') {
2827                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2828                         }
2829                         // 7.3.1.2
2830                         if (!this.IsPropertyKey(P)) {
2831                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2832                         }
2833                         // 7.3.1.3
2834                         return O[P];
2835                 },
2836
2837                 Type: function Type(x) {
2838                         if (typeof x === 'symbol') {
2839                                 return 'Symbol';
2840                         }
2841                         return es5$1.Type(x);
2842                 },
2843
2844                 // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
2845                 SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
2846                         if (this.Type(O) !== 'Object') {
2847                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2848                         }
2849                         var C = O.constructor;
2850                         if (typeof C === 'undefined') {
2851                                 return defaultConstructor;
2852                         }
2853                         if (this.Type(C) !== 'Object') {
2854                                 throw new $TypeError$2('O.constructor is not an Object');
2855                         }
2856                         var S = hasSymbols$4 && $Symbol.species ? C[$Symbol.species] : void 0;
2857                         if (S == null) {
2858                                 return defaultConstructor;
2859                         }
2860                         if (this.IsConstructor(S)) {
2861                                 return S;
2862                         }
2863                         throw new $TypeError$2('no constructor found');
2864                 },
2865
2866                 // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
2867                 CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
2868                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2869
2870                         if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
2871                                 if (!src(Desc, '[[Value]]')) {
2872                                         Desc['[[Value]]'] = void 0;
2873                                 }
2874                                 if (!src(Desc, '[[Writable]]')) {
2875                                         Desc['[[Writable]]'] = false;
2876                                 }
2877                         } else {
2878                                 if (!src(Desc, '[[Get]]')) {
2879                                         Desc['[[Get]]'] = void 0;
2880                                 }
2881                                 if (!src(Desc, '[[Set]]')) {
2882                                         Desc['[[Set]]'] = void 0;
2883                                 }
2884                         }
2885                         if (!src(Desc, '[[Enumerable]]')) {
2886                                 Desc['[[Enumerable]]'] = false;
2887                         }
2888                         if (!src(Desc, '[[Configurable]]')) {
2889                                 Desc['[[Configurable]]'] = false;
2890                         }
2891                         return Desc;
2892                 },
2893
2894                 // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
2895                 Set: function Set(O, P, V, Throw) {
2896                         if (this.Type(O) !== 'Object') {
2897                                 throw new $TypeError$2('O must be an Object');
2898                         }
2899                         if (!this.IsPropertyKey(P)) {
2900                                 throw new $TypeError$2('P must be a Property Key');
2901                         }
2902                         if (this.Type(Throw) !== 'Boolean') {
2903                                 throw new $TypeError$2('Throw must be a Boolean');
2904                         }
2905                         if (Throw) {
2906                                 O[P] = V;
2907                                 return true;
2908                         } else {
2909                                 try {
2910                                         O[P] = V;
2911                                 } catch (e) {
2912                                         return false;
2913                                 }
2914                         }
2915                 },
2916
2917                 // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
2918                 HasOwnProperty: function HasOwnProperty(O, P) {
2919                         if (this.Type(O) !== 'Object') {
2920                                 throw new $TypeError$2('O must be an Object');
2921                         }
2922                         if (!this.IsPropertyKey(P)) {
2923                                 throw new $TypeError$2('P must be a Property Key');
2924                         }
2925                         return src(O, P);
2926                 },
2927
2928                 // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
2929                 HasProperty: function HasProperty(O, P) {
2930                         if (this.Type(O) !== 'Object') {
2931                                 throw new $TypeError$2('O must be an Object');
2932                         }
2933                         if (!this.IsPropertyKey(P)) {
2934                                 throw new $TypeError$2('P must be a Property Key');
2935                         }
2936                         return P in O;
2937                 },
2938
2939                 // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
2940                 IsConcatSpreadable: function IsConcatSpreadable(O) {
2941                         if (this.Type(O) !== 'Object') {
2942                                 return false;
2943                         }
2944                         if (hasSymbols$4 && typeof $Symbol.isConcatSpreadable === 'symbol') {
2945                                 var spreadable = this.Get(O, Symbol.isConcatSpreadable);
2946                                 if (typeof spreadable !== 'undefined') {
2947                                         return this.ToBoolean(spreadable);
2948                                 }
2949                         }
2950                         return this.IsArray(O);
2951                 },
2952
2953                 // https://ecma-international.org/ecma-262/6.0/#sec-invoke
2954                 Invoke: function Invoke(O, P) {
2955                         if (!this.IsPropertyKey(P)) {
2956                                 throw new $TypeError$2('P must be a Property Key');
2957                         }
2958                         var argumentsList = arraySlice(arguments, 2);
2959                         var func = this.GetV(O, P);
2960                         return this.Call(func, O, argumentsList);
2961                 },
2962
2963                 // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
2964                 GetIterator: function GetIterator(obj, method) {
2965                         if (!hasSymbols$4) {
2966                                 throw new SyntaxError('ES.GetIterator depends on native iterator support.');
2967                         }
2968
2969                         var actualMethod = method;
2970                         if (arguments.length < 2) {
2971                                 actualMethod = this.GetMethod(obj, $Symbol.iterator);
2972                         }
2973                         var iterator = this.Call(actualMethod, obj);
2974                         if (this.Type(iterator) !== 'Object') {
2975                                 throw new $TypeError$2('iterator must return an object');
2976                         }
2977
2978                         return iterator;
2979                 },
2980
2981                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
2982                 IteratorNext: function IteratorNext(iterator, value) {
2983                         var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
2984                         if (this.Type(result) !== 'Object') {
2985                                 throw new $TypeError$2('iterator next must return an object');
2986                         }
2987                         return result;
2988                 },
2989
2990                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
2991                 IteratorComplete: function IteratorComplete(iterResult) {
2992                         if (this.Type(iterResult) !== 'Object') {
2993                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2994                         }
2995                         return this.ToBoolean(this.Get(iterResult, 'done'));
2996                 },
2997
2998                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
2999                 IteratorValue: function IteratorValue(iterResult) {
3000                         if (this.Type(iterResult) !== 'Object') {
3001                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
3002                         }
3003                         return this.Get(iterResult, 'value');
3004                 },
3005
3006                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
3007                 IteratorStep: function IteratorStep(iterator) {
3008                         var result = this.IteratorNext(iterator);
3009                         var done = this.IteratorComplete(result);
3010                         return done === true ? false : result;
3011                 },
3012
3013                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
3014                 IteratorClose: function IteratorClose(iterator, completion) {
3015                         if (this.Type(iterator) !== 'Object') {
3016                                 throw new $TypeError$2('Assertion failed: Type(iterator) is not Object');
3017                         }
3018                         if (!this.IsCallable(completion)) {
3019                                 throw new $TypeError$2('Assertion failed: completion is not a thunk for a Completion Record');
3020                         }
3021                         var completionThunk = completion;
3022
3023                         var iteratorReturn = this.GetMethod(iterator, 'return');
3024
3025                         if (typeof iteratorReturn === 'undefined') {
3026                                 return completionThunk();
3027                         }
3028
3029                         var completionRecord;
3030                         try {
3031                                 var innerResult = this.Call(iteratorReturn, iterator, []);
3032                         } catch (e) {
3033                                 // if we hit here, then "e" is the innerResult completion that needs re-throwing
3034
3035                                 // if the completion is of type "throw", this will throw.
3036                                 completionRecord = completionThunk();
3037                                 completionThunk = null; // ensure it's not called twice.
3038
3039                                 // if not, then return the innerResult completion
3040                                 throw e;
3041                         }
3042                         completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
3043                         completionThunk = null; // ensure it's not called twice.
3044
3045                         if (this.Type(innerResult) !== 'Object') {
3046                                 throw new $TypeError$2('iterator .return must return an object');
3047                         }
3048
3049                         return completionRecord;
3050                 },
3051
3052                 // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
3053                 CreateIterResultObject: function CreateIterResultObject(value, done) {
3054                         if (this.Type(done) !== 'Boolean') {
3055                                 throw new $TypeError$2('Assertion failed: Type(done) is not Boolean');
3056                         }
3057                         return {
3058                                 value: value,
3059                                 done: done
3060                         };
3061                 },
3062
3063                 // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
3064                 RegExpExec: function RegExpExec(R, S) {
3065                         if (this.Type(R) !== 'Object') {
3066                                 throw new $TypeError$2('R must be an Object');
3067                         }
3068                         if (this.Type(S) !== 'String') {
3069                                 throw new $TypeError$2('S must be a String');
3070                         }
3071                         var exec = this.Get(R, 'exec');
3072                         if (this.IsCallable(exec)) {
3073                                 var result = this.Call(exec, R, [S]);
3074                                 if (result === null || this.Type(result) === 'Object') {
3075                                         return result;
3076                                 }
3077                                 throw new $TypeError$2('"exec" method must return `null` or an Object');
3078                         }
3079                         return regexExec$1(R, S);
3080                 },
3081
3082                 // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
3083                 ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
3084                         if (!this.IsInteger(length) || length < 0) {
3085                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0');
3086                         }
3087                         var len = length === 0 ? 0 : length;
3088                         var C;
3089                         var isArray = this.IsArray(originalArray);
3090                         if (isArray) {
3091                                 C = this.Get(originalArray, 'constructor');
3092                                 // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
3093                                 // if (this.IsConstructor(C)) {
3094                                 //      if C is another realm's Array, C = undefined
3095                                 //      Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
3096                                 // }
3097                                 if (this.Type(C) === 'Object' && hasSymbols$4 && $Symbol.species) {
3098                                         C = this.Get(C, $Symbol.species);
3099                                         if (C === null) {
3100                                                 C = void 0;
3101                                         }
3102                                 }
3103                         }
3104                         if (typeof C === 'undefined') {
3105                                 return $Array(len);
3106                         }
3107                         if (!this.IsConstructor(C)) {
3108                                 throw new $TypeError$2('C must be a constructor');
3109                         }
3110                         return new C(len); // this.Construct(C, len);
3111                 },
3112
3113                 CreateDataProperty: function CreateDataProperty(O, P, V) {
3114                         if (this.Type(O) !== 'Object') {
3115                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3116                         }
3117                         if (!this.IsPropertyKey(P)) {
3118                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3119                         }
3120                         var oldDesc = $gOPD(O, P);
3121                         var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
3122                         var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
3123                         if (immutable || !extensible) {
3124                                 return false;
3125                         }
3126                         var newDesc = {
3127                                 configurable: true,
3128                                 enumerable: true,
3129                                 value: V,
3130                                 writable: true
3131                         };
3132                         $defineProperty(O, P, newDesc);
3133                         return true;
3134                 },
3135
3136                 // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
3137                 CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
3138                         if (this.Type(O) !== 'Object') {
3139                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3140                         }
3141                         if (!this.IsPropertyKey(P)) {
3142                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3143                         }
3144                         var success = this.CreateDataProperty(O, P, V);
3145                         if (!success) {
3146                                 throw new $TypeError$2('unable to create data property');
3147                         }
3148                         return success;
3149                 },
3150
3151                 // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
3152                 ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
3153                         if (proto !== null && this.Type(proto) !== 'Object') {
3154                                 throw new $TypeError$2('Assertion failed: proto must be null or an object');
3155                         }
3156                         var slots = arguments.length < 2 ? [] : internalSlotsList;
3157                         if (slots.length > 0) {
3158                                 throw new $SyntaxError$1('es-abstract does not yet support internal slots');
3159                         }
3160
3161                         if (proto === null && !$ObjectCreate) {
3162                                 throw new $SyntaxError$1('native Object.create support is required to create null objects');
3163                         }
3164
3165                         return $ObjectCreate(proto);
3166                 },
3167
3168                 // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
3169                 AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
3170                         if (this.Type(S) !== 'String') {
3171                                 throw new $TypeError$2('S must be a String');
3172                         }
3173                         if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
3174                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0 and <= 2**53');
3175                         }
3176                         if (this.Type(unicode) !== 'Boolean') {
3177                                 throw new $TypeError$2('Assertion failed: unicode must be a Boolean');
3178                         }
3179                         if (!unicode) {
3180                                 return index + 1;
3181                         }
3182                         var length = S.length;
3183                         if ((index + 1) >= length) {
3184                                 return index + 1;
3185                         }
3186
3187                         var first = $charCodeAt(S, index);
3188                         if (first < 0xD800 || first > 0xDBFF) {
3189                                 return index + 1;
3190                         }
3191
3192                         var second = $charCodeAt(S, index + 1);
3193                         if (second < 0xDC00 || second > 0xDFFF) {
3194                                 return index + 1;
3195                         }
3196
3197                         return index + 2;
3198                 },
3199
3200                 // https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
3201                 CreateMethodProperty: function CreateMethodProperty(O, P, V) {
3202                         if (this.Type(O) !== 'Object') {
3203                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3204                         }
3205
3206                         if (!this.IsPropertyKey(P)) {
3207                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3208                         }
3209
3210                         var newDesc = {
3211                                 configurable: true,
3212                                 enumerable: false,
3213                                 value: V,
3214                                 writable: true
3215                         };
3216                         return !!$defineProperty(O, P, newDesc);
3217                 },
3218
3219                 // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
3220                 DefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {
3221                         if (this.Type(O) !== 'Object') {
3222                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3223                         }
3224
3225                         if (!this.IsPropertyKey(P)) {
3226                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3227                         }
3228
3229                         return !!$defineProperty(O, P, desc);
3230                 },
3231
3232                 // https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
3233                 DeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {
3234                         if (this.Type(O) !== 'Object') {
3235                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3236                         }
3237
3238                         if (!this.IsPropertyKey(P)) {
3239                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3240                         }
3241
3242                         var success = delete O[P];
3243                         if (!success) {
3244                                 throw new TypeError('Attempt to delete property failed.');
3245                         }
3246                         return success;
3247                 },
3248
3249                 // https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
3250                 EnumerableOwnNames: function EnumerableOwnNames(O) {
3251                         if (this.Type(O) !== 'Object') {
3252                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3253                         }
3254
3255                         return objectKeys(O);
3256                 },
3257
3258                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
3259                 thisNumberValue: function thisNumberValue(value) {
3260                         if (this.Type(value) === 'Number') {
3261                                 return value;
3262                         }
3263
3264                         return $NumberValueOf(value);
3265                 },
3266
3267                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
3268                 thisBooleanValue: function thisBooleanValue(value) {
3269                         if (this.Type(value) === 'Boolean') {
3270                                 return value;
3271                         }
3272
3273                         return $BooleanValueOf(value);
3274                 },
3275
3276                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
3277                 thisStringValue: function thisStringValue(value) {
3278                         if (this.Type(value) === 'String') {
3279                                 return value;
3280                         }
3281
3282                         return $StringValueOf(value);
3283                 },
3284
3285                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
3286                 thisTimeValue: function thisTimeValue(value) {
3287                         return $DateValueOf(value);
3288                 }
3289         });
3290
3291         delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
3292
3293         var es2015$1 = ES6;
3294
3295         var es6$1 = es2015$1;
3296
3297         var implementation$2 = function find(predicate) {
3298                 var list = es6$1.ToObject(this);
3299                 var length = es6$1.ToInteger(es6$1.ToLength(list.length));
3300                 if (!es6$1.IsCallable(predicate)) {
3301                         throw new TypeError('Array#find: predicate must be a function');
3302                 }
3303                 if (length === 0) {
3304                         return undefined;
3305                 }
3306                 var thisArg = arguments[1];
3307                 for (var i = 0, value; i < length; i++) {
3308                         value = list[i];
3309                         if (es6$1.Call(predicate, thisArg, [value, i, list])) {
3310                                 return value;
3311                         }
3312                 }
3313                 return undefined;
3314         };
3315
3316         var polyfill$3 = function getPolyfill() {
3317                 // Detect if an implementation exists
3318                 // Detect early implementations which skipped holes in sparse arrays
3319           // eslint-disable-next-line no-sparse-arrays
3320                 var implemented = Array.prototype.find && [, 1].find(function () {
3321                         return true;
3322                 }) !== 1;
3323
3324           // eslint-disable-next-line global-require
3325                 return implemented ? Array.prototype.find : implementation$2;
3326         };
3327
3328         var shim$8 = function shimArrayPrototypeFind() {
3329                 var polyfill = polyfill$3();
3330
3331                 defineProperties_1(Array.prototype, { find: polyfill }, {
3332                         find: function () {
3333                                 return Array.prototype.find !== polyfill;
3334                         }
3335                 });
3336
3337                 return polyfill;
3338         };
3339
3340         var slice$2 = Array.prototype.slice;
3341
3342         var polyfill$4 = polyfill$3();
3343
3344         var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars
3345                 es6$1.RequireObjectCoercible(array);
3346                 var args = slice$2.call(arguments, 1);
3347                 return polyfill$4.apply(array, args);
3348         };
3349
3350         defineProperties_1(boundFindShim, {
3351                 getPolyfill: polyfill$3,
3352                 implementation: implementation$2,
3353                 shim: shim$8
3354         });
3355
3356         var array_prototype_find = boundFindShim;
3357
3358         var implementation$3 = function findIndex(predicate) {
3359                 var list = es6$1.ToObject(this);
3360                 var length = es6$1.ToLength(list.length);
3361                 if (!es6$1.IsCallable(predicate)) {
3362                         throw new TypeError('Array#findIndex: predicate must be a function');
3363                 }
3364                 if (length === 0) return -1;
3365                 var thisArg = arguments[1];
3366                 for (var i = 0, value; i < length; i++) {
3367                         value = list[i];
3368                         if (es6$1.Call(predicate, thisArg, [value, i, list])) return i;
3369                 }
3370                 return -1;
3371         };
3372
3373         var polyfill$5 = function getPolyfill() {
3374                 // Detect if an implementation exists
3375                 // Detect early implementations which skipped holes in sparse arrays
3376                 var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) {
3377                         return idx === 0;
3378                 }) === 0);
3379
3380
3381                 return implemented ? Array.prototype.findIndex : implementation$3;
3382         };
3383
3384         var shim$9 = function shimArrayPrototypeFindIndex() {
3385                 var polyfill = polyfill$5();
3386
3387                 defineProperties_1(Array.prototype, { findIndex: polyfill }, {
3388                         findIndex: function () {
3389                                 return Array.prototype.findIndex !== polyfill;
3390                         }
3391                 });
3392
3393                 return polyfill;
3394         };
3395
3396         var slice$3 = Array.prototype.slice;
3397
3398         var polyfill$6 = polyfill$5();
3399
3400         var boundShim = function findIndex(array, predicate) {
3401                 es6$1.RequireObjectCoercible(array);
3402                 var args = slice$3.call(arguments, 1);
3403                 return polyfill$6.apply(array, args);
3404         };
3405
3406         defineProperties_1(boundShim, {
3407                 implementation: implementation$3,
3408                 getPolyfill: polyfill$5,
3409                 shim: shim$9
3410         });
3411
3412         var array_prototype_findindex = boundShim;
3413
3414         var supportsDescriptors$1 = defineProperties_1.supportsDescriptors;
3415
3416         /*! https://mths.be/array-from v0.2.0 by @mathias */
3417         var implementation$4 = function from(arrayLike) {
3418                 var defineProperty = supportsDescriptors$1 ? Object.defineProperty : function put(object, key, descriptor) {
3419                         object[key] = descriptor.value;
3420                 };
3421                 var C = this;
3422                 if (arrayLike === null || typeof arrayLike === 'undefined') {
3423                         throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`');
3424                 }
3425                 var items = es6$1.ToObject(arrayLike);
3426
3427                 var mapFn, T;
3428                 if (typeof arguments[1] !== 'undefined') {
3429                         mapFn = arguments[1];
3430                         if (!es6$1.IsCallable(mapFn)) {
3431                                 throw new TypeError('When provided, the second argument to `Array.from` must be a function');
3432                         }
3433                         if (arguments.length > 2) {
3434                                 T = arguments[2];
3435                         }
3436                 }
3437
3438                 var len = es6$1.ToLength(items.length);
3439                 var A = es6$1.IsCallable(C) ? es6$1.ToObject(new C(len)) : new Array(len);
3440                 var k = 0;
3441                 var kValue, mappedValue;
3442                 while (k < len) {
3443                         kValue = items[k];
3444                         if (mapFn) {
3445                                 mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : es6$1.Call(mapFn, T, [kValue, k]);
3446                         } else {
3447                                 mappedValue = kValue;
3448                         }
3449                         defineProperty(A, k, {
3450                                 'configurable': true,
3451                                 'enumerable': true,
3452                                 'value': mappedValue,
3453                                 'writable': true
3454                         });
3455                         k += 1;
3456                 }
3457                 A.length = len;
3458                 return A;
3459         };
3460
3461         var tryCall = function (fn) {
3462                 try {
3463                         fn();
3464                         return true;
3465                 } catch (e) {
3466                         return false;
3467                 }
3468         };
3469
3470         var polyfill$7 = function getPolyfill() {
3471                 var implemented = es6$1.IsCallable(Array.from)
3472                         && tryCall(function () { Array.from({ 'length': -Infinity }); })
3473                         && !tryCall(function () { Array.from([], undefined); });
3474
3475                 return implemented ? Array.from : implementation$4;
3476         };
3477
3478         var shim$a = function shimArrayFrom() {
3479                 var polyfill = polyfill$7();
3480
3481                 defineProperties_1(Array, { 'from': polyfill }, {
3482                         'from': function () {
3483                                 return Array.from !== polyfill;
3484                         }
3485                 });
3486
3487                 return polyfill;
3488         };
3489
3490         // eslint-disable-next-line no-unused-vars
3491         var boundFromShim = function from(array) {
3492             // eslint-disable-next-line no-invalid-this
3493                 return implementation$4.apply(this || Array, arguments);
3494         };
3495
3496         defineProperties_1(boundFromShim, {
3497                 'getPolyfill': polyfill$7,
3498                 'implementation': implementation$4,
3499                 'shim': shim$a
3500         });
3501
3502         var array_from = boundFromShim;
3503
3504         var ES2016 = assign$1(assign$1({}, es2015$1), {
3505                 // https://github.com/tc39/ecma262/pull/60
3506                 SameValueNonNumber: function SameValueNonNumber(x, y) {
3507                         if (typeof x === 'number' || typeof x !== typeof y) {
3508                                 throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
3509                         }
3510                         return this.SameValue(x, y);
3511                 }
3512         });
3513
3514         var es2016 = ES2016;
3515
3516         var es7 = es2016;
3517
3518         var isEnumerable$1 = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3519
3520         var implementation$5 = function values(O) {
3521                 var obj = es7.RequireObjectCoercible(O);
3522                 var vals = [];
3523                 for (var key in obj) {
3524                         if (src(obj, key) && isEnumerable$1(obj, key)) {
3525                                 vals.push(obj[key]);
3526                         }
3527                 }
3528                 return vals;
3529         };
3530
3531         var polyfill$8 = function getPolyfill() {
3532                 return typeof Object.values === 'function' ? Object.values : implementation$5;
3533         };
3534
3535         var shim$b = function shimValues() {
3536                 var polyfill = polyfill$8();
3537                 defineProperties_1(Object, { values: polyfill }, {
3538                         values: function testValues() {
3539                                 return Object.values !== polyfill;
3540                         }
3541                 });
3542                 return polyfill;
3543         };
3544
3545         var polyfill$9 = polyfill$8();
3546
3547         defineProperties_1(polyfill$9, {
3548                 getPolyfill: polyfill$8,
3549                 implementation: implementation$5,
3550                 shim: shim$b
3551         });
3552
3553         var object_values = polyfill$9;
3554
3555         // modified from https://github.com/es-shims/es6-shim
3556
3557
3558         var canBeObject = function (obj) {
3559                 return typeof obj !== 'undefined' && obj !== null;
3560         };
3561         var hasSymbols$5 = shams();
3562         var toObject = Object;
3563         var push = functionBind.call(Function.call, Array.prototype.push);
3564         var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3565         var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null;
3566
3567         var implementation$6 = function assign(target, source1) {
3568                 if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
3569                 var objTarget = toObject(target);
3570                 var s, source, i, props, syms, value, key;
3571                 for (s = 1; s < arguments.length; ++s) {
3572                         source = toObject(arguments[s]);
3573                         props = objectKeys(source);
3574                         var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
3575                         if (getSymbols) {
3576                                 syms = getSymbols(source);
3577                                 for (i = 0; i < syms.length; ++i) {
3578                                         key = syms[i];
3579                                         if (propIsEnumerable(source, key)) {
3580                                                 push(props, key);
3581                                         }
3582                                 }
3583                         }
3584                         for (i = 0; i < props.length; ++i) {
3585                                 key = props[i];
3586                                 value = source[key];
3587                                 if (propIsEnumerable(source, key)) {
3588                                         objTarget[key] = value;
3589                                 }
3590                         }
3591                 }
3592                 return objTarget;
3593         };
3594
3595         var lacksProperEnumerationOrder = function () {
3596                 if (!Object.assign) {
3597                         return false;
3598                 }
3599                 // v8, specifically in node 4.x, has a bug with incorrect property enumeration order
3600                 // note: this does not detect the bug unless there's 20 characters
3601                 var str = 'abcdefghijklmnopqrst';
3602                 var letters = str.split('');
3603                 var map = {};
3604                 for (var i = 0; i < letters.length; ++i) {
3605                         map[letters[i]] = letters[i];
3606                 }
3607                 var obj = Object.assign({}, map);
3608                 var actual = '';
3609                 for (var k in obj) {
3610                         actual += k;
3611                 }
3612                 return str !== actual;
3613         };
3614
3615         var assignHasPendingExceptions = function () {
3616                 if (!Object.assign || !Object.preventExtensions) {
3617                         return false;
3618                 }
3619                 // Firefox 37 still has "pending exception" logic in its Object.assign implementation,
3620                 // which is 72% slower than our shim, and Firefox 40's native implementation.
3621                 var thrower = Object.preventExtensions({ 1: 2 });
3622                 try {
3623                         Object.assign(thrower, 'xy');
3624                 } catch (e) {
3625                         return thrower[1] === 'y';
3626                 }
3627                 return false;
3628         };
3629
3630         var polyfill$a = function getPolyfill() {
3631                 if (!Object.assign) {
3632                         return implementation$6;
3633                 }
3634                 if (lacksProperEnumerationOrder()) {
3635                         return implementation$6;
3636                 }
3637                 if (assignHasPendingExceptions()) {
3638                         return implementation$6;
3639                 }
3640                 return Object.assign;
3641         };
3642
3643         var shim$c = function shimAssign() {
3644                 var polyfill = polyfill$a();
3645                 defineProperties_1(
3646                         Object,
3647                         { assign: polyfill },
3648                         { assign: function () { return Object.assign !== polyfill; } }
3649                 );
3650                 return polyfill;
3651         };
3652
3653         var polyfill$b = polyfill$a();
3654
3655         defineProperties_1(polyfill$b, {
3656                 getPolyfill: polyfill$a,
3657                 implementation: implementation$6,
3658                 shim: shim$c
3659         });
3660
3661         var object_assign = polyfill$b;
3662
3663         /**
3664          * @this {Promise}
3665          */
3666         function finallyConstructor(callback) {
3667           var constructor = this.constructor;
3668           return this.then(
3669             function(value) {
3670               return constructor.resolve(callback()).then(function() {
3671                 return value;
3672               });
3673             },
3674             function(reason) {
3675               return constructor.resolve(callback()).then(function() {
3676                 return constructor.reject(reason);
3677               });
3678             }
3679           );
3680         }
3681
3682         // Store setTimeout reference so promise-polyfill will be unaffected by
3683         // other code modifying setTimeout (like sinon.useFakeTimers())
3684         var setTimeoutFunc = setTimeout;
3685
3686         function noop$1() {}
3687
3688         // Polyfill for Function.prototype.bind
3689         function bind$2(fn, thisArg) {
3690           return function() {
3691             fn.apply(thisArg, arguments);
3692           };
3693         }
3694
3695         /**
3696          * @constructor
3697          * @param {Function} fn
3698          */
3699         function Promise$1(fn) {
3700           if (!(this instanceof Promise$1))
3701             throw new TypeError('Promises must be constructed via new');
3702           if (typeof fn !== 'function') throw new TypeError('not a function');
3703           /** @type {!number} */
3704           this._state = 0;
3705           /** @type {!boolean} */
3706           this._handled = false;
3707           /** @type {Promise|undefined} */
3708           this._value = undefined;
3709           /** @type {!Array<!Function>} */
3710           this._deferreds = [];
3711
3712           doResolve(fn, this);
3713         }
3714
3715         function handle(self, deferred) {
3716           while (self._state === 3) {
3717             self = self._value;
3718           }
3719           if (self._state === 0) {
3720             self._deferreds.push(deferred);
3721             return;
3722           }
3723           self._handled = true;
3724           Promise$1._immediateFn(function() {
3725             var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
3726             if (cb === null) {
3727               (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
3728               return;
3729             }
3730             var ret;
3731             try {
3732               ret = cb(self._value);
3733             } catch (e) {
3734               reject(deferred.promise, e);
3735               return;
3736             }
3737             resolve(deferred.promise, ret);
3738           });
3739         }
3740
3741         function resolve(self, newValue) {
3742           try {
3743             // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
3744             if (newValue === self)
3745               throw new TypeError('A promise cannot be resolved with itself.');
3746             if (
3747               newValue &&
3748               (typeof newValue === 'object' || typeof newValue === 'function')
3749             ) {
3750               var then = newValue.then;
3751               if (newValue instanceof Promise$1) {
3752                 self._state = 3;
3753                 self._value = newValue;
3754                 finale(self);
3755                 return;
3756               } else if (typeof then === 'function') {
3757                 doResolve(bind$2(then, newValue), self);
3758                 return;
3759               }
3760             }
3761             self._state = 1;
3762             self._value = newValue;
3763             finale(self);
3764           } catch (e) {
3765             reject(self, e);
3766           }
3767         }
3768
3769         function reject(self, newValue) {
3770           self._state = 2;
3771           self._value = newValue;
3772           finale(self);
3773         }
3774
3775         function finale(self) {
3776           if (self._state === 2 && self._deferreds.length === 0) {
3777             Promise$1._immediateFn(function() {
3778               if (!self._handled) {
3779                 Promise$1._unhandledRejectionFn(self._value);
3780               }
3781             });
3782           }
3783
3784           for (var i = 0, len = self._deferreds.length; i < len; i++) {
3785             handle(self, self._deferreds[i]);
3786           }
3787           self._deferreds = null;
3788         }
3789
3790         /**
3791          * @constructor
3792          */
3793         function Handler(onFulfilled, onRejected, promise) {
3794           this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
3795           this.onRejected = typeof onRejected === 'function' ? onRejected : null;
3796           this.promise = promise;
3797         }
3798
3799         /**
3800          * Take a potentially misbehaving resolver function and make sure
3801          * onFulfilled and onRejected are only called once.
3802          *
3803          * Makes no guarantees about asynchrony.
3804          */
3805         function doResolve(fn, self) {
3806           var done = false;
3807           try {
3808             fn(
3809               function(value) {
3810                 if (done) return;
3811                 done = true;
3812                 resolve(self, value);
3813               },
3814               function(reason) {
3815                 if (done) return;
3816                 done = true;
3817                 reject(self, reason);
3818               }
3819             );
3820           } catch (ex) {
3821             if (done) return;
3822             done = true;
3823             reject(self, ex);
3824           }
3825         }
3826
3827         Promise$1.prototype['catch'] = function(onRejected) {
3828           return this.then(null, onRejected);
3829         };
3830
3831         Promise$1.prototype.then = function(onFulfilled, onRejected) {
3832           // @ts-ignore
3833           var prom = new this.constructor(noop$1);
3834
3835           handle(this, new Handler(onFulfilled, onRejected, prom));
3836           return prom;
3837         };
3838
3839         Promise$1.prototype['finally'] = finallyConstructor;
3840
3841         Promise$1.all = function(arr) {
3842           return new Promise$1(function(resolve, reject) {
3843             if (!arr || typeof arr.length === 'undefined')
3844               throw new TypeError('Promise.all accepts an array');
3845             var args = Array.prototype.slice.call(arr);
3846             if (args.length === 0) return resolve([]);
3847             var remaining = args.length;
3848
3849             function res(i, val) {
3850               try {
3851                 if (val && (typeof val === 'object' || typeof val === 'function')) {
3852                   var then = val.then;
3853                   if (typeof then === 'function') {
3854                     then.call(
3855                       val,
3856                       function(val) {
3857                         res(i, val);
3858                       },
3859                       reject
3860                     );
3861                     return;
3862                   }
3863                 }
3864                 args[i] = val;
3865                 if (--remaining === 0) {
3866                   resolve(args);
3867                 }
3868               } catch (ex) {
3869                 reject(ex);
3870               }
3871             }
3872
3873             for (var i = 0; i < args.length; i++) {
3874               res(i, args[i]);
3875             }
3876           });
3877         };
3878
3879         Promise$1.resolve = function(value) {
3880           if (value && typeof value === 'object' && value.constructor === Promise$1) {
3881             return value;
3882           }
3883
3884           return new Promise$1(function(resolve) {
3885             resolve(value);
3886           });
3887         };
3888
3889         Promise$1.reject = function(value) {
3890           return new Promise$1(function(resolve, reject) {
3891             reject(value);
3892           });
3893         };
3894
3895         Promise$1.race = function(values) {
3896           return new Promise$1(function(resolve, reject) {
3897             for (var i = 0, len = values.length; i < len; i++) {
3898               values[i].then(resolve, reject);
3899             }
3900           });
3901         };
3902
3903         // Use polyfill for setImmediate for performance gains
3904         Promise$1._immediateFn =
3905           (typeof setImmediate === 'function' &&
3906             function(fn) {
3907               setImmediate(fn);
3908             }) ||
3909           function(fn) {
3910             setTimeoutFunc(fn, 0);
3911           };
3912
3913         Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {
3914           if (typeof console !== 'undefined' && console) {
3915             console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
3916           }
3917         };
3918
3919         /** @suppress {undefinedVars} */
3920         var globalNS = (function() {
3921           // the only reliable means to get the global object is
3922           // `Function('return this')()`
3923           // However, this causes CSP violations in Chrome apps.
3924           if (typeof self !== 'undefined') {
3925             return self;
3926           }
3927           if (typeof window !== 'undefined') {
3928             return window;
3929           }
3930           if (typeof global !== 'undefined') {
3931             return global;
3932           }
3933           throw new Error('unable to locate global object');
3934         })();
3935
3936         if (!('Promise' in globalNS)) {
3937           globalNS['Promise'] = Promise$1;
3938         } else if (!globalNS.Promise.prototype['finally']) {
3939           globalNS.Promise.prototype['finally'] = finallyConstructor;
3940         }
3941
3942         var polyfill$c = /*#__PURE__*/Object.freeze({
3943
3944         });
3945
3946         var setAsap = createCommonjsModule(function (module) {
3947         (function (thisVar, undefined$1) {
3948                 var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) ||
3949                         typeof self === 'object' && self || thisVar;
3950
3951                 var hasSetImmediate = typeof setImmediate === 'function';
3952                 var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
3953                 var index = 0;
3954
3955                 function getNewIndex() {
3956                         if (index === 9007199254740991) {
3957                                 return 0;
3958                         }
3959                         return ++index;
3960                 }
3961
3962                 var setAsap = (function () {
3963                         var hiddenDiv, scriptEl, timeoutFn, callbacks;
3964
3965                         // Modern browsers, fastest async
3966                         if (main.MutationObserver) {
3967                                 return function setAsap(callback) {
3968                                         hiddenDiv = document.createElement("div");
3969                                         (new MutationObserver(function() {
3970                                                 callback();
3971                                                 hiddenDiv = null;
3972                                         })).observe(hiddenDiv, { attributes: true });
3973                                         hiddenDiv.setAttribute('i', '1');
3974                                 };
3975
3976                         // Browsers that support postMessage
3977                         } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
3978
3979                                 var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
3980                                 callbacks = {};
3981
3982                                 var onGlobalMessage = function (event) {
3983                                         if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
3984                                                 var i = +event.data.split(':')[1];
3985                                                 callbacks[i]();
3986                                                 delete callbacks[i];
3987                                         }
3988                                 };
3989
3990                                 main.addEventListener("message", onGlobalMessage, false);
3991
3992                                 return function setAsap(callback) {
3993                                         var i = getNewIndex();
3994                                         callbacks[i] = callback;
3995                                         main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
3996                                 };
3997
3998                                 // IE browsers without postMessage
3999                         } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
4000
4001                                 return function setAsap(callback) {
4002                                         scriptEl = document.createElement("script");
4003                                         scriptEl.onreadystatechange = function onreadystatechange() {
4004                                                 scriptEl.onreadystatechange = null;
4005                                                 scriptEl.parentNode.removeChild(scriptEl);
4006                                                 scriptEl = null;
4007                                                 callback();
4008                                         };
4009                                         document.body.appendChild(scriptEl);
4010                                 };
4011
4012                         // All other browsers and node
4013                         } else {
4014
4015                                 timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
4016                                 return function setAsap(callback) {
4017                                         timeoutFn(callback);
4018                                 };
4019                         }
4020
4021                 })();
4022
4023                 if (module.exports) {
4024                         module.exports = setAsap;
4025                 } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) {
4026                         undefined$1(function () {
4027                                 return setAsap;
4028                         });
4029                 } else {
4030                         main.setAsap = setAsap;
4031                 }
4032         })(commonjsGlobal);
4033         });
4034
4035         var performanceNow = createCommonjsModule(function (module) {
4036         // Generated by CoffeeScript 1.12.2
4037         (function() {
4038           var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
4039
4040           if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
4041             module.exports = function() {
4042               return performance.now();
4043             };
4044           } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
4045             module.exports = function() {
4046               return (getNanoSeconds() - nodeLoadTime) / 1e6;
4047             };
4048             hrtime = process.hrtime;
4049             getNanoSeconds = function() {
4050               var hr;
4051               hr = hrtime();
4052               return hr[0] * 1e9 + hr[1];
4053             };
4054             moduleLoadTime = getNanoSeconds();
4055             upTime = process.uptime() * 1e9;
4056             nodeLoadTime = moduleLoadTime - upTime;
4057           } else if (Date.now) {
4058             module.exports = function() {
4059               return Date.now() - loadTime;
4060             };
4061             loadTime = Date.now();
4062           } else {
4063             module.exports = function() {
4064               return new Date().getTime() - loadTime;
4065             };
4066             loadTime = new Date().getTime();
4067           }
4068
4069         }).call(commonjsGlobal);
4070
4071
4072         });
4073
4074         var root = typeof window === 'undefined' ? commonjsGlobal : window
4075           , vendors = ['moz', 'webkit']
4076           , suffix = 'AnimationFrame'
4077           , raf = root['request' + suffix]
4078           , caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
4079
4080         for(var i = 0; !raf && i < vendors.length; i++) {
4081           raf = root[vendors[i] + 'Request' + suffix];
4082           caf = root[vendors[i] + 'Cancel' + suffix]
4083               || root[vendors[i] + 'CancelRequest' + suffix];
4084         }
4085
4086         // Some versions of FF have rAF but not cAF
4087         if(!raf || !caf) {
4088           var last = 0
4089             , id$3 = 0
4090             , queue = []
4091             , frameDuration = 1000 / 60;
4092
4093           raf = function(callback) {
4094             if(queue.length === 0) {
4095               var _now = performanceNow()
4096                 , next = Math.max(0, frameDuration - (_now - last));
4097               last = next + _now;
4098               setTimeout(function() {
4099                 var cp = queue.slice(0);
4100                 // Clear queue here to prevent
4101                 // callbacks from appending listeners
4102                 // to the current frame's queue
4103                 queue.length = 0;
4104                 for(var i = 0; i < cp.length; i++) {
4105                   if(!cp[i].cancelled) {
4106                     try{
4107                       cp[i].callback(last);
4108                     } catch(e) {
4109                       setTimeout(function() { throw e }, 0);
4110                     }
4111                   }
4112                 }
4113               }, Math.round(next));
4114             }
4115             queue.push({
4116               handle: ++id$3,
4117               callback: callback,
4118               cancelled: false
4119             });
4120             return id$3
4121           };
4122
4123           caf = function(handle) {
4124             for(var i = 0; i < queue.length; i++) {
4125               if(queue[i].handle === handle) {
4126                 queue[i].cancelled = true;
4127               }
4128             }
4129           };
4130         }
4131
4132         var raf_1 = function(fn) {
4133           // Wrap in a new function to prevent
4134           // `cancel` potentially being assigned
4135           // to the native rAF function
4136           return raf.call(root, fn)
4137         };
4138         var cancel = function() {
4139           caf.apply(root, arguments);
4140         };
4141         var polyfill$d = function(object) {
4142           if (!object) {
4143             object = root;
4144           }
4145           object.requestAnimationFrame = raf;
4146           object.cancelAnimationFrame = caf;
4147         };
4148         raf_1.cancel = cancel;
4149         raf_1.polyfill = polyfill$d;
4150
4151         var support = {
4152           searchParams: 'URLSearchParams' in self,
4153           iterable: 'Symbol' in self && 'iterator' in Symbol,
4154           blob:
4155             'FileReader' in self &&
4156             'Blob' in self &&
4157             (function() {
4158               try {
4159                 new Blob();
4160                 return true
4161               } catch (e) {
4162                 return false
4163               }
4164             })(),
4165           formData: 'FormData' in self,
4166           arrayBuffer: 'ArrayBuffer' in self
4167         };
4168
4169         function isDataView(obj) {
4170           return obj && DataView.prototype.isPrototypeOf(obj)
4171         }
4172
4173         if (support.arrayBuffer) {
4174           var viewClasses = [
4175             '[object Int8Array]',
4176             '[object Uint8Array]',
4177             '[object Uint8ClampedArray]',
4178             '[object Int16Array]',
4179             '[object Uint16Array]',
4180             '[object Int32Array]',
4181             '[object Uint32Array]',
4182             '[object Float32Array]',
4183             '[object Float64Array]'
4184           ];
4185
4186           var isArrayBufferView =
4187             ArrayBuffer.isView ||
4188             function(obj) {
4189               return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
4190             };
4191         }
4192
4193         function normalizeName(name) {
4194           if (typeof name !== 'string') {
4195             name = String(name);
4196           }
4197           if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
4198             throw new TypeError('Invalid character in header field name')
4199           }
4200           return name.toLowerCase()
4201         }
4202
4203         function normalizeValue(value) {
4204           if (typeof value !== 'string') {
4205             value = String(value);
4206           }
4207           return value
4208         }
4209
4210         // Build a destructive iterator for the value list
4211         function iteratorFor(items) {
4212           var iterator = {
4213             next: function() {
4214               var value = items.shift();
4215               return {done: value === undefined, value: value}
4216             }
4217           };
4218
4219           if (support.iterable) {
4220             iterator[Symbol.iterator] = function() {
4221               return iterator
4222             };
4223           }
4224
4225           return iterator
4226         }
4227
4228         function Headers(headers) {
4229           this.map = {};
4230
4231           if (headers instanceof Headers) {
4232             headers.forEach(function(value, name) {
4233               this.append(name, value);
4234             }, this);
4235           } else if (Array.isArray(headers)) {
4236             headers.forEach(function(header) {
4237               this.append(header[0], header[1]);
4238             }, this);
4239           } else if (headers) {
4240             Object.getOwnPropertyNames(headers).forEach(function(name) {
4241               this.append(name, headers[name]);
4242             }, this);
4243           }
4244         }
4245
4246         Headers.prototype.append = function(name, value) {
4247           name = normalizeName(name);
4248           value = normalizeValue(value);
4249           var oldValue = this.map[name];
4250           this.map[name] = oldValue ? oldValue + ', ' + value : value;
4251         };
4252
4253         Headers.prototype['delete'] = function(name) {
4254           delete this.map[normalizeName(name)];
4255         };
4256
4257         Headers.prototype.get = function(name) {
4258           name = normalizeName(name);
4259           return this.has(name) ? this.map[name] : null
4260         };
4261
4262         Headers.prototype.has = function(name) {
4263           return this.map.hasOwnProperty(normalizeName(name))
4264         };
4265
4266         Headers.prototype.set = function(name, value) {
4267           this.map[normalizeName(name)] = normalizeValue(value);
4268         };
4269
4270         Headers.prototype.forEach = function(callback, thisArg) {
4271           for (var name in this.map) {
4272             if (this.map.hasOwnProperty(name)) {
4273               callback.call(thisArg, this.map[name], name, this);
4274             }
4275           }
4276         };
4277
4278         Headers.prototype.keys = function() {
4279           var items = [];
4280           this.forEach(function(value, name) {
4281             items.push(name);
4282           });
4283           return iteratorFor(items)
4284         };
4285
4286         Headers.prototype.values = function() {
4287           var items = [];
4288           this.forEach(function(value) {
4289             items.push(value);
4290           });
4291           return iteratorFor(items)
4292         };
4293
4294         Headers.prototype.entries = function() {
4295           var items = [];
4296           this.forEach(function(value, name) {
4297             items.push([name, value]);
4298           });
4299           return iteratorFor(items)
4300         };
4301
4302         if (support.iterable) {
4303           Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
4304         }
4305
4306         function consumed(body) {
4307           if (body.bodyUsed) {
4308             return Promise.reject(new TypeError('Already read'))
4309           }
4310           body.bodyUsed = true;
4311         }
4312
4313         function fileReaderReady(reader) {
4314           return new Promise(function(resolve, reject) {
4315             reader.onload = function() {
4316               resolve(reader.result);
4317             };
4318             reader.onerror = function() {
4319               reject(reader.error);
4320             };
4321           })
4322         }
4323
4324         function readBlobAsArrayBuffer(blob) {
4325           var reader = new FileReader();
4326           var promise = fileReaderReady(reader);
4327           reader.readAsArrayBuffer(blob);
4328           return promise
4329         }
4330
4331         function readBlobAsText(blob) {
4332           var reader = new FileReader();
4333           var promise = fileReaderReady(reader);
4334           reader.readAsText(blob);
4335           return promise
4336         }
4337
4338         function readArrayBufferAsText(buf) {
4339           var view = new Uint8Array(buf);
4340           var chars = new Array(view.length);
4341
4342           for (var i = 0; i < view.length; i++) {
4343             chars[i] = String.fromCharCode(view[i]);
4344           }
4345           return chars.join('')
4346         }
4347
4348         function bufferClone(buf) {
4349           if (buf.slice) {
4350             return buf.slice(0)
4351           } else {
4352             var view = new Uint8Array(buf.byteLength);
4353             view.set(new Uint8Array(buf));
4354             return view.buffer
4355           }
4356         }
4357
4358         function Body() {
4359           this.bodyUsed = false;
4360
4361           this._initBody = function(body) {
4362             this._bodyInit = body;
4363             if (!body) {
4364               this._bodyText = '';
4365             } else if (typeof body === 'string') {
4366               this._bodyText = body;
4367             } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
4368               this._bodyBlob = body;
4369             } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
4370               this._bodyFormData = body;
4371             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4372               this._bodyText = body.toString();
4373             } else if (support.arrayBuffer && support.blob && isDataView(body)) {
4374               this._bodyArrayBuffer = bufferClone(body.buffer);
4375               // IE 10-11 can't handle a DataView body.
4376               this._bodyInit = new Blob([this._bodyArrayBuffer]);
4377             } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
4378               this._bodyArrayBuffer = bufferClone(body);
4379             } else {
4380               this._bodyText = body = Object.prototype.toString.call(body);
4381             }
4382
4383             if (!this.headers.get('content-type')) {
4384               if (typeof body === 'string') {
4385                 this.headers.set('content-type', 'text/plain;charset=UTF-8');
4386               } else if (this._bodyBlob && this._bodyBlob.type) {
4387                 this.headers.set('content-type', this._bodyBlob.type);
4388               } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4389                 this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
4390               }
4391             }
4392           };
4393
4394           if (support.blob) {
4395             this.blob = function() {
4396               var rejected = consumed(this);
4397               if (rejected) {
4398                 return rejected
4399               }
4400
4401               if (this._bodyBlob) {
4402                 return Promise.resolve(this._bodyBlob)
4403               } else if (this._bodyArrayBuffer) {
4404                 return Promise.resolve(new Blob([this._bodyArrayBuffer]))
4405               } else if (this._bodyFormData) {
4406                 throw new Error('could not read FormData body as blob')
4407               } else {
4408                 return Promise.resolve(new Blob([this._bodyText]))
4409               }
4410             };
4411
4412             this.arrayBuffer = function() {
4413               if (this._bodyArrayBuffer) {
4414                 return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
4415               } else {
4416                 return this.blob().then(readBlobAsArrayBuffer)
4417               }
4418             };
4419           }
4420
4421           this.text = function() {
4422             var rejected = consumed(this);
4423             if (rejected) {
4424               return rejected
4425             }
4426
4427             if (this._bodyBlob) {
4428               return readBlobAsText(this._bodyBlob)
4429             } else if (this._bodyArrayBuffer) {
4430               return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
4431             } else if (this._bodyFormData) {
4432               throw new Error('could not read FormData body as text')
4433             } else {
4434               return Promise.resolve(this._bodyText)
4435             }
4436           };
4437
4438           if (support.formData) {
4439             this.formData = function() {
4440               return this.text().then(decode)
4441             };
4442           }
4443
4444           this.json = function() {
4445             return this.text().then(JSON.parse)
4446           };
4447
4448           return this
4449         }
4450
4451         // HTTP methods whose capitalization should be normalized
4452         var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
4453
4454         function normalizeMethod(method) {
4455           var upcased = method.toUpperCase();
4456           return methods.indexOf(upcased) > -1 ? upcased : method
4457         }
4458
4459         function Request(input, options) {
4460           options = options || {};
4461           var body = options.body;
4462
4463           if (input instanceof Request) {
4464             if (input.bodyUsed) {
4465               throw new TypeError('Already read')
4466             }
4467             this.url = input.url;
4468             this.credentials = input.credentials;
4469             if (!options.headers) {
4470               this.headers = new Headers(input.headers);
4471             }
4472             this.method = input.method;
4473             this.mode = input.mode;
4474             this.signal = input.signal;
4475             if (!body && input._bodyInit != null) {
4476               body = input._bodyInit;
4477               input.bodyUsed = true;
4478             }
4479           } else {
4480             this.url = String(input);
4481           }
4482
4483           this.credentials = options.credentials || this.credentials || 'same-origin';
4484           if (options.headers || !this.headers) {
4485             this.headers = new Headers(options.headers);
4486           }
4487           this.method = normalizeMethod(options.method || this.method || 'GET');
4488           this.mode = options.mode || this.mode || null;
4489           this.signal = options.signal || this.signal;
4490           this.referrer = null;
4491
4492           if ((this.method === 'GET' || this.method === 'HEAD') && body) {
4493             throw new TypeError('Body not allowed for GET or HEAD requests')
4494           }
4495           this._initBody(body);
4496         }
4497
4498         Request.prototype.clone = function() {
4499           return new Request(this, {body: this._bodyInit})
4500         };
4501
4502         function decode(body) {
4503           var form = new FormData();
4504           body
4505             .trim()
4506             .split('&')
4507             .forEach(function(bytes) {
4508               if (bytes) {
4509                 var split = bytes.split('=');
4510                 var name = split.shift().replace(/\+/g, ' ');
4511                 var value = split.join('=').replace(/\+/g, ' ');
4512                 form.append(decodeURIComponent(name), decodeURIComponent(value));
4513               }
4514             });
4515           return form
4516         }
4517
4518         function parseHeaders(rawHeaders) {
4519           var headers = new Headers();
4520           // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
4521           // https://tools.ietf.org/html/rfc7230#section-3.2
4522           var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
4523           preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
4524             var parts = line.split(':');
4525             var key = parts.shift().trim();
4526             if (key) {
4527               var value = parts.join(':').trim();
4528               headers.append(key, value);
4529             }
4530           });
4531           return headers
4532         }
4533
4534         Body.call(Request.prototype);
4535
4536         function Response(bodyInit, options) {
4537           if (!options) {
4538             options = {};
4539           }
4540
4541           this.type = 'default';
4542           this.status = options.status === undefined ? 200 : options.status;
4543           this.ok = this.status >= 200 && this.status < 300;
4544           this.statusText = 'statusText' in options ? options.statusText : 'OK';
4545           this.headers = new Headers(options.headers);
4546           this.url = options.url || '';
4547           this._initBody(bodyInit);
4548         }
4549
4550         Body.call(Response.prototype);
4551
4552         Response.prototype.clone = function() {
4553           return new Response(this._bodyInit, {
4554             status: this.status,
4555             statusText: this.statusText,
4556             headers: new Headers(this.headers),
4557             url: this.url
4558           })
4559         };
4560
4561         Response.error = function() {
4562           var response = new Response(null, {status: 0, statusText: ''});
4563           response.type = 'error';
4564           return response
4565         };
4566
4567         var redirectStatuses = [301, 302, 303, 307, 308];
4568
4569         Response.redirect = function(url, status) {
4570           if (redirectStatuses.indexOf(status) === -1) {
4571             throw new RangeError('Invalid status code')
4572           }
4573
4574           return new Response(null, {status: status, headers: {location: url}})
4575         };
4576
4577         var DOMException$1 = self.DOMException;
4578         try {
4579           new DOMException$1();
4580         } catch (err) {
4581           DOMException$1 = function(message, name) {
4582             this.message = message;
4583             this.name = name;
4584             var error = Error(message);
4585             this.stack = error.stack;
4586           };
4587           DOMException$1.prototype = Object.create(Error.prototype);
4588           DOMException$1.prototype.constructor = DOMException$1;
4589         }
4590
4591         function fetch$1(input, init) {
4592           return new Promise(function(resolve, reject) {
4593             var request = new Request(input, init);
4594
4595             if (request.signal && request.signal.aborted) {
4596               return reject(new DOMException$1('Aborted', 'AbortError'))
4597             }
4598
4599             var xhr = new XMLHttpRequest();
4600
4601             function abortXhr() {
4602               xhr.abort();
4603             }
4604
4605             xhr.onload = function() {
4606               var options = {
4607                 status: xhr.status,
4608                 statusText: xhr.statusText,
4609                 headers: parseHeaders(xhr.getAllResponseHeaders() || '')
4610               };
4611               options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
4612               var body = 'response' in xhr ? xhr.response : xhr.responseText;
4613               resolve(new Response(body, options));
4614             };
4615
4616             xhr.onerror = function() {
4617               reject(new TypeError('Network request failed'));
4618             };
4619
4620             xhr.ontimeout = function() {
4621               reject(new TypeError('Network request failed'));
4622             };
4623
4624             xhr.onabort = function() {
4625               reject(new DOMException$1('Aborted', 'AbortError'));
4626             };
4627
4628             xhr.open(request.method, request.url, true);
4629
4630             if (request.credentials === 'include') {
4631               xhr.withCredentials = true;
4632             } else if (request.credentials === 'omit') {
4633               xhr.withCredentials = false;
4634             }
4635
4636             if ('responseType' in xhr && support.blob) {
4637               xhr.responseType = 'blob';
4638             }
4639
4640             request.headers.forEach(function(value, name) {
4641               xhr.setRequestHeader(name, value);
4642             });
4643
4644             if (request.signal) {
4645               request.signal.addEventListener('abort', abortXhr);
4646
4647               xhr.onreadystatechange = function() {
4648                 // DONE (success or failure)
4649                 if (xhr.readyState === 4) {
4650                   request.signal.removeEventListener('abort', abortXhr);
4651                 }
4652               };
4653             }
4654
4655             xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
4656           })
4657         }
4658
4659         fetch$1.polyfill = true;
4660
4661         if (!self.fetch) {
4662           self.fetch = fetch$1;
4663           self.Headers = Headers;
4664           self.Request = Request;
4665           self.Response = Response;
4666         }
4667
4668         var lib = createCommonjsModule(function (module, exports) {
4669         Object.defineProperty(exports, "__esModule", { value: true });
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680         if (!window.Set) {
4681             window.Set = es6Set;
4682         }
4683         if (!window.Map) {
4684             window.Map = es6Map;
4685         }
4686         if (!window.Promise) {
4687             window.Promise = polyfill$c;
4688             window.Promise._immediateFn = setAsap;
4689         }
4690         if (!Array.prototype.find) {
4691             array_prototype_find.shim();
4692         }
4693         if (!Array.prototype.findIndex) {
4694             array_prototype_findindex.shim();
4695         }
4696         if (!Array.from) {
4697             array_from.shim();
4698         }
4699         if (!Object.values) {
4700             object_values.shim();
4701         }
4702         if (!Object.assign) {
4703             object_assign.shim();
4704         }
4705         if (!window.requestAnimationFrame || !window.cancelAnimationFrame) {
4706             window.requestAnimationFrame = raf_1;
4707             window.cancelAnimationFrame = raf_1.cancel;
4708         }
4709
4710         var finalFetch = window.fetch;
4711         var finalPromise = window.Promise;
4712         window.fetch = function (input, init) {
4713             try {
4714                 return finalFetch(input, init);
4715             }
4716             catch (error) {
4717                 return new finalPromise(function (_, reject) { return reject(error); });
4718             }
4719         };
4720         });
4721
4722         unwrapExports(lib);
4723
4724         (function (factory) {
4725           factory();
4726         }(function () {
4727           function _classCallCheck(instance, Constructor) {
4728             if (!(instance instanceof Constructor)) {
4729               throw new TypeError("Cannot call a class as a function");
4730             }
4731           }
4732
4733           function _defineProperties(target, props) {
4734             for (var i = 0; i < props.length; i++) {
4735               var descriptor = props[i];
4736               descriptor.enumerable = descriptor.enumerable || false;
4737               descriptor.configurable = true;
4738               if ("value" in descriptor) descriptor.writable = true;
4739               Object.defineProperty(target, descriptor.key, descriptor);
4740             }
4741           }
4742
4743           function _createClass(Constructor, protoProps, staticProps) {
4744             if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4745             if (staticProps) _defineProperties(Constructor, staticProps);
4746             return Constructor;
4747           }
4748
4749           function _inherits(subClass, superClass) {
4750             if (typeof superClass !== "function" && superClass !== null) {
4751               throw new TypeError("Super expression must either be null or a function");
4752             }
4753
4754             subClass.prototype = Object.create(superClass && superClass.prototype, {
4755               constructor: {
4756                 value: subClass,
4757                 writable: true,
4758                 configurable: true
4759               }
4760             });
4761             if (superClass) _setPrototypeOf(subClass, superClass);
4762           }
4763
4764           function _getPrototypeOf(o) {
4765             _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4766               return o.__proto__ || Object.getPrototypeOf(o);
4767             };
4768             return _getPrototypeOf(o);
4769           }
4770
4771           function _setPrototypeOf(o, p) {
4772             _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4773               o.__proto__ = p;
4774               return o;
4775             };
4776
4777             return _setPrototypeOf(o, p);
4778           }
4779
4780           function _assertThisInitialized(self) {
4781             if (self === void 0) {
4782               throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4783             }
4784
4785             return self;
4786           }
4787
4788           function _possibleConstructorReturn(self, call) {
4789             if (call && (typeof call === "object" || typeof call === "function")) {
4790               return call;
4791             }
4792
4793             return _assertThisInitialized(self);
4794           }
4795
4796           function _superPropBase(object, property) {
4797             while (!Object.prototype.hasOwnProperty.call(object, property)) {
4798               object = _getPrototypeOf(object);
4799               if (object === null) break;
4800             }
4801
4802             return object;
4803           }
4804
4805           function _get(target, property, receiver) {
4806             if (typeof Reflect !== "undefined" && Reflect.get) {
4807               _get = Reflect.get;
4808             } else {
4809               _get = function _get(target, property, receiver) {
4810                 var base = _superPropBase(target, property);
4811
4812                 if (!base) return;
4813                 var desc = Object.getOwnPropertyDescriptor(base, property);
4814
4815                 if (desc.get) {
4816                   return desc.get.call(receiver);
4817                 }
4818
4819                 return desc.value;
4820               };
4821             }
4822
4823             return _get(target, property, receiver || target);
4824           }
4825
4826           var Emitter =
4827           /*#__PURE__*/
4828           function () {
4829             function Emitter() {
4830               _classCallCheck(this, Emitter);
4831
4832               Object.defineProperty(this, 'listeners', {
4833                 value: {},
4834                 writable: true,
4835                 configurable: true
4836               });
4837             }
4838
4839             _createClass(Emitter, [{
4840               key: "addEventListener",
4841               value: function addEventListener(type, callback) {
4842                 if (!(type in this.listeners)) {
4843                   this.listeners[type] = [];
4844                 }
4845
4846                 this.listeners[type].push(callback);
4847               }
4848             }, {
4849               key: "removeEventListener",
4850               value: function removeEventListener(type, callback) {
4851                 if (!(type in this.listeners)) {
4852                   return;
4853                 }
4854
4855                 var stack = this.listeners[type];
4856
4857                 for (var i = 0, l = stack.length; i < l; i++) {
4858                   if (stack[i] === callback) {
4859                     stack.splice(i, 1);
4860                     return;
4861                   }
4862                 }
4863               }
4864             }, {
4865               key: "dispatchEvent",
4866               value: function dispatchEvent(event) {
4867                 var _this = this;
4868
4869                 if (!(event.type in this.listeners)) {
4870                   return;
4871                 }
4872
4873                 var debounce = function debounce(callback) {
4874                   setTimeout(function () {
4875                     return callback.call(_this, event);
4876                   });
4877                 };
4878
4879                 var stack = this.listeners[event.type];
4880
4881                 for (var i = 0, l = stack.length; i < l; i++) {
4882                   debounce(stack[i]);
4883                 }
4884
4885                 return !event.defaultPrevented;
4886               }
4887             }]);
4888
4889             return Emitter;
4890           }();
4891
4892           var AbortSignal =
4893           /*#__PURE__*/
4894           function (_Emitter) {
4895             _inherits(AbortSignal, _Emitter);
4896
4897             function AbortSignal() {
4898               var _this2;
4899
4900               _classCallCheck(this, AbortSignal);
4901
4902               _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
4903               // constructor has failed to run, then "this.listeners" will still be undefined and then we call
4904               // the parent constructor directly instead as a workaround. For general details, see babel bug:
4905               // https://github.com/babel/babel/issues/3041
4906               // This hack was added as a fix for the issue described here:
4907               // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
4908
4909               if (!_this2.listeners) {
4910                 Emitter.call(_assertThisInitialized(_this2));
4911               } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4912               // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
4913
4914
4915               Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {
4916                 value: false,
4917                 writable: true,
4918                 configurable: true
4919               });
4920               Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {
4921                 value: null,
4922                 writable: true,
4923                 configurable: true
4924               });
4925               return _this2;
4926             }
4927
4928             _createClass(AbortSignal, [{
4929               key: "toString",
4930               value: function toString() {
4931                 return '[object AbortSignal]';
4932               }
4933             }, {
4934               key: "dispatchEvent",
4935               value: function dispatchEvent(event) {
4936                 if (event.type === 'abort') {
4937                   this.aborted = true;
4938
4939                   if (typeof this.onabort === 'function') {
4940                     this.onabort.call(this, event);
4941                   }
4942                 }
4943
4944                 _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
4945               }
4946             }]);
4947
4948             return AbortSignal;
4949           }(Emitter);
4950           var AbortController =
4951           /*#__PURE__*/
4952           function () {
4953             function AbortController() {
4954               _classCallCheck(this, AbortController);
4955
4956               // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4957               // we want Object.keys(new AbortController()) to be [] for compat with the native impl
4958               Object.defineProperty(this, 'signal', {
4959                 value: new AbortSignal(),
4960                 writable: true,
4961                 configurable: true
4962               });
4963             }
4964
4965             _createClass(AbortController, [{
4966               key: "abort",
4967               value: function abort() {
4968                 var event;
4969
4970                 try {
4971                   event = new Event('abort');
4972                 } catch (e) {
4973                   if (typeof document !== 'undefined') {
4974                     if (!document.createEvent) {
4975                       // For Internet Explorer 8:
4976                       event = document.createEventObject();
4977                       event.type = 'abort';
4978                     } else {
4979                       // For Internet Explorer 11:
4980                       event = document.createEvent('Event');
4981                       event.initEvent('abort', false, false);
4982                     }
4983                   } else {
4984                     // Fallback where document isn't available:
4985                     event = {
4986                       type: 'abort',
4987                       bubbles: false,
4988                       cancelable: false
4989                     };
4990                   }
4991                 }
4992
4993                 this.signal.dispatchEvent(event);
4994               }
4995             }, {
4996               key: "toString",
4997               value: function toString() {
4998                 return '[object AbortController]';
4999               }
5000             }]);
5001
5002             return AbortController;
5003           }();
5004
5005           if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
5006             // These are necessary to make sure that we get correct output for:
5007             // Object.prototype.toString.call(new AbortController())
5008             AbortController.prototype[Symbol.toStringTag] = 'AbortController';
5009             AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
5010           }
5011
5012           function polyfillNeeded(self) {
5013             if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5014               console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
5015               return true;
5016             } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5017             // defining window.Request, and this polyfill need to work on top of unfetch
5018             // so the below feature detection needs the !self.AbortController part.
5019             // The Request.prototype check is also needed because Safari versions 11.1.2
5020             // up to and including 12.1.x has a window.AbortController present but still
5021             // does NOT correctly implement abortable fetch:
5022             // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
5023
5024
5025             return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
5026           }
5027
5028           /**
5029            * Note: the "fetch.Request" default value is available for fetch imported from
5030            * the "node-fetch" package and not in browsers. This is OK since browsers
5031            * will be importing umd-polyfill.js from that path "self" is passed the
5032            * decorator so the default value will not be used (because browsers that define
5033            * fetch also has Request). One quirky setup where self.fetch exists but
5034            * self.Request does not is when the "unfetch" minimal fetch polyfill is used
5035            * on top of IE11; for this case the browser will try to use the fetch.Request
5036            * default value which in turn will be undefined but then then "if (Request)"
5037            * will ensure that you get a patched fetch but still no Request (as expected).
5038            * @param {fetch, Request = fetch.Request}
5039            * @returns {fetch: abortableFetch, Request: AbortableRequest}
5040            */
5041
5042           function abortableFetchDecorator(patchTargets) {
5043             if ('function' === typeof patchTargets) {
5044               patchTargets = {
5045                 fetch: patchTargets
5046               };
5047             }
5048
5049             var _patchTargets = patchTargets,
5050                 fetch = _patchTargets.fetch,
5051                 _patchTargets$Request = _patchTargets.Request,
5052                 NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
5053                 NativeAbortController = _patchTargets.AbortController,
5054                 _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
5055                 __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
5056
5057             if (!polyfillNeeded({
5058               fetch: fetch,
5059               Request: NativeRequest,
5060               AbortController: NativeAbortController,
5061               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
5062             })) {
5063               return {
5064                 fetch: fetch,
5065                 Request: Request
5066               };
5067             }
5068
5069             var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5070             // defining window.Request, and this polyfill need to work on top of unfetch
5071             // hence we only patch it if it's available. Also we don't patch it if signal
5072             // is already available on the Request prototype because in this case support
5073             // is present and the patching below can cause a crash since it assigns to
5074             // request.signal which is technically a read-only property. This latter error
5075             // happens when you run the main5.js node-fetch example in the repo
5076             // "abortcontroller-polyfill-examples". The exact error is:
5077             //   request.signal = init.signal;
5078             //   ^
5079             // TypeError: Cannot set property signal of #<Request> which has only a getter
5080
5081             if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5082               Request = function Request(input, init) {
5083                 var signal;
5084
5085                 if (init && init.signal) {
5086                   signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
5087                   // been installed because if we're running on top of a browser with a
5088                   // working native AbortController (i.e. the polyfill was installed due to
5089                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5090                   // fake AbortSignal to the native fetch will trigger:
5091                   // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
5092
5093                   delete init.signal;
5094                 }
5095
5096                 var request = new NativeRequest(input, init);
5097
5098                 if (signal) {
5099                   Object.defineProperty(request, 'signal', {
5100                     writable: false,
5101                     enumerable: false,
5102                     configurable: true,
5103                     value: signal
5104                   });
5105                 }
5106
5107                 return request;
5108               };
5109
5110               Request.prototype = NativeRequest.prototype;
5111             }
5112
5113             var realFetch = fetch;
5114
5115             var abortableFetch = function abortableFetch(input, init) {
5116               var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
5117
5118               if (signal) {
5119                 var abortError;
5120
5121                 try {
5122                   abortError = new DOMException('Aborted', 'AbortError');
5123                 } catch (err) {
5124                   // IE 11 does not support calling the DOMException constructor, use a
5125                   // regular error object on it instead.
5126                   abortError = new Error('Aborted');
5127                   abortError.name = 'AbortError';
5128                 } // Return early if already aborted, thus avoiding making an HTTP request
5129
5130
5131                 if (signal.aborted) {
5132                   return Promise.reject(abortError);
5133                 } // Turn an event into a promise, reject it once `abort` is dispatched
5134
5135
5136                 var cancellation = new Promise(function (_, reject) {
5137                   signal.addEventListener('abort', function () {
5138                     return reject(abortError);
5139                   }, {
5140                     once: true
5141                   });
5142                 });
5143
5144                 if (init && init.signal) {
5145                   // Never pass .signal to the native implementation when the polyfill has
5146                   // been installed because if we're running on top of a browser with a
5147                   // working native AbortController (i.e. the polyfill was installed due to
5148                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5149                   // fake AbortSignal to the native fetch will trigger:
5150                   // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
5151                   delete init.signal;
5152                 } // Return the fastest promise (don't need to wait for request to finish)
5153
5154
5155                 return Promise.race([cancellation, realFetch(input, init)]);
5156               }
5157
5158               return realFetch(input, init);
5159             };
5160
5161             return {
5162               fetch: abortableFetch,
5163               Request: Request
5164             };
5165           }
5166
5167           (function (self) {
5168
5169             if (!polyfillNeeded(self)) {
5170               return;
5171             }
5172
5173             if (!self.fetch) {
5174               console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
5175               return;
5176             }
5177
5178             var _abortableFetch = abortableFetchDecorator(self),
5179                 fetch = _abortableFetch.fetch,
5180                 Request = _abortableFetch.Request;
5181
5182             self.fetch = fetch;
5183             self.Request = Request;
5184             Object.defineProperty(self, 'AbortController', {
5185               writable: true,
5186               enumerable: false,
5187               configurable: true,
5188               value: AbortController
5189             });
5190             Object.defineProperty(self, 'AbortSignal', {
5191               writable: true,
5192               enumerable: false,
5193               configurable: true,
5194               value: AbortSignal
5195             });
5196           })(typeof self !== 'undefined' ? self : commonjsGlobal);
5197
5198         }));
5199
5200         var version = "5.9.2";
5201
5202         function d3_ascending(a, b) {
5203           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
5204         }
5205
5206         function d3_bisector(compare) {
5207           if (compare.length === 1) compare = ascendingComparator(compare);
5208           return {
5209             left: function(a, x, lo, hi) {
5210               if (lo == null) lo = 0;
5211               if (hi == null) hi = a.length;
5212               while (lo < hi) {
5213                 var mid = lo + hi >>> 1;
5214                 if (compare(a[mid], x) < 0) lo = mid + 1;
5215                 else hi = mid;
5216               }
5217               return lo;
5218             },
5219             right: function(a, x, lo, hi) {
5220               if (lo == null) lo = 0;
5221               if (hi == null) hi = a.length;
5222               while (lo < hi) {
5223                 var mid = lo + hi >>> 1;
5224                 if (compare(a[mid], x) > 0) hi = mid;
5225                 else lo = mid + 1;
5226               }
5227               return lo;
5228             }
5229           };
5230         }
5231
5232         function ascendingComparator(f) {
5233           return function(d, x) {
5234             return d3_ascending(f(d), x);
5235           };
5236         }
5237
5238         var ascendingBisect = d3_bisector(d3_ascending);
5239         var bisectRight = ascendingBisect.right;
5240         var bisectLeft = ascendingBisect.left;
5241
5242         function pairs(array, f) {
5243           if (f == null) f = pair;
5244           var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
5245           while (i < n) pairs[i] = f(p, p = array[++i]);
5246           return pairs;
5247         }
5248
5249         function pair(a, b) {
5250           return [a, b];
5251         }
5252
5253         function cross(values0, values1, reduce) {
5254           var n0 = values0.length,
5255               n1 = values1.length,
5256               values = new Array(n0 * n1),
5257               i0,
5258               i1,
5259               i,
5260               value0;
5261
5262           if (reduce == null) reduce = pair;
5263
5264           for (i0 = i = 0; i0 < n0; ++i0) {
5265             for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
5266               values[i] = reduce(value0, values1[i1]);
5267             }
5268           }
5269
5270           return values;
5271         }
5272
5273         function d3_descending(a, b) {
5274           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
5275         }
5276
5277         function number(x) {
5278           return x === null ? NaN : +x;
5279         }
5280
5281         function variance(values, valueof) {
5282           var n = values.length,
5283               m = 0,
5284               i = -1,
5285               mean = 0,
5286               value,
5287               delta,
5288               sum = 0;
5289
5290           if (valueof == null) {
5291             while (++i < n) {
5292               if (!isNaN(value = number(values[i]))) {
5293                 delta = value - mean;
5294                 mean += delta / ++m;
5295                 sum += delta * (value - mean);
5296               }
5297             }
5298           }
5299
5300           else {
5301             while (++i < n) {
5302               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5303                 delta = value - mean;
5304                 mean += delta / ++m;
5305                 sum += delta * (value - mean);
5306               }
5307             }
5308           }
5309
5310           if (m > 1) return sum / (m - 1);
5311         }
5312
5313         function deviation(array, f) {
5314           var v = variance(array, f);
5315           return v ? Math.sqrt(v) : v;
5316         }
5317
5318         function extent(values, valueof) {
5319           var n = values.length,
5320               i = -1,
5321               value,
5322               min,
5323               max;
5324
5325           if (valueof == null) {
5326             while (++i < n) { // Find the first comparable value.
5327               if ((value = values[i]) != null && value >= value) {
5328                 min = max = value;
5329                 while (++i < n) { // Compare the remaining values.
5330                   if ((value = values[i]) != null) {
5331                     if (min > value) min = value;
5332                     if (max < value) max = value;
5333                   }
5334                 }
5335               }
5336             }
5337           }
5338
5339           else {
5340             while (++i < n) { // Find the first comparable value.
5341               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5342                 min = max = value;
5343                 while (++i < n) { // Compare the remaining values.
5344                   if ((value = valueof(values[i], i, values)) != null) {
5345                     if (min > value) min = value;
5346                     if (max < value) max = value;
5347                   }
5348                 }
5349               }
5350             }
5351           }
5352
5353           return [min, max];
5354         }
5355
5356         var array$1 = Array.prototype;
5357
5358         var slice$4 = array$1.slice;
5359         var map$2 = array$1.map;
5360
5361         function constant(x) {
5362           return function() {
5363             return x;
5364           };
5365         }
5366
5367         function identity(x) {
5368           return x;
5369         }
5370
5371         function d3_range(start, stop, step) {
5372           start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
5373
5374           var i = -1,
5375               n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
5376               range = new Array(n);
5377
5378           while (++i < n) {
5379             range[i] = start + i * step;
5380           }
5381
5382           return range;
5383         }
5384
5385         var e10 = Math.sqrt(50),
5386             e5 = Math.sqrt(10),
5387             e2 = Math.sqrt(2);
5388
5389         function ticks(start, stop, count) {
5390           var reverse,
5391               i = -1,
5392               n,
5393               ticks,
5394               step;
5395
5396           stop = +stop, start = +start, count = +count;
5397           if (start === stop && count > 0) return [start];
5398           if (reverse = stop < start) n = start, start = stop, stop = n;
5399           if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
5400
5401           if (step > 0) {
5402             start = Math.ceil(start / step);
5403             stop = Math.floor(stop / step);
5404             ticks = new Array(n = Math.ceil(stop - start + 1));
5405             while (++i < n) ticks[i] = (start + i) * step;
5406           } else {
5407             start = Math.floor(start * step);
5408             stop = Math.ceil(stop * step);
5409             ticks = new Array(n = Math.ceil(start - stop + 1));
5410             while (++i < n) ticks[i] = (start - i) / step;
5411           }
5412
5413           if (reverse) ticks.reverse();
5414
5415           return ticks;
5416         }
5417
5418         function tickIncrement(start, stop, count) {
5419           var step = (stop - start) / Math.max(0, count),
5420               power = Math.floor(Math.log(step) / Math.LN10),
5421               error = step / Math.pow(10, power);
5422           return power >= 0
5423               ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
5424               : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
5425         }
5426
5427         function tickStep(start, stop, count) {
5428           var step0 = Math.abs(stop - start) / Math.max(0, count),
5429               step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
5430               error = step0 / step1;
5431           if (error >= e10) step1 *= 10;
5432           else if (error >= e5) step1 *= 5;
5433           else if (error >= e2) step1 *= 2;
5434           return stop < start ? -step1 : step1;
5435         }
5436
5437         function thresholdSturges(values) {
5438           return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
5439         }
5440
5441         function histogram() {
5442           var value = identity,
5443               domain = extent,
5444               threshold = thresholdSturges;
5445
5446           function histogram(data) {
5447             var i,
5448                 n = data.length,
5449                 x,
5450                 values = new Array(n);
5451
5452             for (i = 0; i < n; ++i) {
5453               values[i] = value(data[i], i, data);
5454             }
5455
5456             var xz = domain(values),
5457                 x0 = xz[0],
5458                 x1 = xz[1],
5459                 tz = threshold(values, x0, x1);
5460
5461             // Convert number of thresholds into uniform thresholds.
5462             if (!Array.isArray(tz)) {
5463               tz = tickStep(x0, x1, tz);
5464               tz = d3_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
5465             }
5466
5467             // Remove any thresholds outside the domain.
5468             var m = tz.length;
5469             while (tz[0] <= x0) tz.shift(), --m;
5470             while (tz[m - 1] > x1) tz.pop(), --m;
5471
5472             var bins = new Array(m + 1),
5473                 bin;
5474
5475             // Initialize bins.
5476             for (i = 0; i <= m; ++i) {
5477               bin = bins[i] = [];
5478               bin.x0 = i > 0 ? tz[i - 1] : x0;
5479               bin.x1 = i < m ? tz[i] : x1;
5480             }
5481
5482             // Assign data to bins by value, ignoring any outside the domain.
5483             for (i = 0; i < n; ++i) {
5484               x = values[i];
5485               if (x0 <= x && x <= x1) {
5486                 bins[bisectRight(tz, x, 0, m)].push(data[i]);
5487               }
5488             }
5489
5490             return bins;
5491           }
5492
5493           histogram.value = function(_) {
5494             return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
5495           };
5496
5497           histogram.domain = function(_) {
5498             return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
5499           };
5500
5501           histogram.thresholds = function(_) {
5502             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice$4.call(_)) : constant(_), histogram) : threshold;
5503           };
5504
5505           return histogram;
5506         }
5507
5508         function threshold(values, p, valueof) {
5509           if (valueof == null) valueof = number;
5510           if (!(n = values.length)) return;
5511           if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
5512           if (p >= 1) return +valueof(values[n - 1], n - 1, values);
5513           var n,
5514               i = (n - 1) * p,
5515               i0 = Math.floor(i),
5516               value0 = +valueof(values[i0], i0, values),
5517               value1 = +valueof(values[i0 + 1], i0 + 1, values);
5518           return value0 + (value1 - value0) * (i - i0);
5519         }
5520
5521         function freedmanDiaconis(values, min, max) {
5522           values = map$2.call(values, number).sort(d3_ascending);
5523           return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
5524         }
5525
5526         function scott(values, min, max) {
5527           return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
5528         }
5529
5530         function max$2(values, valueof) {
5531           var n = values.length,
5532               i = -1,
5533               value,
5534               max;
5535
5536           if (valueof == null) {
5537             while (++i < n) { // Find the first comparable value.
5538               if ((value = values[i]) != null && value >= value) {
5539                 max = value;
5540                 while (++i < n) { // Compare the remaining values.
5541                   if ((value = values[i]) != null && value > max) {
5542                     max = value;
5543                   }
5544                 }
5545               }
5546             }
5547           }
5548
5549           else {
5550             while (++i < n) { // Find the first comparable value.
5551               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5552                 max = value;
5553                 while (++i < n) { // Compare the remaining values.
5554                   if ((value = valueof(values[i], i, values)) != null && value > max) {
5555                     max = value;
5556                   }
5557                 }
5558               }
5559             }
5560           }
5561
5562           return max;
5563         }
5564
5565         function mean(values, valueof) {
5566           var n = values.length,
5567               m = n,
5568               i = -1,
5569               value,
5570               sum = 0;
5571
5572           if (valueof == null) {
5573             while (++i < n) {
5574               if (!isNaN(value = number(values[i]))) sum += value;
5575               else --m;
5576             }
5577           }
5578
5579           else {
5580             while (++i < n) {
5581               if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
5582               else --m;
5583             }
5584           }
5585
5586           if (m) return sum / m;
5587         }
5588
5589         function d3_median(values, valueof) {
5590           var n = values.length,
5591               i = -1,
5592               value,
5593               numbers = [];
5594
5595           if (valueof == null) {
5596             while (++i < n) {
5597               if (!isNaN(value = number(values[i]))) {
5598                 numbers.push(value);
5599               }
5600             }
5601           }
5602
5603           else {
5604             while (++i < n) {
5605               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5606                 numbers.push(value);
5607               }
5608             }
5609           }
5610
5611           return threshold(numbers.sort(d3_ascending), 0.5);
5612         }
5613
5614         function merge(arrays) {
5615           var n = arrays.length,
5616               m,
5617               i = -1,
5618               j = 0,
5619               merged,
5620               array;
5621
5622           while (++i < n) j += arrays[i].length;
5623           merged = new Array(j);
5624
5625           while (--n >= 0) {
5626             array = arrays[n];
5627             m = array.length;
5628             while (--m >= 0) {
5629               merged[--j] = array[m];
5630             }
5631           }
5632
5633           return merged;
5634         }
5635
5636         function min(values, valueof) {
5637           var n = values.length,
5638               i = -1,
5639               value,
5640               min;
5641
5642           if (valueof == null) {
5643             while (++i < n) { // Find the first comparable value.
5644               if ((value = values[i]) != null && value >= value) {
5645                 min = value;
5646                 while (++i < n) { // Compare the remaining values.
5647                   if ((value = values[i]) != null && min > value) {
5648                     min = value;
5649                   }
5650                 }
5651               }
5652             }
5653           }
5654
5655           else {
5656             while (++i < n) { // Find the first comparable value.
5657               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5658                 min = value;
5659                 while (++i < n) { // Compare the remaining values.
5660                   if ((value = valueof(values[i], i, values)) != null && min > value) {
5661                     min = value;
5662                   }
5663                 }
5664               }
5665             }
5666           }
5667
5668           return min;
5669         }
5670
5671         function permute(array, indexes) {
5672           var i = indexes.length, permutes = new Array(i);
5673           while (i--) permutes[i] = array[indexes[i]];
5674           return permutes;
5675         }
5676
5677         function scan(values, compare) {
5678           if (!(n = values.length)) return;
5679           var n,
5680               i = 0,
5681               j = 0,
5682               xi,
5683               xj = values[j];
5684
5685           if (compare == null) compare = d3_ascending;
5686
5687           while (++i < n) {
5688             if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
5689               xj = xi, j = i;
5690             }
5691           }
5692
5693           if (compare(xj, xj) === 0) return j;
5694         }
5695
5696         function shuffle(array, i0, i1) {
5697           var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
5698               t,
5699               i;
5700
5701           while (m) {
5702             i = Math.random() * m-- | 0;
5703             t = array[m + i0];
5704             array[m + i0] = array[i + i0];
5705             array[i + i0] = t;
5706           }
5707
5708           return array;
5709         }
5710
5711         function sum(values, valueof) {
5712           var n = values.length,
5713               i = -1,
5714               value,
5715               sum = 0;
5716
5717           if (valueof == null) {
5718             while (++i < n) {
5719               if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
5720             }
5721           }
5722
5723           else {
5724             while (++i < n) {
5725               if (value = +valueof(values[i], i, values)) sum += value;
5726             }
5727           }
5728
5729           return sum;
5730         }
5731
5732         function transpose(matrix) {
5733           if (!(n = matrix.length)) return [];
5734           for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
5735             for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
5736               row[j] = matrix[j][i];
5737             }
5738           }
5739           return transpose;
5740         }
5741
5742         function length(d) {
5743           return d.length;
5744         }
5745
5746         function zip() {
5747           return transpose(arguments);
5748         }
5749
5750         var slice$5 = Array.prototype.slice;
5751
5752         function identity$1(x) {
5753           return x;
5754         }
5755
5756         var top = 1,
5757             right = 2,
5758             bottom = 3,
5759             left = 4,
5760             epsilon = 1e-6;
5761
5762         function translateX(x) {
5763           return "translate(" + (x + 0.5) + ",0)";
5764         }
5765
5766         function translateY(y) {
5767           return "translate(0," + (y + 0.5) + ")";
5768         }
5769
5770         function number$1(scale) {
5771           return function(d) {
5772             return +scale(d);
5773           };
5774         }
5775
5776         function center(scale) {
5777           var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
5778           if (scale.round()) offset = Math.round(offset);
5779           return function(d) {
5780             return +scale(d) + offset;
5781           };
5782         }
5783
5784         function entering() {
5785           return !this.__axis;
5786         }
5787
5788         function axis(orient, scale) {
5789           var tickArguments = [],
5790               tickValues = null,
5791               tickFormat = null,
5792               tickSizeInner = 6,
5793               tickSizeOuter = 6,
5794               tickPadding = 3,
5795               k = orient === top || orient === left ? -1 : 1,
5796               x = orient === left || orient === right ? "x" : "y",
5797               transform = orient === top || orient === bottom ? translateX : translateY;
5798
5799           function axis(context) {
5800             var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
5801                 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
5802                 spacing = Math.max(tickSizeInner, 0) + tickPadding,
5803                 range = scale.range(),
5804                 range0 = +range[0] + 0.5,
5805                 range1 = +range[range.length - 1] + 0.5,
5806                 position = (scale.bandwidth ? center : number$1)(scale.copy()),
5807                 selection = context.selection ? context.selection() : context,
5808                 path = selection.selectAll(".domain").data([null]),
5809                 tick = selection.selectAll(".tick").data(values, scale).order(),
5810                 tickExit = tick.exit(),
5811                 tickEnter = tick.enter().append("g").attr("class", "tick"),
5812                 line = tick.select("line"),
5813                 text = tick.select("text");
5814
5815             path = path.merge(path.enter().insert("path", ".tick")
5816                 .attr("class", "domain")
5817                 .attr("stroke", "currentColor"));
5818
5819             tick = tick.merge(tickEnter);
5820
5821             line = line.merge(tickEnter.append("line")
5822                 .attr("stroke", "currentColor")
5823                 .attr(x + "2", k * tickSizeInner));
5824
5825             text = text.merge(tickEnter.append("text")
5826                 .attr("fill", "currentColor")
5827                 .attr(x, k * spacing)
5828                 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
5829
5830             if (context !== selection) {
5831               path = path.transition(context);
5832               tick = tick.transition(context);
5833               line = line.transition(context);
5834               text = text.transition(context);
5835
5836               tickExit = tickExit.transition(context)
5837                   .attr("opacity", epsilon)
5838                   .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
5839
5840               tickEnter
5841                   .attr("opacity", epsilon)
5842                   .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
5843             }
5844
5845             tickExit.remove();
5846
5847             path
5848                 .attr("d", orient === left || orient == right
5849                     ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
5850                     : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
5851
5852             tick
5853                 .attr("opacity", 1)
5854                 .attr("transform", function(d) { return transform(position(d)); });
5855
5856             line
5857                 .attr(x + "2", k * tickSizeInner);
5858
5859             text
5860                 .attr(x, k * spacing)
5861                 .text(format);
5862
5863             selection.filter(entering)
5864                 .attr("fill", "none")
5865                 .attr("font-size", 10)
5866                 .attr("font-family", "sans-serif")
5867                 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
5868
5869             selection
5870                 .each(function() { this.__axis = position; });
5871           }
5872
5873           axis.scale = function(_) {
5874             return arguments.length ? (scale = _, axis) : scale;
5875           };
5876
5877           axis.ticks = function() {
5878             return tickArguments = slice$5.call(arguments), axis;
5879           };
5880
5881           axis.tickArguments = function(_) {
5882             return arguments.length ? (tickArguments = _ == null ? [] : slice$5.call(_), axis) : tickArguments.slice();
5883           };
5884
5885           axis.tickValues = function(_) {
5886             return arguments.length ? (tickValues = _ == null ? null : slice$5.call(_), axis) : tickValues && tickValues.slice();
5887           };
5888
5889           axis.tickFormat = function(_) {
5890             return arguments.length ? (tickFormat = _, axis) : tickFormat;
5891           };
5892
5893           axis.tickSize = function(_) {
5894             return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
5895           };
5896
5897           axis.tickSizeInner = function(_) {
5898             return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
5899           };
5900
5901           axis.tickSizeOuter = function(_) {
5902             return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
5903           };
5904
5905           axis.tickPadding = function(_) {
5906             return arguments.length ? (tickPadding = +_, axis) : tickPadding;
5907           };
5908
5909           return axis;
5910         }
5911
5912         function axisTop(scale) {
5913           return axis(top, scale);
5914         }
5915
5916         function axisRight(scale) {
5917           return axis(right, scale);
5918         }
5919
5920         function axisBottom(scale) {
5921           return axis(bottom, scale);
5922         }
5923
5924         function axisLeft(scale) {
5925           return axis(left, scale);
5926         }
5927
5928         var noop$2 = {value: function() {}};
5929
5930         function dispatch() {
5931           for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
5932             if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
5933             _[t] = [];
5934           }
5935           return new Dispatch(_);
5936         }
5937
5938         function Dispatch(_) {
5939           this._ = _;
5940         }
5941
5942         function parseTypenames(typenames, types) {
5943           return typenames.trim().split(/^|\s+/).map(function(t) {
5944             var name = "", i = t.indexOf(".");
5945             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
5946             if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
5947             return {type: t, name: name};
5948           });
5949         }
5950
5951         Dispatch.prototype = dispatch.prototype = {
5952           constructor: Dispatch,
5953           on: function(typename, callback) {
5954             var _ = this._,
5955                 T = parseTypenames(typename + "", _),
5956                 t,
5957                 i = -1,
5958                 n = T.length;
5959
5960             // If no callback was specified, return the callback of the given type and name.
5961             if (arguments.length < 2) {
5962               while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t;
5963               return;
5964             }
5965
5966             // If a type was specified, set the callback for the given type and name.
5967             // Otherwise, if a null callback was specified, remove callbacks of the given name.
5968             if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
5969             while (++i < n) {
5970               if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
5971               else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
5972             }
5973
5974             return this;
5975           },
5976           copy: function() {
5977             var copy = {}, _ = this._;
5978             for (var t in _) copy[t] = _[t].slice();
5979             return new Dispatch(copy);
5980           },
5981           call: function(type, that) {
5982             if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
5983             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5984             for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5985           },
5986           apply: function(type, that, args) {
5987             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5988             for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5989           }
5990         };
5991
5992         function get$1(type, name) {
5993           for (var i = 0, n = type.length, c; i < n; ++i) {
5994             if ((c = type[i]).name === name) {
5995               return c.value;
5996             }
5997           }
5998         }
5999
6000         function set(type, name, callback) {
6001           for (var i = 0, n = type.length; i < n; ++i) {
6002             if (type[i].name === name) {
6003               type[i] = noop$2, type = type.slice(0, i).concat(type.slice(i + 1));
6004               break;
6005             }
6006           }
6007           if (callback != null) type.push({name: name, value: callback});
6008           return type;
6009         }
6010
6011         var xhtml = "http://www.w3.org/1999/xhtml";
6012
6013         var namespaces = {
6014           svg: "http://www.w3.org/2000/svg",
6015           xhtml: xhtml,
6016           xlink: "http://www.w3.org/1999/xlink",
6017           xml: "http://www.w3.org/XML/1998/namespace",
6018           xmlns: "http://www.w3.org/2000/xmlns/"
6019         };
6020
6021         function namespace(name) {
6022           var prefix = name += "", i = prefix.indexOf(":");
6023           if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
6024           return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
6025         }
6026
6027         function creatorInherit(name) {
6028           return function() {
6029             var document = this.ownerDocument,
6030                 uri = this.namespaceURI;
6031             return uri === xhtml && document.documentElement.namespaceURI === xhtml
6032                 ? document.createElement(name)
6033                 : document.createElementNS(uri, name);
6034           };
6035         }
6036
6037         function creatorFixed(fullname) {
6038           return function() {
6039             return this.ownerDocument.createElementNS(fullname.space, fullname.local);
6040           };
6041         }
6042
6043         function creator(name) {
6044           var fullname = namespace(name);
6045           return (fullname.local
6046               ? creatorFixed
6047               : creatorInherit)(fullname);
6048         }
6049
6050         function none() {}
6051
6052         function selector(selector) {
6053           return selector == null ? none : function() {
6054             return this.querySelector(selector);
6055           };
6056         }
6057
6058         function selection_select(select) {
6059           if (typeof select !== "function") select = selector(select);
6060
6061           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6062             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
6063               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
6064                 if ("__data__" in node) subnode.__data__ = node.__data__;
6065                 subgroup[i] = subnode;
6066               }
6067             }
6068           }
6069
6070           return new Selection(subgroups, this._parents);
6071         }
6072
6073         function empty() {
6074           return [];
6075         }
6076
6077         function selectorAll(selector) {
6078           return selector == null ? empty : function() {
6079             return this.querySelectorAll(selector);
6080           };
6081         }
6082
6083         function selection_selectAll(select) {
6084           if (typeof select !== "function") select = selectorAll(select);
6085
6086           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
6087             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
6088               if (node = group[i]) {
6089                 subgroups.push(select.call(node, node.__data__, i, group));
6090                 parents.push(node);
6091               }
6092             }
6093           }
6094
6095           return new Selection(subgroups, parents);
6096         }
6097
6098         function matcher(selector) {
6099           return function() {
6100             return this.matches(selector);
6101           };
6102         }
6103
6104         function selection_filter(match) {
6105           if (typeof match !== "function") match = matcher(match);
6106
6107           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6108             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
6109               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
6110                 subgroup.push(node);
6111               }
6112             }
6113           }
6114
6115           return new Selection(subgroups, this._parents);
6116         }
6117
6118         function sparse(update) {
6119           return new Array(update.length);
6120         }
6121
6122         function selection_enter() {
6123           return new Selection(this._enter || this._groups.map(sparse), this._parents);
6124         }
6125
6126         function EnterNode(parent, datum) {
6127           this.ownerDocument = parent.ownerDocument;
6128           this.namespaceURI = parent.namespaceURI;
6129           this._next = null;
6130           this._parent = parent;
6131           this.__data__ = datum;
6132         }
6133
6134         EnterNode.prototype = {
6135           constructor: EnterNode,
6136           appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
6137           insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
6138           querySelector: function(selector) { return this._parent.querySelector(selector); },
6139           querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
6140         };
6141
6142         function constant$1(x) {
6143           return function() {
6144             return x;
6145           };
6146         }
6147
6148         var keyPrefix = "$"; // Protect against keys like “__proto__”.
6149
6150         function bindIndex(parent, group, enter, update, exit, data) {
6151           var i = 0,
6152               node,
6153               groupLength = group.length,
6154               dataLength = data.length;
6155
6156           // Put any non-null nodes that fit into update.
6157           // Put any null nodes into enter.
6158           // Put any remaining data into enter.
6159           for (; i < dataLength; ++i) {
6160             if (node = group[i]) {
6161               node.__data__ = data[i];
6162               update[i] = node;
6163             } else {
6164               enter[i] = new EnterNode(parent, data[i]);
6165             }
6166           }
6167
6168           // Put any non-null nodes that don’t fit into exit.
6169           for (; i < groupLength; ++i) {
6170             if (node = group[i]) {
6171               exit[i] = node;
6172             }
6173           }
6174         }
6175
6176         function bindKey(parent, group, enter, update, exit, data, key) {
6177           var i,
6178               node,
6179               nodeByKeyValue = {},
6180               groupLength = group.length,
6181               dataLength = data.length,
6182               keyValues = new Array(groupLength),
6183               keyValue;
6184
6185           // Compute the key for each node.
6186           // If multiple nodes have the same key, the duplicates are added to exit.
6187           for (i = 0; i < groupLength; ++i) {
6188             if (node = group[i]) {
6189               keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
6190               if (keyValue in nodeByKeyValue) {
6191                 exit[i] = node;
6192               } else {
6193                 nodeByKeyValue[keyValue] = node;
6194               }
6195             }
6196           }
6197
6198           // Compute the key for each datum.
6199           // If there a node associated with this key, join and add it to update.
6200           // If there is not (or the key is a duplicate), add it to enter.
6201           for (i = 0; i < dataLength; ++i) {
6202             keyValue = keyPrefix + key.call(parent, data[i], i, data);
6203             if (node = nodeByKeyValue[keyValue]) {
6204               update[i] = node;
6205               node.__data__ = data[i];
6206               nodeByKeyValue[keyValue] = null;
6207             } else {
6208               enter[i] = new EnterNode(parent, data[i]);
6209             }
6210           }
6211
6212           // Add any remaining nodes that were not bound to data to exit.
6213           for (i = 0; i < groupLength; ++i) {
6214             if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
6215               exit[i] = node;
6216             }
6217           }
6218         }
6219
6220         function selection_data(value, key) {
6221           if (!value) {
6222             data = new Array(this.size()), j = -1;
6223             this.each(function(d) { data[++j] = d; });
6224             return data;
6225           }
6226
6227           var bind = key ? bindKey : bindIndex,
6228               parents = this._parents,
6229               groups = this._groups;
6230
6231           if (typeof value !== "function") value = constant$1(value);
6232
6233           for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
6234             var parent = parents[j],
6235                 group = groups[j],
6236                 groupLength = group.length,
6237                 data = value.call(parent, parent && parent.__data__, j, parents),
6238                 dataLength = data.length,
6239                 enterGroup = enter[j] = new Array(dataLength),
6240                 updateGroup = update[j] = new Array(dataLength),
6241                 exitGroup = exit[j] = new Array(groupLength);
6242
6243             bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
6244
6245             // Now connect the enter nodes to their following update node, such that
6246             // appendChild can insert the materialized enter node before this node,
6247             // rather than at the end of the parent node.
6248             for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
6249               if (previous = enterGroup[i0]) {
6250                 if (i0 >= i1) i1 = i0 + 1;
6251                 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
6252                 previous._next = next || null;
6253               }
6254             }
6255           }
6256
6257           update = new Selection(update, parents);
6258           update._enter = enter;
6259           update._exit = exit;
6260           return update;
6261         }
6262
6263         function selection_exit() {
6264           return new Selection(this._exit || this._groups.map(sparse), this._parents);
6265         }
6266
6267         function selection_join(onenter, onupdate, onexit) {
6268           var enter = this.enter(), update = this, exit = this.exit();
6269           enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
6270           if (onupdate != null) update = onupdate(update);
6271           if (onexit == null) exit.remove(); else onexit(exit);
6272           return enter && update ? enter.merge(update).order() : update;
6273         }
6274
6275         function selection_merge(selection) {
6276
6277           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) {
6278             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
6279               if (node = group0[i] || group1[i]) {
6280                 merge[i] = node;
6281               }
6282             }
6283           }
6284
6285           for (; j < m0; ++j) {
6286             merges[j] = groups0[j];
6287           }
6288
6289           return new Selection(merges, this._parents);
6290         }
6291
6292         function selection_order() {
6293
6294           for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
6295             for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
6296               if (node = group[i]) {
6297                 if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
6298                 next = node;
6299               }
6300             }
6301           }
6302
6303           return this;
6304         }
6305
6306         function selection_sort(compare) {
6307           if (!compare) compare = ascending;
6308
6309           function compareNode(a, b) {
6310             return a && b ? compare(a.__data__, b.__data__) : !a - !b;
6311           }
6312
6313           for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
6314             for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
6315               if (node = group[i]) {
6316                 sortgroup[i] = node;
6317               }
6318             }
6319             sortgroup.sort(compareNode);
6320           }
6321
6322           return new Selection(sortgroups, this._parents).order();
6323         }
6324
6325         function ascending(a, b) {
6326           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6327         }
6328
6329         function selection_call() {
6330           var callback = arguments[0];
6331           arguments[0] = this;
6332           callback.apply(null, arguments);
6333           return this;
6334         }
6335
6336         function selection_nodes() {
6337           var nodes = new Array(this.size()), i = -1;
6338           this.each(function() { nodes[++i] = this; });
6339           return nodes;
6340         }
6341
6342         function selection_node() {
6343
6344           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6345             for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
6346               var node = group[i];
6347               if (node) return node;
6348             }
6349           }
6350
6351           return null;
6352         }
6353
6354         function selection_size() {
6355           var size = 0;
6356           this.each(function() { ++size; });
6357           return size;
6358         }
6359
6360         function selection_empty() {
6361           return !this.node();
6362         }
6363
6364         function selection_each(callback) {
6365
6366           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6367             for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
6368               if (node = group[i]) callback.call(node, node.__data__, i, group);
6369             }
6370           }
6371
6372           return this;
6373         }
6374
6375         function attrRemove(name) {
6376           return function() {
6377             this.removeAttribute(name);
6378           };
6379         }
6380
6381         function attrRemoveNS(fullname) {
6382           return function() {
6383             this.removeAttributeNS(fullname.space, fullname.local);
6384           };
6385         }
6386
6387         function attrConstant(name, value) {
6388           return function() {
6389             this.setAttribute(name, value);
6390           };
6391         }
6392
6393         function attrConstantNS(fullname, value) {
6394           return function() {
6395             this.setAttributeNS(fullname.space, fullname.local, value);
6396           };
6397         }
6398
6399         function attrFunction(name, value) {
6400           return function() {
6401             var v = value.apply(this, arguments);
6402             if (v == null) this.removeAttribute(name);
6403             else this.setAttribute(name, v);
6404           };
6405         }
6406
6407         function attrFunctionNS(fullname, value) {
6408           return function() {
6409             var v = value.apply(this, arguments);
6410             if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
6411             else this.setAttributeNS(fullname.space, fullname.local, v);
6412           };
6413         }
6414
6415         function selection_attr(name, value) {
6416           var fullname = namespace(name);
6417
6418           if (arguments.length < 2) {
6419             var node = this.node();
6420             return fullname.local
6421                 ? node.getAttributeNS(fullname.space, fullname.local)
6422                 : node.getAttribute(fullname);
6423           }
6424
6425           return this.each((value == null
6426               ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
6427               ? (fullname.local ? attrFunctionNS : attrFunction)
6428               : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
6429         }
6430
6431         function defaultView(node) {
6432           return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
6433               || (node.document && node) // node is a Window
6434               || node.defaultView; // node is a Document
6435         }
6436
6437         function styleRemove(name) {
6438           return function() {
6439             this.style.removeProperty(name);
6440           };
6441         }
6442
6443         function styleConstant(name, value, priority) {
6444           return function() {
6445             this.style.setProperty(name, value, priority);
6446           };
6447         }
6448
6449         function styleFunction(name, value, priority) {
6450           return function() {
6451             var v = value.apply(this, arguments);
6452             if (v == null) this.style.removeProperty(name);
6453             else this.style.setProperty(name, v, priority);
6454           };
6455         }
6456
6457         function selection_style(name, value, priority) {
6458           return arguments.length > 1
6459               ? this.each((value == null
6460                     ? styleRemove : typeof value === "function"
6461                     ? styleFunction
6462                     : styleConstant)(name, value, priority == null ? "" : priority))
6463               : styleValue(this.node(), name);
6464         }
6465
6466         function styleValue(node, name) {
6467           return node.style.getPropertyValue(name)
6468               || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
6469         }
6470
6471         function propertyRemove(name) {
6472           return function() {
6473             delete this[name];
6474           };
6475         }
6476
6477         function propertyConstant(name, value) {
6478           return function() {
6479             this[name] = value;
6480           };
6481         }
6482
6483         function propertyFunction(name, value) {
6484           return function() {
6485             var v = value.apply(this, arguments);
6486             if (v == null) delete this[name];
6487             else this[name] = v;
6488           };
6489         }
6490
6491         function selection_property(name, value) {
6492           return arguments.length > 1
6493               ? this.each((value == null
6494                   ? propertyRemove : typeof value === "function"
6495                   ? propertyFunction
6496                   : propertyConstant)(name, value))
6497               : this.node()[name];
6498         }
6499
6500         function classArray(string) {
6501           return string.trim().split(/^|\s+/);
6502         }
6503
6504         function classList(node) {
6505           return node.classList || new ClassList(node);
6506         }
6507
6508         function ClassList(node) {
6509           this._node = node;
6510           this._names = classArray(node.getAttribute("class") || "");
6511         }
6512
6513         ClassList.prototype = {
6514           add: function(name) {
6515             var i = this._names.indexOf(name);
6516             if (i < 0) {
6517               this._names.push(name);
6518               this._node.setAttribute("class", this._names.join(" "));
6519             }
6520           },
6521           remove: function(name) {
6522             var i = this._names.indexOf(name);
6523             if (i >= 0) {
6524               this._names.splice(i, 1);
6525               this._node.setAttribute("class", this._names.join(" "));
6526             }
6527           },
6528           contains: function(name) {
6529             return this._names.indexOf(name) >= 0;
6530           }
6531         };
6532
6533         function classedAdd(node, names) {
6534           var list = classList(node), i = -1, n = names.length;
6535           while (++i < n) list.add(names[i]);
6536         }
6537
6538         function classedRemove(node, names) {
6539           var list = classList(node), i = -1, n = names.length;
6540           while (++i < n) list.remove(names[i]);
6541         }
6542
6543         function classedTrue(names) {
6544           return function() {
6545             classedAdd(this, names);
6546           };
6547         }
6548
6549         function classedFalse(names) {
6550           return function() {
6551             classedRemove(this, names);
6552           };
6553         }
6554
6555         function classedFunction(names, value) {
6556           return function() {
6557             (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
6558           };
6559         }
6560
6561         function selection_classed(name, value) {
6562           var names = classArray(name + "");
6563
6564           if (arguments.length < 2) {
6565             var list = classList(this.node()), i = -1, n = names.length;
6566             while (++i < n) if (!list.contains(names[i])) return false;
6567             return true;
6568           }
6569
6570           return this.each((typeof value === "function"
6571               ? classedFunction : value
6572               ? classedTrue
6573               : classedFalse)(names, value));
6574         }
6575
6576         function textRemove() {
6577           this.textContent = "";
6578         }
6579
6580         function textConstant(value) {
6581           return function() {
6582             this.textContent = value;
6583           };
6584         }
6585
6586         function textFunction(value) {
6587           return function() {
6588             var v = value.apply(this, arguments);
6589             this.textContent = v == null ? "" : v;
6590           };
6591         }
6592
6593         function selection_text(value) {
6594           return arguments.length
6595               ? this.each(value == null
6596                   ? textRemove : (typeof value === "function"
6597                   ? textFunction
6598                   : textConstant)(value))
6599               : this.node().textContent;
6600         }
6601
6602         function htmlRemove() {
6603           this.innerHTML = "";
6604         }
6605
6606         function htmlConstant(value) {
6607           return function() {
6608             this.innerHTML = value;
6609           };
6610         }
6611
6612         function htmlFunction(value) {
6613           return function() {
6614             var v = value.apply(this, arguments);
6615             this.innerHTML = v == null ? "" : v;
6616           };
6617         }
6618
6619         function selection_html(value) {
6620           return arguments.length
6621               ? this.each(value == null
6622                   ? htmlRemove : (typeof value === "function"
6623                   ? htmlFunction
6624                   : htmlConstant)(value))
6625               : this.node().innerHTML;
6626         }
6627
6628         function raise() {
6629           if (this.nextSibling) this.parentNode.appendChild(this);
6630         }
6631
6632         function selection_raise() {
6633           return this.each(raise);
6634         }
6635
6636         function lower() {
6637           if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
6638         }
6639
6640         function selection_lower() {
6641           return this.each(lower);
6642         }
6643
6644         function selection_append(name) {
6645           var create = typeof name === "function" ? name : creator(name);
6646           return this.select(function() {
6647             return this.appendChild(create.apply(this, arguments));
6648           });
6649         }
6650
6651         function constantNull() {
6652           return null;
6653         }
6654
6655         function selection_insert(name, before) {
6656           var create = typeof name === "function" ? name : creator(name),
6657               select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
6658           return this.select(function() {
6659             return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
6660           });
6661         }
6662
6663         function remove() {
6664           var parent = this.parentNode;
6665           if (parent) parent.removeChild(this);
6666         }
6667
6668         function selection_remove() {
6669           return this.each(remove);
6670         }
6671
6672         function selection_cloneShallow() {
6673           return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
6674         }
6675
6676         function selection_cloneDeep() {
6677           return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
6678         }
6679
6680         function selection_clone(deep) {
6681           return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
6682         }
6683
6684         function selection_datum(value) {
6685           return arguments.length
6686               ? this.property("__data__", value)
6687               : this.node().__data__;
6688         }
6689
6690         var filterEvents = {};
6691
6692         var event = null;
6693
6694         if (typeof document !== "undefined") {
6695           var element = document.documentElement;
6696           if (!("onmouseenter" in element)) {
6697             filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
6698           }
6699         }
6700
6701         function filterContextListener(listener, index, group) {
6702           listener = contextListener(listener, index, group);
6703           return function(event) {
6704             var related = event.relatedTarget;
6705             if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
6706               listener.call(this, event);
6707             }
6708           };
6709         }
6710
6711         function contextListener(listener, index, group) {
6712           return function(event1) {
6713             var event0 = event; // Events can be reentrant (e.g., focus).
6714             event = event1;
6715             try {
6716               listener.call(this, this.__data__, index, group);
6717             } finally {
6718               event = event0;
6719             }
6720           };
6721         }
6722
6723         function parseTypenames$1(typenames) {
6724           return typenames.trim().split(/^|\s+/).map(function(t) {
6725             var name = "", i = t.indexOf(".");
6726             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6727             return {type: t, name: name};
6728           });
6729         }
6730
6731         function onRemove(typename) {
6732           return function() {
6733             var on = this.__on;
6734             if (!on) return;
6735             for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
6736               if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
6737                 this.removeEventListener(o.type, o.listener, o.capture);
6738               } else {
6739                 on[++i] = o;
6740               }
6741             }
6742             if (++i) on.length = i;
6743             else delete this.__on;
6744           };
6745         }
6746
6747         function onAdd(typename, value, capture) {
6748           var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
6749           return function(d, i, group) {
6750             var on = this.__on, o, listener = wrap(value, i, group);
6751             if (on) for (var j = 0, m = on.length; j < m; ++j) {
6752               if ((o = on[j]).type === typename.type && o.name === typename.name) {
6753                 this.removeEventListener(o.type, o.listener, o.capture);
6754                 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
6755                 o.value = value;
6756                 return;
6757               }
6758             }
6759             this.addEventListener(typename.type, listener, capture);
6760             o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
6761             if (!on) this.__on = [o];
6762             else on.push(o);
6763           };
6764         }
6765
6766         function selection_on(typename, value, capture) {
6767           var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
6768
6769           if (arguments.length < 2) {
6770             var on = this.node().__on;
6771             if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
6772               for (i = 0, o = on[j]; i < n; ++i) {
6773                 if ((t = typenames[i]).type === o.type && t.name === o.name) {
6774                   return o.value;
6775                 }
6776               }
6777             }
6778             return;
6779           }
6780
6781           on = value ? onAdd : onRemove;
6782           if (capture == null) capture = false;
6783           for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
6784           return this;
6785         }
6786
6787         function customEvent(event1, listener, that, args) {
6788           var event0 = event;
6789           event1.sourceEvent = event;
6790           event = event1;
6791           try {
6792             return listener.apply(that, args);
6793           } finally {
6794             event = event0;
6795           }
6796         }
6797
6798         function dispatchEvent(node, type, params) {
6799           var window = defaultView(node),
6800               event = window.CustomEvent;
6801
6802           if (typeof event === "function") {
6803             event = new event(type, params);
6804           } else {
6805             event = window.document.createEvent("Event");
6806             if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
6807             else event.initEvent(type, false, false);
6808           }
6809
6810           node.dispatchEvent(event);
6811         }
6812
6813         function dispatchConstant(type, params) {
6814           return function() {
6815             return dispatchEvent(this, type, params);
6816           };
6817         }
6818
6819         function dispatchFunction(type, params) {
6820           return function() {
6821             return dispatchEvent(this, type, params.apply(this, arguments));
6822           };
6823         }
6824
6825         function selection_dispatch(type, params) {
6826           return this.each((typeof params === "function"
6827               ? dispatchFunction
6828               : dispatchConstant)(type, params));
6829         }
6830
6831         var root$1 = [null];
6832
6833         function Selection(groups, parents) {
6834           this._groups = groups;
6835           this._parents = parents;
6836         }
6837
6838         function selection() {
6839           return new Selection([[document.documentElement]], root$1);
6840         }
6841
6842         Selection.prototype = selection.prototype = {
6843           constructor: Selection,
6844           select: selection_select,
6845           selectAll: selection_selectAll,
6846           filter: selection_filter,
6847           data: selection_data,
6848           enter: selection_enter,
6849           exit: selection_exit,
6850           join: selection_join,
6851           merge: selection_merge,
6852           order: selection_order,
6853           sort: selection_sort,
6854           call: selection_call,
6855           nodes: selection_nodes,
6856           node: selection_node,
6857           size: selection_size,
6858           empty: selection_empty,
6859           each: selection_each,
6860           attr: selection_attr,
6861           style: selection_style,
6862           property: selection_property,
6863           classed: selection_classed,
6864           text: selection_text,
6865           html: selection_html,
6866           raise: selection_raise,
6867           lower: selection_lower,
6868           append: selection_append,
6869           insert: selection_insert,
6870           remove: selection_remove,
6871           clone: selection_clone,
6872           datum: selection_datum,
6873           on: selection_on,
6874           dispatch: selection_dispatch
6875         };
6876
6877         function d3_select(selector) {
6878           return typeof selector === "string"
6879               ? new Selection([[document.querySelector(selector)]], [document.documentElement])
6880               : new Selection([[selector]], root$1);
6881         }
6882
6883         function create$5(name) {
6884           return d3_select(creator(name).call(document.documentElement));
6885         }
6886
6887         var nextId = 0;
6888
6889         function local() {
6890           return new Local;
6891         }
6892
6893         function Local() {
6894           this._ = "@" + (++nextId).toString(36);
6895         }
6896
6897         Local.prototype = local.prototype = {
6898           constructor: Local,
6899           get: function(node) {
6900             var id = this._;
6901             while (!(id in node)) if (!(node = node.parentNode)) return;
6902             return node[id];
6903           },
6904           set: function(node, value) {
6905             return node[this._] = value;
6906           },
6907           remove: function(node) {
6908             return this._ in node && delete node[this._];
6909           },
6910           toString: function() {
6911             return this._;
6912           }
6913         };
6914
6915         function sourceEvent() {
6916           var current = event, source;
6917           while (source = current.sourceEvent) current = source;
6918           return current;
6919         }
6920
6921         function point(node, event) {
6922           var svg = node.ownerSVGElement || node;
6923
6924           if (svg.createSVGPoint) {
6925             var point = svg.createSVGPoint();
6926             point.x = event.clientX, point.y = event.clientY;
6927             point = point.matrixTransform(node.getScreenCTM().inverse());
6928             return [point.x, point.y];
6929           }
6930
6931           var rect = node.getBoundingClientRect();
6932           return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
6933         }
6934
6935         function d3_mouse(node) {
6936           var event = sourceEvent();
6937           if (event.changedTouches) event = event.changedTouches[0];
6938           return point(node, event);
6939         }
6940
6941         function d3_selectAll(selector) {
6942           return typeof selector === "string"
6943               ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
6944               : new Selection([selector == null ? [] : selector], root$1);
6945         }
6946
6947         function touch(node, touches, identifier) {
6948           if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
6949
6950           for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
6951             if ((touch = touches[i]).identifier === identifier) {
6952               return point(node, touch);
6953             }
6954           }
6955
6956           return null;
6957         }
6958
6959         function d3_touches(node, touches) {
6960           if (touches == null) touches = sourceEvent().touches;
6961
6962           for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
6963             points[i] = point(node, touches[i]);
6964           }
6965
6966           return points;
6967         }
6968
6969         function nopropagation() {
6970           event.stopImmediatePropagation();
6971         }
6972
6973         function noevent() {
6974           event.preventDefault();
6975           event.stopImmediatePropagation();
6976         }
6977
6978         function dragDisable(view) {
6979           var root = view.document.documentElement,
6980               selection = d3_select(view).on("dragstart.drag", noevent, true);
6981           if ("onselectstart" in root) {
6982             selection.on("selectstart.drag", noevent, true);
6983           } else {
6984             root.__noselect = root.style.MozUserSelect;
6985             root.style.MozUserSelect = "none";
6986           }
6987         }
6988
6989         function yesdrag(view, noclick) {
6990           var root = view.document.documentElement,
6991               selection = d3_select(view).on("dragstart.drag", null);
6992           if (noclick) {
6993             selection.on("click.drag", noevent, true);
6994             setTimeout(function() { selection.on("click.drag", null); }, 0);
6995           }
6996           if ("onselectstart" in root) {
6997             selection.on("selectstart.drag", null);
6998           } else {
6999             root.style.MozUserSelect = root.__noselect;
7000             delete root.__noselect;
7001           }
7002         }
7003
7004         function constant$2(x) {
7005           return function() {
7006             return x;
7007           };
7008         }
7009
7010         function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
7011           this.target = target;
7012           this.type = type;
7013           this.subject = subject;
7014           this.identifier = id;
7015           this.active = active;
7016           this.x = x;
7017           this.y = y;
7018           this.dx = dx;
7019           this.dy = dy;
7020           this._ = dispatch;
7021         }
7022
7023         DragEvent.prototype.on = function() {
7024           var value = this._.on.apply(this._, arguments);
7025           return value === this._ ? this : value;
7026         };
7027
7028         // Ignore right-click, since that should open the context menu.
7029         function defaultFilter() {
7030           return !event.button;
7031         }
7032
7033         function defaultContainer() {
7034           return this.parentNode;
7035         }
7036
7037         function defaultSubject(d) {
7038           return d == null ? {x: event.x, y: event.y} : d;
7039         }
7040
7041         function defaultTouchable() {
7042           return "ontouchstart" in this;
7043         }
7044
7045         function d3_drag() {
7046           var filter = defaultFilter,
7047               container = defaultContainer,
7048               subject = defaultSubject,
7049               touchable = defaultTouchable,
7050               gestures = {},
7051               listeners = dispatch("start", "drag", "end"),
7052               active = 0,
7053               mousedownx,
7054               mousedowny,
7055               mousemoving,
7056               touchending,
7057               clickDistance2 = 0;
7058
7059           function drag(selection) {
7060             selection
7061                 .on("mousedown.drag", mousedowned)
7062               .filter(touchable)
7063                 .on("touchstart.drag", touchstarted)
7064                 .on("touchmove.drag", touchmoved)
7065                 .on("touchend.drag touchcancel.drag", touchended)
7066                 .style("touch-action", "none")
7067                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
7068           }
7069
7070           function mousedowned() {
7071             if (touchending || !filter.apply(this, arguments)) return;
7072             var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
7073             if (!gesture) return;
7074             d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
7075             dragDisable(event.view);
7076             nopropagation();
7077             mousemoving = false;
7078             mousedownx = event.clientX;
7079             mousedowny = event.clientY;
7080             gesture("start");
7081           }
7082
7083           function mousemoved() {
7084             noevent();
7085             if (!mousemoving) {
7086               var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
7087               mousemoving = dx * dx + dy * dy > clickDistance2;
7088             }
7089             gestures.mouse("drag");
7090           }
7091
7092           function mouseupped() {
7093             d3_select(event.view).on("mousemove.drag mouseup.drag", null);
7094             yesdrag(event.view, mousemoving);
7095             noevent();
7096             gestures.mouse("end");
7097           }
7098
7099           function touchstarted() {
7100             if (!filter.apply(this, arguments)) return;
7101             var touches = event.changedTouches,
7102                 c = container.apply(this, arguments),
7103                 n = touches.length, i, gesture;
7104
7105             for (i = 0; i < n; ++i) {
7106               if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
7107                 nopropagation();
7108                 gesture("start");
7109               }
7110             }
7111           }
7112
7113           function touchmoved() {
7114             var touches = event.changedTouches,
7115                 n = touches.length, i, gesture;
7116
7117             for (i = 0; i < n; ++i) {
7118               if (gesture = gestures[touches[i].identifier]) {
7119                 noevent();
7120                 gesture("drag");
7121               }
7122             }
7123           }
7124
7125           function touchended() {
7126             var touches = event.changedTouches,
7127                 n = touches.length, i, gesture;
7128
7129             if (touchending) clearTimeout(touchending);
7130             touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
7131             for (i = 0; i < n; ++i) {
7132               if (gesture = gestures[touches[i].identifier]) {
7133                 nopropagation();
7134                 gesture("end");
7135               }
7136             }
7137           }
7138
7139           function beforestart(id, container, point, that, args) {
7140             var p = point(container, id), s, dx, dy,
7141                 sublisteners = listeners.copy();
7142
7143             if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
7144               if ((event.subject = s = subject.apply(that, args)) == null) return false;
7145               dx = s.x - p[0] || 0;
7146               dy = s.y - p[1] || 0;
7147               return true;
7148             })) return;
7149
7150             return function gesture(type) {
7151               var p0 = p, n;
7152               switch (type) {
7153                 case "start": gestures[id] = gesture, n = active++; break;
7154                 case "end": delete gestures[id], --active; // nobreak
7155                 case "drag": p = point(container, id), n = active; break;
7156               }
7157               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]);
7158             };
7159           }
7160
7161           drag.filter = function(_) {
7162             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
7163           };
7164
7165           drag.container = function(_) {
7166             return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
7167           };
7168
7169           drag.subject = function(_) {
7170             return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
7171           };
7172
7173           drag.touchable = function(_) {
7174             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
7175           };
7176
7177           drag.on = function() {
7178             var value = listeners.on.apply(listeners, arguments);
7179             return value === listeners ? drag : value;
7180           };
7181
7182           drag.clickDistance = function(_) {
7183             return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
7184           };
7185
7186           return drag;
7187         }
7188
7189         function define$1(constructor, factory, prototype) {
7190           constructor.prototype = factory.prototype = prototype;
7191           prototype.constructor = constructor;
7192         }
7193
7194         function extend(parent, definition) {
7195           var prototype = Object.create(parent.prototype);
7196           for (var key in definition) prototype[key] = definition[key];
7197           return prototype;
7198         }
7199
7200         function Color() {}
7201
7202         var darker = 0.7;
7203         var brighter = 1 / darker;
7204
7205         var reI = "\\s*([+-]?\\d+)\\s*",
7206             reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
7207             reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
7208             reHex3 = /^#([0-9a-f]{3})$/,
7209             reHex6 = /^#([0-9a-f]{6})$/,
7210             reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
7211             reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
7212             reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
7213             reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
7214             reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
7215             reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
7216
7217         var named = {
7218           aliceblue: 0xf0f8ff,
7219           antiquewhite: 0xfaebd7,
7220           aqua: 0x00ffff,
7221           aquamarine: 0x7fffd4,
7222           azure: 0xf0ffff,
7223           beige: 0xf5f5dc,
7224           bisque: 0xffe4c4,
7225           black: 0x000000,
7226           blanchedalmond: 0xffebcd,
7227           blue: 0x0000ff,
7228           blueviolet: 0x8a2be2,
7229           brown: 0xa52a2a,
7230           burlywood: 0xdeb887,
7231           cadetblue: 0x5f9ea0,
7232           chartreuse: 0x7fff00,
7233           chocolate: 0xd2691e,
7234           coral: 0xff7f50,
7235           cornflowerblue: 0x6495ed,
7236           cornsilk: 0xfff8dc,
7237           crimson: 0xdc143c,
7238           cyan: 0x00ffff,
7239           darkblue: 0x00008b,
7240           darkcyan: 0x008b8b,
7241           darkgoldenrod: 0xb8860b,
7242           darkgray: 0xa9a9a9,
7243           darkgreen: 0x006400,
7244           darkgrey: 0xa9a9a9,
7245           darkkhaki: 0xbdb76b,
7246           darkmagenta: 0x8b008b,
7247           darkolivegreen: 0x556b2f,
7248           darkorange: 0xff8c00,
7249           darkorchid: 0x9932cc,
7250           darkred: 0x8b0000,
7251           darksalmon: 0xe9967a,
7252           darkseagreen: 0x8fbc8f,
7253           darkslateblue: 0x483d8b,
7254           darkslategray: 0x2f4f4f,
7255           darkslategrey: 0x2f4f4f,
7256           darkturquoise: 0x00ced1,
7257           darkviolet: 0x9400d3,
7258           deeppink: 0xff1493,
7259           deepskyblue: 0x00bfff,
7260           dimgray: 0x696969,
7261           dimgrey: 0x696969,
7262           dodgerblue: 0x1e90ff,
7263           firebrick: 0xb22222,
7264           floralwhite: 0xfffaf0,
7265           forestgreen: 0x228b22,
7266           fuchsia: 0xff00ff,
7267           gainsboro: 0xdcdcdc,
7268           ghostwhite: 0xf8f8ff,
7269           gold: 0xffd700,
7270           goldenrod: 0xdaa520,
7271           gray: 0x808080,
7272           green: 0x008000,
7273           greenyellow: 0xadff2f,
7274           grey: 0x808080,
7275           honeydew: 0xf0fff0,
7276           hotpink: 0xff69b4,
7277           indianred: 0xcd5c5c,
7278           indigo: 0x4b0082,
7279           ivory: 0xfffff0,
7280           khaki: 0xf0e68c,
7281           lavender: 0xe6e6fa,
7282           lavenderblush: 0xfff0f5,
7283           lawngreen: 0x7cfc00,
7284           lemonchiffon: 0xfffacd,
7285           lightblue: 0xadd8e6,
7286           lightcoral: 0xf08080,
7287           lightcyan: 0xe0ffff,
7288           lightgoldenrodyellow: 0xfafad2,
7289           lightgray: 0xd3d3d3,
7290           lightgreen: 0x90ee90,
7291           lightgrey: 0xd3d3d3,
7292           lightpink: 0xffb6c1,
7293           lightsalmon: 0xffa07a,
7294           lightseagreen: 0x20b2aa,
7295           lightskyblue: 0x87cefa,
7296           lightslategray: 0x778899,
7297           lightslategrey: 0x778899,
7298           lightsteelblue: 0xb0c4de,
7299           lightyellow: 0xffffe0,
7300           lime: 0x00ff00,
7301           limegreen: 0x32cd32,
7302           linen: 0xfaf0e6,
7303           magenta: 0xff00ff,
7304           maroon: 0x800000,
7305           mediumaquamarine: 0x66cdaa,
7306           mediumblue: 0x0000cd,
7307           mediumorchid: 0xba55d3,
7308           mediumpurple: 0x9370db,
7309           mediumseagreen: 0x3cb371,
7310           mediumslateblue: 0x7b68ee,
7311           mediumspringgreen: 0x00fa9a,
7312           mediumturquoise: 0x48d1cc,
7313           mediumvioletred: 0xc71585,
7314           midnightblue: 0x191970,
7315           mintcream: 0xf5fffa,
7316           mistyrose: 0xffe4e1,
7317           moccasin: 0xffe4b5,
7318           navajowhite: 0xffdead,
7319           navy: 0x000080,
7320           oldlace: 0xfdf5e6,
7321           olive: 0x808000,
7322           olivedrab: 0x6b8e23,
7323           orange: 0xffa500,
7324           orangered: 0xff4500,
7325           orchid: 0xda70d6,
7326           palegoldenrod: 0xeee8aa,
7327           palegreen: 0x98fb98,
7328           paleturquoise: 0xafeeee,
7329           palevioletred: 0xdb7093,
7330           papayawhip: 0xffefd5,
7331           peachpuff: 0xffdab9,
7332           peru: 0xcd853f,
7333           pink: 0xffc0cb,
7334           plum: 0xdda0dd,
7335           powderblue: 0xb0e0e6,
7336           purple: 0x800080,
7337           rebeccapurple: 0x663399,
7338           red: 0xff0000,
7339           rosybrown: 0xbc8f8f,
7340           royalblue: 0x4169e1,
7341           saddlebrown: 0x8b4513,
7342           salmon: 0xfa8072,
7343           sandybrown: 0xf4a460,
7344           seagreen: 0x2e8b57,
7345           seashell: 0xfff5ee,
7346           sienna: 0xa0522d,
7347           silver: 0xc0c0c0,
7348           skyblue: 0x87ceeb,
7349           slateblue: 0x6a5acd,
7350           slategray: 0x708090,
7351           slategrey: 0x708090,
7352           snow: 0xfffafa,
7353           springgreen: 0x00ff7f,
7354           steelblue: 0x4682b4,
7355           tan: 0xd2b48c,
7356           teal: 0x008080,
7357           thistle: 0xd8bfd8,
7358           tomato: 0xff6347,
7359           turquoise: 0x40e0d0,
7360           violet: 0xee82ee,
7361           wheat: 0xf5deb3,
7362           white: 0xffffff,
7363           whitesmoke: 0xf5f5f5,
7364           yellow: 0xffff00,
7365           yellowgreen: 0x9acd32
7366         };
7367
7368         define$1(Color, color, {
7369           displayable: function() {
7370             return this.rgb().displayable();
7371           },
7372           hex: function() {
7373             return this.rgb().hex();
7374           },
7375           toString: function() {
7376             return this.rgb() + "";
7377           }
7378         });
7379
7380         function color(format) {
7381           var m;
7382           format = (format + "").trim().toLowerCase();
7383           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
7384               : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
7385               : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
7386               : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
7387               : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
7388               : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
7389               : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
7390               : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
7391               : named.hasOwnProperty(format) ? rgbn(named[format])
7392               : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
7393               : null;
7394         }
7395
7396         function rgbn(n) {
7397           return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
7398         }
7399
7400         function rgba(r, g, b, a) {
7401           if (a <= 0) r = g = b = NaN;
7402           return new Rgb(r, g, b, a);
7403         }
7404
7405         function rgbConvert(o) {
7406           if (!(o instanceof Color)) o = color(o);
7407           if (!o) return new Rgb;
7408           o = o.rgb();
7409           return new Rgb(o.r, o.g, o.b, o.opacity);
7410         }
7411
7412         function rgb(r, g, b, opacity) {
7413           return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
7414         }
7415
7416         function Rgb(r, g, b, opacity) {
7417           this.r = +r;
7418           this.g = +g;
7419           this.b = +b;
7420           this.opacity = +opacity;
7421         }
7422
7423         define$1(Rgb, rgb, extend(Color, {
7424           brighter: function(k) {
7425             k = k == null ? brighter : Math.pow(brighter, k);
7426             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7427           },
7428           darker: function(k) {
7429             k = k == null ? darker : Math.pow(darker, k);
7430             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7431           },
7432           rgb: function() {
7433             return this;
7434           },
7435           displayable: function() {
7436             return (0 <= this.r && this.r <= 255)
7437                 && (0 <= this.g && this.g <= 255)
7438                 && (0 <= this.b && this.b <= 255)
7439                 && (0 <= this.opacity && this.opacity <= 1);
7440           },
7441           hex: function() {
7442             return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
7443           },
7444           toString: function() {
7445             var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
7446             return (a === 1 ? "rgb(" : "rgba(")
7447                 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
7448                 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
7449                 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
7450                 + (a === 1 ? ")" : ", " + a + ")");
7451           }
7452         }));
7453
7454         function hex$1(value) {
7455           value = Math.max(0, Math.min(255, Math.round(value) || 0));
7456           return (value < 16 ? "0" : "") + value.toString(16);
7457         }
7458
7459         function hsla(h, s, l, a) {
7460           if (a <= 0) h = s = l = NaN;
7461           else if (l <= 0 || l >= 1) h = s = NaN;
7462           else if (s <= 0) h = NaN;
7463           return new Hsl(h, s, l, a);
7464         }
7465
7466         function hslConvert(o) {
7467           if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
7468           if (!(o instanceof Color)) o = color(o);
7469           if (!o) return new Hsl;
7470           if (o instanceof Hsl) return o;
7471           o = o.rgb();
7472           var r = o.r / 255,
7473               g = o.g / 255,
7474               b = o.b / 255,
7475               min = Math.min(r, g, b),
7476               max = Math.max(r, g, b),
7477               h = NaN,
7478               s = max - min,
7479               l = (max + min) / 2;
7480           if (s) {
7481             if (r === max) h = (g - b) / s + (g < b) * 6;
7482             else if (g === max) h = (b - r) / s + 2;
7483             else h = (r - g) / s + 4;
7484             s /= l < 0.5 ? max + min : 2 - max - min;
7485             h *= 60;
7486           } else {
7487             s = l > 0 && l < 1 ? 0 : h;
7488           }
7489           return new Hsl(h, s, l, o.opacity);
7490         }
7491
7492         function hsl(h, s, l, opacity) {
7493           return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
7494         }
7495
7496         function Hsl(h, s, l, opacity) {
7497           this.h = +h;
7498           this.s = +s;
7499           this.l = +l;
7500           this.opacity = +opacity;
7501         }
7502
7503         define$1(Hsl, hsl, extend(Color, {
7504           brighter: function(k) {
7505             k = k == null ? brighter : Math.pow(brighter, k);
7506             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7507           },
7508           darker: function(k) {
7509             k = k == null ? darker : Math.pow(darker, k);
7510             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7511           },
7512           rgb: function() {
7513             var h = this.h % 360 + (this.h < 0) * 360,
7514                 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
7515                 l = this.l,
7516                 m2 = l + (l < 0.5 ? l : 1 - l) * s,
7517                 m1 = 2 * l - m2;
7518             return new Rgb(
7519               hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
7520               hsl2rgb(h, m1, m2),
7521               hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
7522               this.opacity
7523             );
7524           },
7525           displayable: function() {
7526             return (0 <= this.s && this.s <= 1 || isNaN(this.s))
7527                 && (0 <= this.l && this.l <= 1)
7528                 && (0 <= this.opacity && this.opacity <= 1);
7529           }
7530         }));
7531
7532         /* From FvD 13.37, CSS Color Module Level 3 */
7533         function hsl2rgb(h, m1, m2) {
7534           return (h < 60 ? m1 + (m2 - m1) * h / 60
7535               : h < 180 ? m2
7536               : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
7537               : m1) * 255;
7538         }
7539
7540         var deg2rad = Math.PI / 180;
7541         var rad2deg = 180 / Math.PI;
7542
7543         // https://beta.observablehq.com/@mbostock/lab-and-rgb
7544         var K = 18,
7545             Xn = 0.96422,
7546             Yn = 1,
7547             Zn = 0.82521,
7548             t0 = 4 / 29,
7549             t1 = 6 / 29,
7550             t2 = 3 * t1 * t1,
7551             t3 = t1 * t1 * t1;
7552
7553         function labConvert(o) {
7554           if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
7555           if (o instanceof Hcl) {
7556             if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
7557             var h = o.h * deg2rad;
7558             return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
7559           }
7560           if (!(o instanceof Rgb)) o = rgbConvert(o);
7561           var r = rgb2lrgb(o.r),
7562               g = rgb2lrgb(o.g),
7563               b = rgb2lrgb(o.b),
7564               y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
7565           if (r === g && g === b) x = z = y; else {
7566             x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
7567             z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
7568           }
7569           return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
7570         }
7571
7572         function gray(l, opacity) {
7573           return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
7574         }
7575
7576         function lab(l, a, b, opacity) {
7577           return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
7578         }
7579
7580         function Lab(l, a, b, opacity) {
7581           this.l = +l;
7582           this.a = +a;
7583           this.b = +b;
7584           this.opacity = +opacity;
7585         }
7586
7587         define$1(Lab, lab, extend(Color, {
7588           brighter: function(k) {
7589             return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7590           },
7591           darker: function(k) {
7592             return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7593           },
7594           rgb: function() {
7595             var y = (this.l + 16) / 116,
7596                 x = isNaN(this.a) ? y : y + this.a / 500,
7597                 z = isNaN(this.b) ? y : y - this.b / 200;
7598             x = Xn * lab2xyz(x);
7599             y = Yn * lab2xyz(y);
7600             z = Zn * lab2xyz(z);
7601             return new Rgb(
7602               lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
7603               lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
7604               lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
7605               this.opacity
7606             );
7607           }
7608         }));
7609
7610         function xyz2lab(t) {
7611           return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7612         }
7613
7614         function lab2xyz(t) {
7615           return t > t1 ? t * t * t : t2 * (t - t0);
7616         }
7617
7618         function lrgb2rgb(x) {
7619           return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7620         }
7621
7622         function rgb2lrgb(x) {
7623           return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7624         }
7625
7626         function hclConvert(o) {
7627           if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
7628           if (!(o instanceof Lab)) o = labConvert(o);
7629           if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);
7630           var h = Math.atan2(o.b, o.a) * rad2deg;
7631           return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
7632         }
7633
7634         function lch(l, c, h, opacity) {
7635           return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7636         }
7637
7638         function hcl(h, c, l, opacity) {
7639           return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7640         }
7641
7642         function Hcl(h, c, l, opacity) {
7643           this.h = +h;
7644           this.c = +c;
7645           this.l = +l;
7646           this.opacity = +opacity;
7647         }
7648
7649         define$1(Hcl, hcl, extend(Color, {
7650           brighter: function(k) {
7651             return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
7652           },
7653           darker: function(k) {
7654             return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
7655           },
7656           rgb: function() {
7657             return labConvert(this).rgb();
7658           }
7659         }));
7660
7661         var A = -0.14861,
7662             B = +1.78277,
7663             C = -0.29227,
7664             D = -0.90649,
7665             E = +1.97294,
7666             ED = E * D,
7667             EB = E * B,
7668             BC_DA = B * C - D * A;
7669
7670         function cubehelixConvert(o) {
7671           if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
7672           if (!(o instanceof Rgb)) o = rgbConvert(o);
7673           var r = o.r / 255,
7674               g = o.g / 255,
7675               b = o.b / 255,
7676               l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
7677               bl = b - l,
7678               k = (E * (g - l) - C * bl) / D,
7679               s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
7680               h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
7681           return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
7682         }
7683
7684         function cubehelix(h, s, l, opacity) {
7685           return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
7686         }
7687
7688         function Cubehelix(h, s, l, opacity) {
7689           this.h = +h;
7690           this.s = +s;
7691           this.l = +l;
7692           this.opacity = +opacity;
7693         }
7694
7695         define$1(Cubehelix, cubehelix, extend(Color, {
7696           brighter: function(k) {
7697             k = k == null ? brighter : Math.pow(brighter, k);
7698             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7699           },
7700           darker: function(k) {
7701             k = k == null ? darker : Math.pow(darker, k);
7702             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7703           },
7704           rgb: function() {
7705             var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
7706                 l = +this.l,
7707                 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
7708                 cosh = Math.cos(h),
7709                 sinh = Math.sin(h);
7710             return new Rgb(
7711               255 * (l + a * (A * cosh + B * sinh)),
7712               255 * (l + a * (C * cosh + D * sinh)),
7713               255 * (l + a * (E * cosh)),
7714               this.opacity
7715             );
7716           }
7717         }));
7718
7719         function basis(t1, v0, v1, v2, v3) {
7720           var t2 = t1 * t1, t3 = t2 * t1;
7721           return ((1 - 3 * t1 + 3 * t2 - t3) * v0
7722               + (4 - 6 * t2 + 3 * t3) * v1
7723               + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
7724               + t3 * v3) / 6;
7725         }
7726
7727         function basis$1(values) {
7728           var n = values.length - 1;
7729           return function(t) {
7730             var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
7731                 v1 = values[i],
7732                 v2 = values[i + 1],
7733                 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
7734                 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
7735             return basis((t - i / n) * n, v0, v1, v2, v3);
7736           };
7737         }
7738
7739         function basisClosed(values) {
7740           var n = values.length;
7741           return function(t) {
7742             var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
7743                 v0 = values[(i + n - 1) % n],
7744                 v1 = values[i % n],
7745                 v2 = values[(i + 1) % n],
7746                 v3 = values[(i + 2) % n];
7747             return basis((t - i / n) * n, v0, v1, v2, v3);
7748           };
7749         }
7750
7751         function constant$3(x) {
7752           return function() {
7753             return x;
7754           };
7755         }
7756
7757         function linear(a, d) {
7758           return function(t) {
7759             return a + t * d;
7760           };
7761         }
7762
7763         function exponential(a, b, y) {
7764           return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
7765             return Math.pow(a + t * b, y);
7766           };
7767         }
7768
7769         function hue(a, b) {
7770           var d = b - a;
7771           return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
7772         }
7773
7774         function gamma(y) {
7775           return (y = +y) === 1 ? nogamma : function(a, b) {
7776             return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
7777           };
7778         }
7779
7780         function nogamma(a, b) {
7781           var d = b - a;
7782           return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
7783         }
7784
7785         var d3_interpolateRgb = (function rgbGamma(y) {
7786           var color = gamma(y);
7787
7788           function rgb$1(start, end) {
7789             var r = color((start = rgb(start)).r, (end = rgb(end)).r),
7790                 g = color(start.g, end.g),
7791                 b = color(start.b, end.b),
7792                 opacity = nogamma(start.opacity, end.opacity);
7793             return function(t) {
7794               start.r = r(t);
7795               start.g = g(t);
7796               start.b = b(t);
7797               start.opacity = opacity(t);
7798               return start + "";
7799             };
7800           }
7801
7802           rgb$1.gamma = rgbGamma;
7803
7804           return rgb$1;
7805         })(1);
7806
7807         function rgbSpline(spline) {
7808           return function(colors) {
7809             var n = colors.length,
7810                 r = new Array(n),
7811                 g = new Array(n),
7812                 b = new Array(n),
7813                 i, color;
7814             for (i = 0; i < n; ++i) {
7815               color = rgb(colors[i]);
7816               r[i] = color.r || 0;
7817               g[i] = color.g || 0;
7818               b[i] = color.b || 0;
7819             }
7820             r = spline(r);
7821             g = spline(g);
7822             b = spline(b);
7823             color.opacity = 1;
7824             return function(t) {
7825               color.r = r(t);
7826               color.g = g(t);
7827               color.b = b(t);
7828               return color + "";
7829             };
7830           };
7831         }
7832
7833         var rgbBasis = rgbSpline(basis$1);
7834         var rgbBasisClosed = rgbSpline(basisClosed);
7835
7836         function array$2(a, b) {
7837           var nb = b ? b.length : 0,
7838               na = a ? Math.min(nb, a.length) : 0,
7839               x = new Array(na),
7840               c = new Array(nb),
7841               i;
7842
7843           for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
7844           for (; i < nb; ++i) c[i] = b[i];
7845
7846           return function(t) {
7847             for (i = 0; i < na; ++i) c[i] = x[i](t);
7848             return c;
7849           };
7850         }
7851
7852         function date(a, b) {
7853           var d = new Date;
7854           return a = +a, b -= a, function(t) {
7855             return d.setTime(a + b * t), d;
7856           };
7857         }
7858
7859         function d3_interpolateNumber(a, b) {
7860           return a = +a, b -= a, function(t) {
7861             return a + b * t;
7862           };
7863         }
7864
7865         function object(a, b) {
7866           var i = {},
7867               c = {},
7868               k;
7869
7870           if (a === null || typeof a !== "object") a = {};
7871           if (b === null || typeof b !== "object") b = {};
7872
7873           for (k in b) {
7874             if (k in a) {
7875               i[k] = d3_interpolate(a[k], b[k]);
7876             } else {
7877               c[k] = b[k];
7878             }
7879           }
7880
7881           return function(t) {
7882             for (k in i) c[k] = i[k](t);
7883             return c;
7884           };
7885         }
7886
7887         var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
7888             reB = new RegExp(reA.source, "g");
7889
7890         function zero(b) {
7891           return function() {
7892             return b;
7893           };
7894         }
7895
7896         function one(b) {
7897           return function(t) {
7898             return b(t) + "";
7899           };
7900         }
7901
7902         function interpolateString(a, b) {
7903           var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
7904               am, // current match in a
7905               bm, // current match in b
7906               bs, // string preceding current number in b, if any
7907               i = -1, // index in s
7908               s = [], // string constants and placeholders
7909               q = []; // number interpolators
7910
7911           // Coerce inputs to strings.
7912           a = a + "", b = b + "";
7913
7914           // Interpolate pairs of numbers in a & b.
7915           while ((am = reA.exec(a))
7916               && (bm = reB.exec(b))) {
7917             if ((bs = bm.index) > bi) { // a string precedes the next number in b
7918               bs = b.slice(bi, bs);
7919               if (s[i]) s[i] += bs; // coalesce with previous string
7920               else s[++i] = bs;
7921             }
7922             if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
7923               if (s[i]) s[i] += bm; // coalesce with previous string
7924               else s[++i] = bm;
7925             } else { // interpolate non-matching numbers
7926               s[++i] = null;
7927               q.push({i: i, x: d3_interpolateNumber(am, bm)});
7928             }
7929             bi = reB.lastIndex;
7930           }
7931
7932           // Add remains of b.
7933           if (bi < b.length) {
7934             bs = b.slice(bi);
7935             if (s[i]) s[i] += bs; // coalesce with previous string
7936             else s[++i] = bs;
7937           }
7938
7939           // Special optimization for only a single match.
7940           // Otherwise, interpolate each of the numbers and rejoin the string.
7941           return s.length < 2 ? (q[0]
7942               ? one(q[0].x)
7943               : zero(b))
7944               : (b = q.length, function(t) {
7945                   for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
7946                   return s.join("");
7947                 });
7948         }
7949
7950         function d3_interpolate(a, b) {
7951           var t = typeof b, c;
7952           return b == null || t === "boolean" ? constant$3(b)
7953               : (t === "number" ? d3_interpolateNumber
7954               : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
7955               : b instanceof color ? d3_interpolateRgb
7956               : b instanceof Date ? date
7957               : Array.isArray(b) ? array$2
7958               : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
7959               : d3_interpolateNumber)(a, b);
7960         }
7961
7962         function discrete(range) {
7963           var n = range.length;
7964           return function(t) {
7965             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
7966           };
7967         }
7968
7969         function hue$1(a, b) {
7970           var i = hue(+a, +b);
7971           return function(t) {
7972             var x = i(t);
7973             return x - 360 * Math.floor(x / 360);
7974           };
7975         }
7976
7977         function interpolateRound(a, b) {
7978           return a = +a, b -= a, function(t) {
7979             return Math.round(a + b * t);
7980           };
7981         }
7982
7983         var degrees = 180 / Math.PI;
7984
7985         var identity$2 = {
7986           translateX: 0,
7987           translateY: 0,
7988           rotate: 0,
7989           skewX: 0,
7990           scaleX: 1,
7991           scaleY: 1
7992         };
7993
7994         function decompose(a, b, c, d, e, f) {
7995           var scaleX, scaleY, skewX;
7996           if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
7997           if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
7998           if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
7999           if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
8000           return {
8001             translateX: e,
8002             translateY: f,
8003             rotate: Math.atan2(b, a) * degrees,
8004             skewX: Math.atan(skewX) * degrees,
8005             scaleX: scaleX,
8006             scaleY: scaleY
8007           };
8008         }
8009
8010         var cssNode,
8011             cssRoot,
8012             cssView,
8013             svgNode;
8014
8015         function parseCss(value) {
8016           if (value === "none") return identity$2;
8017           if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
8018           cssNode.style.transform = value;
8019           value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
8020           cssRoot.removeChild(cssNode);
8021           value = value.slice(7, -1).split(",");
8022           return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
8023         }
8024
8025         function parseSvg(value) {
8026           if (value == null) return identity$2;
8027           if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
8028           svgNode.setAttribute("transform", value);
8029           if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
8030           value = value.matrix;
8031           return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
8032         }
8033
8034         function interpolateTransform(parse, pxComma, pxParen, degParen) {
8035
8036           function pop(s) {
8037             return s.length ? s.pop() + " " : "";
8038           }
8039
8040           function translate(xa, ya, xb, yb, s, q) {
8041             if (xa !== xb || ya !== yb) {
8042               var i = s.push("translate(", null, pxComma, null, pxParen);
8043               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8044             } else if (xb || yb) {
8045               s.push("translate(" + xb + pxComma + yb + pxParen);
8046             }
8047           }
8048
8049           function rotate(a, b, s, q) {
8050             if (a !== b) {
8051               if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
8052               q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8053             } else if (b) {
8054               s.push(pop(s) + "rotate(" + b + degParen);
8055             }
8056           }
8057
8058           function skewX(a, b, s, q) {
8059             if (a !== b) {
8060               q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8061             } else if (b) {
8062               s.push(pop(s) + "skewX(" + b + degParen);
8063             }
8064           }
8065
8066           function scale(xa, ya, xb, yb, s, q) {
8067             if (xa !== xb || ya !== yb) {
8068               var i = s.push(pop(s) + "scale(", null, ",", null, ")");
8069               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8070             } else if (xb !== 1 || yb !== 1) {
8071               s.push(pop(s) + "scale(" + xb + "," + yb + ")");
8072             }
8073           }
8074
8075           return function(a, b) {
8076             var s = [], // string constants and placeholders
8077                 q = []; // number interpolators
8078             a = parse(a), b = parse(b);
8079             translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
8080             rotate(a.rotate, b.rotate, s, q);
8081             skewX(a.skewX, b.skewX, s, q);
8082             scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
8083             a = b = null; // gc
8084             return function(t) {
8085               var i = -1, n = q.length, o;
8086               while (++i < n) s[(o = q[i]).i] = o.x(t);
8087               return s.join("");
8088             };
8089           };
8090         }
8091
8092         var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
8093         var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
8094
8095         var rho = Math.SQRT2,
8096             rho2 = 2,
8097             rho4 = 4,
8098             epsilon2 = 1e-12;
8099
8100         function cosh(x) {
8101           return ((x = Math.exp(x)) + 1 / x) / 2;
8102         }
8103
8104         function sinh(x) {
8105           return ((x = Math.exp(x)) - 1 / x) / 2;
8106         }
8107
8108         function tanh(x) {
8109           return ((x = Math.exp(2 * x)) - 1) / (x + 1);
8110         }
8111
8112         // p0 = [ux0, uy0, w0]
8113         // p1 = [ux1, uy1, w1]
8114         function interpolateZoom(p0, p1) {
8115           var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
8116               ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
8117               dx = ux1 - ux0,
8118               dy = uy1 - uy0,
8119               d2 = dx * dx + dy * dy,
8120               i,
8121               S;
8122
8123           // Special case for u0 ≅ u1.
8124           if (d2 < epsilon2) {
8125             S = Math.log(w1 / w0) / rho;
8126             i = function(t) {
8127               return [
8128                 ux0 + t * dx,
8129                 uy0 + t * dy,
8130                 w0 * Math.exp(rho * t * S)
8131               ];
8132             };
8133           }
8134
8135           // General case.
8136           else {
8137             var d1 = Math.sqrt(d2),
8138                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
8139                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
8140                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
8141                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
8142             S = (r1 - r0) / rho;
8143             i = function(t) {
8144               var s = t * S,
8145                   coshr0 = cosh(r0),
8146                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
8147               return [
8148                 ux0 + u * dx,
8149                 uy0 + u * dy,
8150                 w0 * coshr0 / cosh(rho * s + r0)
8151               ];
8152             };
8153           }
8154
8155           i.duration = S * 1000;
8156
8157           return i;
8158         }
8159
8160         function hsl$1(hue) {
8161           return function(start, end) {
8162             var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
8163                 s = nogamma(start.s, end.s),
8164                 l = nogamma(start.l, end.l),
8165                 opacity = nogamma(start.opacity, end.opacity);
8166             return function(t) {
8167               start.h = h(t);
8168               start.s = s(t);
8169               start.l = l(t);
8170               start.opacity = opacity(t);
8171               return start + "";
8172             };
8173           }
8174         }
8175
8176         var hsl$2 = hsl$1(hue);
8177         var hslLong = hsl$1(nogamma);
8178
8179         function lab$1(start, end) {
8180           var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
8181               a = nogamma(start.a, end.a),
8182               b = nogamma(start.b, end.b),
8183               opacity = nogamma(start.opacity, end.opacity);
8184           return function(t) {
8185             start.l = l(t);
8186             start.a = a(t);
8187             start.b = b(t);
8188             start.opacity = opacity(t);
8189             return start + "";
8190           };
8191         }
8192
8193         function hcl$1(hue) {
8194           return function(start, end) {
8195             var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
8196                 c = nogamma(start.c, end.c),
8197                 l = nogamma(start.l, end.l),
8198                 opacity = nogamma(start.opacity, end.opacity);
8199             return function(t) {
8200               start.h = h(t);
8201               start.c = c(t);
8202               start.l = l(t);
8203               start.opacity = opacity(t);
8204               return start + "";
8205             };
8206           }
8207         }
8208
8209         var hcl$2 = hcl$1(hue);
8210         var hclLong = hcl$1(nogamma);
8211
8212         function cubehelix$1(hue) {
8213           return (function cubehelixGamma(y) {
8214             y = +y;
8215
8216             function cubehelix$1(start, end) {
8217               var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
8218                   s = nogamma(start.s, end.s),
8219                   l = nogamma(start.l, end.l),
8220                   opacity = nogamma(start.opacity, end.opacity);
8221               return function(t) {
8222                 start.h = h(t);
8223                 start.s = s(t);
8224                 start.l = l(Math.pow(t, y));
8225                 start.opacity = opacity(t);
8226                 return start + "";
8227               };
8228             }
8229
8230             cubehelix$1.gamma = cubehelixGamma;
8231
8232             return cubehelix$1;
8233           })(1);
8234         }
8235
8236         var cubehelix$2 = cubehelix$1(hue);
8237         var cubehelixLong = cubehelix$1(nogamma);
8238
8239         function piecewise(interpolate, values) {
8240           var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
8241           while (i < n) I[i] = interpolate(v, v = values[++i]);
8242           return function(t) {
8243             var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
8244             return I[i](t - i);
8245           };
8246         }
8247
8248         function d3_quantize(interpolator, n) {
8249           var samples = new Array(n);
8250           for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
8251           return samples;
8252         }
8253
8254         var frame = 0, // is an animation frame pending?
8255             timeout = 0, // is a timeout pending?
8256             interval = 0, // are any timers active?
8257             pokeDelay = 1000, // how frequently we check for clock skew
8258             taskHead,
8259             taskTail,
8260             clockLast = 0,
8261             clockNow = 0,
8262             clockSkew = 0,
8263             clock = typeof performance === "object" && performance.now ? performance : Date,
8264             setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
8265
8266         function now() {
8267           return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
8268         }
8269
8270         function clearNow() {
8271           clockNow = 0;
8272         }
8273
8274         function Timer() {
8275           this._call =
8276           this._time =
8277           this._next = null;
8278         }
8279
8280         Timer.prototype = timer.prototype = {
8281           constructor: Timer,
8282           restart: function(callback, delay, time) {
8283             if (typeof callback !== "function") throw new TypeError("callback is not a function");
8284             time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
8285             if (!this._next && taskTail !== this) {
8286               if (taskTail) taskTail._next = this;
8287               else taskHead = this;
8288               taskTail = this;
8289             }
8290             this._call = callback;
8291             this._time = time;
8292             sleep();
8293           },
8294           stop: function() {
8295             if (this._call) {
8296               this._call = null;
8297               this._time = Infinity;
8298               sleep();
8299             }
8300           }
8301         };
8302
8303         function timer(callback, delay, time) {
8304           var t = new Timer;
8305           t.restart(callback, delay, time);
8306           return t;
8307         }
8308
8309         function timerFlush() {
8310           now(); // Get the current time, if not already set.
8311           ++frame; // Pretend we’ve set an alarm, if we haven’t already.
8312           var t = taskHead, e;
8313           while (t) {
8314             if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
8315             t = t._next;
8316           }
8317           --frame;
8318         }
8319
8320         function wake() {
8321           clockNow = (clockLast = clock.now()) + clockSkew;
8322           frame = timeout = 0;
8323           try {
8324             timerFlush();
8325           } finally {
8326             frame = 0;
8327             nap();
8328             clockNow = 0;
8329           }
8330         }
8331
8332         function poke() {
8333           var now = clock.now(), delay = now - clockLast;
8334           if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
8335         }
8336
8337         function nap() {
8338           var t0, t1 = taskHead, t2, time = Infinity;
8339           while (t1) {
8340             if (t1._call) {
8341               if (time > t1._time) time = t1._time;
8342               t0 = t1, t1 = t1._next;
8343             } else {
8344               t2 = t1._next, t1._next = null;
8345               t1 = t0 ? t0._next = t2 : taskHead = t2;
8346             }
8347           }
8348           taskTail = t0;
8349           sleep(time);
8350         }
8351
8352         function sleep(time) {
8353           if (frame) return; // Soonest alarm already set, or will be.
8354           if (timeout) timeout = clearTimeout(timeout);
8355           var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
8356           if (delay > 24) {
8357             if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
8358             if (interval) interval = clearInterval(interval);
8359           } else {
8360             if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
8361             frame = 1, setFrame(wake);
8362           }
8363         }
8364
8365         function d3_timeout(callback, delay, time) {
8366           var t = new Timer;
8367           delay = delay == null ? 0 : +delay;
8368           t.restart(function(elapsed) {
8369             t.stop();
8370             callback(elapsed + delay);
8371           }, delay, time);
8372           return t;
8373         }
8374
8375         function interval$1(callback, delay, time) {
8376           var t = new Timer, total = delay;
8377           if (delay == null) return t.restart(callback, delay, time), t;
8378           delay = +delay, time = time == null ? now() : +time;
8379           t.restart(function tick(elapsed) {
8380             elapsed += total;
8381             t.restart(tick, total += delay, time);
8382             callback(elapsed);
8383           }, delay, time);
8384           return t;
8385         }
8386
8387         var emptyOn = dispatch("start", "end", "cancel", "interrupt");
8388         var emptyTween = [];
8389
8390         var CREATED = 0;
8391         var SCHEDULED = 1;
8392         var STARTING = 2;
8393         var STARTED = 3;
8394         var RUNNING = 4;
8395         var ENDING = 5;
8396         var ENDED = 6;
8397
8398         function schedule(node, name, id, index, group, timing) {
8399           var schedules = node.__transition;
8400           if (!schedules) node.__transition = {};
8401           else if (id in schedules) return;
8402           create$6(node, id, {
8403             name: name,
8404             index: index, // For context during callback.
8405             group: group, // For context during callback.
8406             on: emptyOn,
8407             tween: emptyTween,
8408             time: timing.time,
8409             delay: timing.delay,
8410             duration: timing.duration,
8411             ease: timing.ease,
8412             timer: null,
8413             state: CREATED
8414           });
8415         }
8416
8417         function init(node, id) {
8418           var schedule = get$2(node, id);
8419           if (schedule.state > CREATED) throw new Error("too late; already scheduled");
8420           return schedule;
8421         }
8422
8423         function set$1(node, id) {
8424           var schedule = get$2(node, id);
8425           if (schedule.state > STARTED) throw new Error("too late; already running");
8426           return schedule;
8427         }
8428
8429         function get$2(node, id) {
8430           var schedule = node.__transition;
8431           if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
8432           return schedule;
8433         }
8434
8435         function create$6(node, id, self) {
8436           var schedules = node.__transition,
8437               tween;
8438
8439           // Initialize the self timer when the transition is created.
8440           // Note the actual delay is not known until the first callback!
8441           schedules[id] = self;
8442           self.timer = timer(schedule, 0, self.time);
8443
8444           function schedule(elapsed) {
8445             self.state = SCHEDULED;
8446             self.timer.restart(start, self.delay, self.time);
8447
8448             // If the elapsed delay is less than our first sleep, start immediately.
8449             if (self.delay <= elapsed) start(elapsed - self.delay);
8450           }
8451
8452           function start(elapsed) {
8453             var i, j, n, o;
8454
8455             // If the state is not SCHEDULED, then we previously errored on start.
8456             if (self.state !== SCHEDULED) return stop();
8457
8458             for (i in schedules) {
8459               o = schedules[i];
8460               if (o.name !== self.name) continue;
8461
8462               // While this element already has a starting transition during this frame,
8463               // defer starting an interrupting transition until that transition has a
8464               // chance to tick (and possibly end); see d3/d3-transition#54!
8465               if (o.state === STARTED) return d3_timeout(start);
8466
8467               // Interrupt the active transition, if any.
8468               if (o.state === RUNNING) {
8469                 o.state = ENDED;
8470                 o.timer.stop();
8471                 o.on.call("interrupt", node, node.__data__, o.index, o.group);
8472                 delete schedules[i];
8473               }
8474
8475               // Cancel any pre-empted transitions.
8476               else if (+i < id) {
8477                 o.state = ENDED;
8478                 o.timer.stop();
8479                 o.on.call("cancel", node, node.__data__, o.index, o.group);
8480                 delete schedules[i];
8481               }
8482             }
8483
8484             // Defer the first tick to end of the current frame; see d3/d3#1576.
8485             // Note the transition may be canceled after start and before the first tick!
8486             // Note this must be scheduled before the start event; see d3/d3-transition#16!
8487             // Assuming this is successful, subsequent callbacks go straight to tick.
8488             d3_timeout(function() {
8489               if (self.state === STARTED) {
8490                 self.state = RUNNING;
8491                 self.timer.restart(tick, self.delay, self.time);
8492                 tick(elapsed);
8493               }
8494             });
8495
8496             // Dispatch the start event.
8497             // Note this must be done before the tween are initialized.
8498             self.state = STARTING;
8499             self.on.call("start", node, node.__data__, self.index, self.group);
8500             if (self.state !== STARTING) return; // interrupted
8501             self.state = STARTED;
8502
8503             // Initialize the tween, deleting null tween.
8504             tween = new Array(n = self.tween.length);
8505             for (i = 0, j = -1; i < n; ++i) {
8506               if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
8507                 tween[++j] = o;
8508               }
8509             }
8510             tween.length = j + 1;
8511           }
8512
8513           function tick(elapsed) {
8514             var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
8515                 i = -1,
8516                 n = tween.length;
8517
8518             while (++i < n) {
8519               tween[i].call(node, t);
8520             }
8521
8522             // Dispatch the end event.
8523             if (self.state === ENDING) {
8524               self.on.call("end", node, node.__data__, self.index, self.group);
8525               stop();
8526             }
8527           }
8528
8529           function stop() {
8530             self.state = ENDED;
8531             self.timer.stop();
8532             delete schedules[id];
8533             for (var i in schedules) return; // eslint-disable-line no-unused-vars
8534             delete node.__transition;
8535           }
8536         }
8537
8538         function interrupt(node, name) {
8539           var schedules = node.__transition,
8540               schedule,
8541               active,
8542               empty = true,
8543               i;
8544
8545           if (!schedules) return;
8546
8547           name = name == null ? null : name + "";
8548
8549           for (i in schedules) {
8550             if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
8551             active = schedule.state > STARTING && schedule.state < ENDING;
8552             schedule.state = ENDED;
8553             schedule.timer.stop();
8554             schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
8555             delete schedules[i];
8556           }
8557
8558           if (empty) delete node.__transition;
8559         }
8560
8561         function selection_interrupt(name) {
8562           return this.each(function() {
8563             interrupt(this, name);
8564           });
8565         }
8566
8567         function tweenRemove(id, name) {
8568           var tween0, tween1;
8569           return function() {
8570             var schedule = set$1(this, id),
8571                 tween = schedule.tween;
8572
8573             // If this node shared tween with the previous node,
8574             // just assign the updated shared tween and we’re done!
8575             // Otherwise, copy-on-write.
8576             if (tween !== tween0) {
8577               tween1 = tween0 = tween;
8578               for (var i = 0, n = tween1.length; i < n; ++i) {
8579                 if (tween1[i].name === name) {
8580                   tween1 = tween1.slice();
8581                   tween1.splice(i, 1);
8582                   break;
8583                 }
8584               }
8585             }
8586
8587             schedule.tween = tween1;
8588           };
8589         }
8590
8591         function tweenFunction(id, name, value) {
8592           var tween0, tween1;
8593           if (typeof value !== "function") throw new Error;
8594           return function() {
8595             var schedule = set$1(this, id),
8596                 tween = schedule.tween;
8597
8598             // If this node shared tween with the previous node,
8599             // just assign the updated shared tween and we’re done!
8600             // Otherwise, copy-on-write.
8601             if (tween !== tween0) {
8602               tween1 = (tween0 = tween).slice();
8603               for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
8604                 if (tween1[i].name === name) {
8605                   tween1[i] = t;
8606                   break;
8607                 }
8608               }
8609               if (i === n) tween1.push(t);
8610             }
8611
8612             schedule.tween = tween1;
8613           };
8614         }
8615
8616         function transition_tween(name, value) {
8617           var id = this._id;
8618
8619           name += "";
8620
8621           if (arguments.length < 2) {
8622             var tween = get$2(this.node(), id).tween;
8623             for (var i = 0, n = tween.length, t; i < n; ++i) {
8624               if ((t = tween[i]).name === name) {
8625                 return t.value;
8626               }
8627             }
8628             return null;
8629           }
8630
8631           return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
8632         }
8633
8634         function tweenValue(transition, name, value) {
8635           var id = transition._id;
8636
8637           transition.each(function() {
8638             var schedule = set$1(this, id);
8639             (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
8640           });
8641
8642           return function(node) {
8643             return get$2(node, id).value[name];
8644           };
8645         }
8646
8647         function interpolate(a, b) {
8648           var c;
8649           return (typeof b === "number" ? d3_interpolateNumber
8650               : b instanceof color ? d3_interpolateRgb
8651               : (c = color(b)) ? (b = c, d3_interpolateRgb)
8652               : interpolateString)(a, b);
8653         }
8654
8655         function attrRemove$1(name) {
8656           return function() {
8657             this.removeAttribute(name);
8658           };
8659         }
8660
8661         function attrRemoveNS$1(fullname) {
8662           return function() {
8663             this.removeAttributeNS(fullname.space, fullname.local);
8664           };
8665         }
8666
8667         function attrConstant$1(name, interpolate, value1) {
8668           var string00,
8669               string1 = value1 + "",
8670               interpolate0;
8671           return function() {
8672             var string0 = this.getAttribute(name);
8673             return string0 === string1 ? null
8674                 : string0 === string00 ? interpolate0
8675                 : interpolate0 = interpolate(string00 = string0, value1);
8676           };
8677         }
8678
8679         function attrConstantNS$1(fullname, interpolate, value1) {
8680           var string00,
8681               string1 = value1 + "",
8682               interpolate0;
8683           return function() {
8684             var string0 = this.getAttributeNS(fullname.space, fullname.local);
8685             return string0 === string1 ? null
8686                 : string0 === string00 ? interpolate0
8687                 : interpolate0 = interpolate(string00 = string0, value1);
8688           };
8689         }
8690
8691         function attrFunction$1(name, interpolate, value) {
8692           var string00,
8693               string10,
8694               interpolate0;
8695           return function() {
8696             var string0, value1 = value(this), string1;
8697             if (value1 == null) return void this.removeAttribute(name);
8698             string0 = this.getAttribute(name);
8699             string1 = value1 + "";
8700             return string0 === string1 ? null
8701                 : string0 === string00 && string1 === string10 ? interpolate0
8702                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8703           };
8704         }
8705
8706         function attrFunctionNS$1(fullname, interpolate, value) {
8707           var string00,
8708               string10,
8709               interpolate0;
8710           return function() {
8711             var string0, value1 = value(this), string1;
8712             if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
8713             string0 = this.getAttributeNS(fullname.space, fullname.local);
8714             string1 = value1 + "";
8715             return string0 === string1 ? null
8716                 : string0 === string00 && string1 === string10 ? interpolate0
8717                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8718           };
8719         }
8720
8721         function transition_attr(name, value) {
8722           var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
8723           return this.attrTween(name, typeof value === "function"
8724               ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
8725               : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
8726               : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
8727         }
8728
8729         function attrInterpolate(name, i) {
8730           return function(t) {
8731             this.setAttribute(name, i(t));
8732           };
8733         }
8734
8735         function attrInterpolateNS(fullname, i) {
8736           return function(t) {
8737             this.setAttributeNS(fullname.space, fullname.local, i(t));
8738           };
8739         }
8740
8741         function attrTweenNS(fullname, value) {
8742           var t0, i0;
8743           function tween() {
8744             var i = value.apply(this, arguments);
8745             if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
8746             return t0;
8747           }
8748           tween._value = value;
8749           return tween;
8750         }
8751
8752         function attrTween(name, value) {
8753           var t0, i0;
8754           function tween() {
8755             var i = value.apply(this, arguments);
8756             if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
8757             return t0;
8758           }
8759           tween._value = value;
8760           return tween;
8761         }
8762
8763         function transition_attrTween(name, value) {
8764           var key = "attr." + name;
8765           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
8766           if (value == null) return this.tween(key, null);
8767           if (typeof value !== "function") throw new Error;
8768           var fullname = namespace(name);
8769           return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
8770         }
8771
8772         function delayFunction(id, value) {
8773           return function() {
8774             init(this, id).delay = +value.apply(this, arguments);
8775           };
8776         }
8777
8778         function delayConstant(id, value) {
8779           return value = +value, function() {
8780             init(this, id).delay = value;
8781           };
8782         }
8783
8784         function transition_delay(value) {
8785           var id = this._id;
8786
8787           return arguments.length
8788               ? this.each((typeof value === "function"
8789                   ? delayFunction
8790                   : delayConstant)(id, value))
8791               : get$2(this.node(), id).delay;
8792         }
8793
8794         function durationFunction(id, value) {
8795           return function() {
8796             set$1(this, id).duration = +value.apply(this, arguments);
8797           };
8798         }
8799
8800         function durationConstant(id, value) {
8801           return value = +value, function() {
8802             set$1(this, id).duration = value;
8803           };
8804         }
8805
8806         function transition_duration(value) {
8807           var id = this._id;
8808
8809           return arguments.length
8810               ? this.each((typeof value === "function"
8811                   ? durationFunction
8812                   : durationConstant)(id, value))
8813               : get$2(this.node(), id).duration;
8814         }
8815
8816         function easeConstant(id, value) {
8817           if (typeof value !== "function") throw new Error;
8818           return function() {
8819             set$1(this, id).ease = value;
8820           };
8821         }
8822
8823         function transition_ease(value) {
8824           var id = this._id;
8825
8826           return arguments.length
8827               ? this.each(easeConstant(id, value))
8828               : get$2(this.node(), id).ease;
8829         }
8830
8831         function transition_filter(match) {
8832           if (typeof match !== "function") match = matcher(match);
8833
8834           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8835             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
8836               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
8837                 subgroup.push(node);
8838               }
8839             }
8840           }
8841
8842           return new Transition(subgroups, this._parents, this._name, this._id);
8843         }
8844
8845         function transition_merge(transition) {
8846           if (transition._id !== this._id) throw new Error;
8847
8848           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) {
8849             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
8850               if (node = group0[i] || group1[i]) {
8851                 merge[i] = node;
8852               }
8853             }
8854           }
8855
8856           for (; j < m0; ++j) {
8857             merges[j] = groups0[j];
8858           }
8859
8860           return new Transition(merges, this._parents, this._name, this._id);
8861         }
8862
8863         function start(name) {
8864           return (name + "").trim().split(/^|\s+/).every(function(t) {
8865             var i = t.indexOf(".");
8866             if (i >= 0) t = t.slice(0, i);
8867             return !t || t === "start";
8868           });
8869         }
8870
8871         function onFunction(id, name, listener) {
8872           var on0, on1, sit = start(name) ? init : set$1;
8873           return function() {
8874             var schedule = sit(this, id),
8875                 on = schedule.on;
8876
8877             // If this node shared a dispatch with the previous node,
8878             // just assign the updated shared dispatch and we’re done!
8879             // Otherwise, copy-on-write.
8880             if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
8881
8882             schedule.on = on1;
8883           };
8884         }
8885
8886         function transition_on(name, listener) {
8887           var id = this._id;
8888
8889           return arguments.length < 2
8890               ? get$2(this.node(), id).on.on(name)
8891               : this.each(onFunction(id, name, listener));
8892         }
8893
8894         function removeFunction(id) {
8895           return function() {
8896             var parent = this.parentNode;
8897             for (var i in this.__transition) if (+i !== id) return;
8898             if (parent) parent.removeChild(this);
8899           };
8900         }
8901
8902         function transition_remove() {
8903           return this.on("end.remove", removeFunction(this._id));
8904         }
8905
8906         function transition_select(select) {
8907           var name = this._name,
8908               id = this._id;
8909
8910           if (typeof select !== "function") select = selector(select);
8911
8912           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8913             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
8914               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
8915                 if ("__data__" in node) subnode.__data__ = node.__data__;
8916                 subgroup[i] = subnode;
8917                 schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
8918               }
8919             }
8920           }
8921
8922           return new Transition(subgroups, this._parents, name, id);
8923         }
8924
8925         function transition_selectAll(select) {
8926           var name = this._name,
8927               id = this._id;
8928
8929           if (typeof select !== "function") select = selectorAll(select);
8930
8931           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
8932             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
8933               if (node = group[i]) {
8934                 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) {
8935                   if (child = children[k]) {
8936                     schedule(child, name, id, k, children, inherit);
8937                   }
8938                 }
8939                 subgroups.push(children);
8940                 parents.push(node);
8941               }
8942             }
8943           }
8944
8945           return new Transition(subgroups, parents, name, id);
8946         }
8947
8948         var Selection$1 = selection.prototype.constructor;
8949
8950         function transition_selection() {
8951           return new Selection$1(this._groups, this._parents);
8952         }
8953
8954         function styleNull(name, interpolate) {
8955           var string00,
8956               string10,
8957               interpolate0;
8958           return function() {
8959             var string0 = styleValue(this, name),
8960                 string1 = (this.style.removeProperty(name), styleValue(this, name));
8961             return string0 === string1 ? null
8962                 : string0 === string00 && string1 === string10 ? interpolate0
8963                 : interpolate0 = interpolate(string00 = string0, string10 = string1);
8964           };
8965         }
8966
8967         function styleRemove$1(name) {
8968           return function() {
8969             this.style.removeProperty(name);
8970           };
8971         }
8972
8973         function styleConstant$1(name, interpolate, value1) {
8974           var string00,
8975               string1 = value1 + "",
8976               interpolate0;
8977           return function() {
8978             var string0 = styleValue(this, name);
8979             return string0 === string1 ? null
8980                 : string0 === string00 ? interpolate0
8981                 : interpolate0 = interpolate(string00 = string0, value1);
8982           };
8983         }
8984
8985         function styleFunction$1(name, interpolate, value) {
8986           var string00,
8987               string10,
8988               interpolate0;
8989           return function() {
8990             var string0 = styleValue(this, name),
8991                 value1 = value(this),
8992                 string1 = value1 + "";
8993             if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
8994             return string0 === string1 ? null
8995                 : string0 === string00 && string1 === string10 ? interpolate0
8996                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8997           };
8998         }
8999
9000         function styleMaybeRemove(id, name) {
9001           var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
9002           return function() {
9003             var schedule = set$1(this, id),
9004                 on = schedule.on,
9005                 listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
9006
9007             // If this node shared a dispatch with the previous node,
9008             // just assign the updated shared dispatch and we’re done!
9009             // Otherwise, copy-on-write.
9010             if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
9011
9012             schedule.on = on1;
9013           };
9014         }
9015
9016         function transition_style(name, value, priority) {
9017           var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
9018           return value == null ? this
9019               .styleTween(name, styleNull(name, i))
9020               .on("end.style." + name, styleRemove$1(name))
9021             : typeof value === "function" ? this
9022               .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
9023               .each(styleMaybeRemove(this._id, name))
9024             : this
9025               .styleTween(name, styleConstant$1(name, i, value), priority)
9026               .on("end.style." + name, null);
9027         }
9028
9029         function styleInterpolate(name, i, priority) {
9030           return function(t) {
9031             this.style.setProperty(name, i(t), priority);
9032           };
9033         }
9034
9035         function styleTween(name, value, priority) {
9036           var t, i0;
9037           function tween() {
9038             var i = value.apply(this, arguments);
9039             if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
9040             return t;
9041           }
9042           tween._value = value;
9043           return tween;
9044         }
9045
9046         function transition_styleTween(name, value, priority) {
9047           var key = "style." + (name += "");
9048           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
9049           if (value == null) return this.tween(key, null);
9050           if (typeof value !== "function") throw new Error;
9051           return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
9052         }
9053
9054         function textConstant$1(value) {
9055           return function() {
9056             this.textContent = value;
9057           };
9058         }
9059
9060         function textFunction$1(value) {
9061           return function() {
9062             var value1 = value(this);
9063             this.textContent = value1 == null ? "" : value1;
9064           };
9065         }
9066
9067         function transition_text(value) {
9068           return this.tween("text", typeof value === "function"
9069               ? textFunction$1(tweenValue(this, "text", value))
9070               : textConstant$1(value == null ? "" : value + ""));
9071         }
9072
9073         function transition_transition() {
9074           var name = this._name,
9075               id0 = this._id,
9076               id1 = newId();
9077
9078           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9079             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9080               if (node = group[i]) {
9081                 var inherit = get$2(node, id0);
9082                 schedule(node, name, id1, i, group, {
9083                   time: inherit.time + inherit.delay + inherit.duration,
9084                   delay: 0,
9085                   duration: inherit.duration,
9086                   ease: inherit.ease
9087                 });
9088               }
9089             }
9090           }
9091
9092           return new Transition(groups, this._parents, name, id1);
9093         }
9094
9095         function transition_end() {
9096           var on0, on1, that = this, id = that._id, size = that.size();
9097           return new Promise(function(resolve, reject) {
9098             var cancel = {value: reject},
9099                 end = {value: function() { if (--size === 0) resolve(); }};
9100
9101             that.each(function() {
9102               var schedule = set$1(this, id),
9103                   on = schedule.on;
9104
9105               // If this node shared a dispatch with the previous node,
9106               // just assign the updated shared dispatch and we’re done!
9107               // Otherwise, copy-on-write.
9108               if (on !== on0) {
9109                 on1 = (on0 = on).copy();
9110                 on1._.cancel.push(cancel);
9111                 on1._.interrupt.push(cancel);
9112                 on1._.end.push(end);
9113               }
9114
9115               schedule.on = on1;
9116             });
9117           });
9118         }
9119
9120         var id$4 = 0;
9121
9122         function Transition(groups, parents, name, id) {
9123           this._groups = groups;
9124           this._parents = parents;
9125           this._name = name;
9126           this._id = id;
9127         }
9128
9129         function transition(name) {
9130           return selection().transition(name);
9131         }
9132
9133         function newId() {
9134           return ++id$4;
9135         }
9136
9137         var selection_prototype = selection.prototype;
9138
9139         Transition.prototype = transition.prototype = {
9140           constructor: Transition,
9141           select: transition_select,
9142           selectAll: transition_selectAll,
9143           filter: transition_filter,
9144           merge: transition_merge,
9145           selection: transition_selection,
9146           transition: transition_transition,
9147           call: selection_prototype.call,
9148           nodes: selection_prototype.nodes,
9149           node: selection_prototype.node,
9150           size: selection_prototype.size,
9151           empty: selection_prototype.empty,
9152           each: selection_prototype.each,
9153           on: transition_on,
9154           attr: transition_attr,
9155           attrTween: transition_attrTween,
9156           style: transition_style,
9157           styleTween: transition_styleTween,
9158           text: transition_text,
9159           remove: transition_remove,
9160           tween: transition_tween,
9161           delay: transition_delay,
9162           duration: transition_duration,
9163           ease: transition_ease,
9164           end: transition_end
9165         };
9166
9167         function linear$1(t) {
9168           return +t;
9169         }
9170
9171         function quadIn(t) {
9172           return t * t;
9173         }
9174
9175         function quadOut(t) {
9176           return t * (2 - t);
9177         }
9178
9179         function quadInOut(t) {
9180           return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
9181         }
9182
9183         function cubicIn(t) {
9184           return t * t * t;
9185         }
9186
9187         function cubicOut(t) {
9188           return --t * t * t + 1;
9189         }
9190
9191         function cubicInOut(t) {
9192           return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
9193         }
9194
9195         var exponent = 3;
9196
9197         var polyIn = (function custom(e) {
9198           e = +e;
9199
9200           function polyIn(t) {
9201             return Math.pow(t, e);
9202           }
9203
9204           polyIn.exponent = custom;
9205
9206           return polyIn;
9207         })(exponent);
9208
9209         var polyOut = (function custom(e) {
9210           e = +e;
9211
9212           function polyOut(t) {
9213             return 1 - Math.pow(1 - t, e);
9214           }
9215
9216           polyOut.exponent = custom;
9217
9218           return polyOut;
9219         })(exponent);
9220
9221         var polyInOut = (function custom(e) {
9222           e = +e;
9223
9224           function polyInOut(t) {
9225             return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
9226           }
9227
9228           polyInOut.exponent = custom;
9229
9230           return polyInOut;
9231         })(exponent);
9232
9233         var pi = Math.PI,
9234             halfPi = pi / 2;
9235
9236         function sinIn(t) {
9237           return 1 - Math.cos(t * halfPi);
9238         }
9239
9240         function sinOut(t) {
9241           return Math.sin(t * halfPi);
9242         }
9243
9244         function sinInOut(t) {
9245           return (1 - Math.cos(pi * t)) / 2;
9246         }
9247
9248         function expIn(t) {
9249           return Math.pow(2, 10 * t - 10);
9250         }
9251
9252         function expOut(t) {
9253           return 1 - Math.pow(2, -10 * t);
9254         }
9255
9256         function expInOut(t) {
9257           return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
9258         }
9259
9260         function circleIn(t) {
9261           return 1 - Math.sqrt(1 - t * t);
9262         }
9263
9264         function circleOut(t) {
9265           return Math.sqrt(1 - --t * t);
9266         }
9267
9268         function circleInOut(t) {
9269           return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
9270         }
9271
9272         var b1 = 4 / 11,
9273             b2 = 6 / 11,
9274             b3 = 8 / 11,
9275             b4 = 3 / 4,
9276             b5 = 9 / 11,
9277             b6 = 10 / 11,
9278             b7 = 15 / 16,
9279             b8 = 21 / 22,
9280             b9 = 63 / 64,
9281             b0 = 1 / b1 / b1;
9282
9283         function bounceIn(t) {
9284           return 1 - bounceOut(1 - t);
9285         }
9286
9287         function bounceOut(t) {
9288           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;
9289         }
9290
9291         function bounceInOut(t) {
9292           return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
9293         }
9294
9295         var overshoot = 1.70158;
9296
9297         var backIn = (function custom(s) {
9298           s = +s;
9299
9300           function backIn(t) {
9301             return t * t * ((s + 1) * t - s);
9302           }
9303
9304           backIn.overshoot = custom;
9305
9306           return backIn;
9307         })(overshoot);
9308
9309         var backOut = (function custom(s) {
9310           s = +s;
9311
9312           function backOut(t) {
9313             return --t * t * ((s + 1) * t + s) + 1;
9314           }
9315
9316           backOut.overshoot = custom;
9317
9318           return backOut;
9319         })(overshoot);
9320
9321         var backInOut = (function custom(s) {
9322           s = +s;
9323
9324           function backInOut(t) {
9325             return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
9326           }
9327
9328           backInOut.overshoot = custom;
9329
9330           return backInOut;
9331         })(overshoot);
9332
9333         var tau = 2 * Math.PI,
9334             amplitude = 1,
9335             period = 0.3;
9336
9337         var elasticIn = (function custom(a, p) {
9338           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9339
9340           function elasticIn(t) {
9341             return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
9342           }
9343
9344           elasticIn.amplitude = function(a) { return custom(a, p * tau); };
9345           elasticIn.period = function(p) { return custom(a, p); };
9346
9347           return elasticIn;
9348         })(amplitude, period);
9349
9350         var elasticOut = (function custom(a, p) {
9351           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9352
9353           function elasticOut(t) {
9354             return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
9355           }
9356
9357           elasticOut.amplitude = function(a) { return custom(a, p * tau); };
9358           elasticOut.period = function(p) { return custom(a, p); };
9359
9360           return elasticOut;
9361         })(amplitude, period);
9362
9363         var elasticInOut = (function custom(a, p) {
9364           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9365
9366           function elasticInOut(t) {
9367             return ((t = t * 2 - 1) < 0
9368                 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
9369                 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
9370           }
9371
9372           elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
9373           elasticInOut.period = function(p) { return custom(a, p); };
9374
9375           return elasticInOut;
9376         })(amplitude, period);
9377
9378         var defaultTiming = {
9379           time: null, // Set on use.
9380           delay: 0,
9381           duration: 250,
9382           ease: cubicInOut
9383         };
9384
9385         function inherit(node, id) {
9386           var timing;
9387           while (!(timing = node.__transition) || !(timing = timing[id])) {
9388             if (!(node = node.parentNode)) {
9389               return defaultTiming.time = now(), defaultTiming;
9390             }
9391           }
9392           return timing;
9393         }
9394
9395         function selection_transition(name) {
9396           var id,
9397               timing;
9398
9399           if (name instanceof Transition) {
9400             id = name._id, name = name._name;
9401           } else {
9402             id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
9403           }
9404
9405           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9406             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9407               if (node = group[i]) {
9408                 schedule(node, name, id, i, group, timing || inherit(node, id));
9409               }
9410             }
9411           }
9412
9413           return new Transition(groups, this._parents, name, id);
9414         }
9415
9416         selection.prototype.interrupt = selection_interrupt;
9417         selection.prototype.transition = selection_transition;
9418
9419         var root$2 = [null];
9420
9421         function active(node, name) {
9422           var schedules = node.__transition,
9423               schedule,
9424               i;
9425
9426           if (schedules) {
9427             name = name == null ? null : name + "";
9428             for (i in schedules) {
9429               if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
9430                 return new Transition([[node]], root$2, name, +i);
9431               }
9432             }
9433           }
9434
9435           return null;
9436         }
9437
9438         function constant$4(x) {
9439           return function() {
9440             return x;
9441           };
9442         }
9443
9444         function BrushEvent(target, type, selection) {
9445           this.target = target;
9446           this.type = type;
9447           this.selection = selection;
9448         }
9449
9450         function nopropagation$1() {
9451           event.stopImmediatePropagation();
9452         }
9453
9454         function noevent$1() {
9455           event.preventDefault();
9456           event.stopImmediatePropagation();
9457         }
9458
9459         var MODE_DRAG = {name: "drag"},
9460             MODE_SPACE = {name: "space"},
9461             MODE_HANDLE = {name: "handle"},
9462             MODE_CENTER = {name: "center"};
9463
9464         var X = {
9465           name: "x",
9466           handles: ["e", "w"].map(type),
9467           input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
9468           output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
9469         };
9470
9471         var Y = {
9472           name: "y",
9473           handles: ["n", "s"].map(type),
9474           input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
9475           output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
9476         };
9477
9478         var XY = {
9479           name: "xy",
9480           handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
9481           input: function(xy) { return xy; },
9482           output: function(xy) { return xy; }
9483         };
9484
9485         var cursors = {
9486           overlay: "crosshair",
9487           selection: "move",
9488           n: "ns-resize",
9489           e: "ew-resize",
9490           s: "ns-resize",
9491           w: "ew-resize",
9492           nw: "nwse-resize",
9493           ne: "nesw-resize",
9494           se: "nwse-resize",
9495           sw: "nesw-resize"
9496         };
9497
9498         var flipX = {
9499           e: "w",
9500           w: "e",
9501           nw: "ne",
9502           ne: "nw",
9503           se: "sw",
9504           sw: "se"
9505         };
9506
9507         var flipY = {
9508           n: "s",
9509           s: "n",
9510           nw: "sw",
9511           ne: "se",
9512           se: "ne",
9513           sw: "nw"
9514         };
9515
9516         var signsX = {
9517           overlay: +1,
9518           selection: +1,
9519           n: null,
9520           e: +1,
9521           s: null,
9522           w: -1,
9523           nw: -1,
9524           ne: +1,
9525           se: +1,
9526           sw: -1
9527         };
9528
9529         var signsY = {
9530           overlay: +1,
9531           selection: +1,
9532           n: -1,
9533           e: null,
9534           s: +1,
9535           w: null,
9536           nw: -1,
9537           ne: -1,
9538           se: +1,
9539           sw: +1
9540         };
9541
9542         function type(t) {
9543           return {type: t};
9544         }
9545
9546         // Ignore right-click, since that should open the context menu.
9547         function defaultFilter$1() {
9548           return !event.button;
9549         }
9550
9551         function defaultExtent() {
9552           var svg = this.ownerSVGElement || this;
9553           return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
9554         }
9555
9556         // Like d3.local, but with the name “__brush” rather than auto-generated.
9557         function local$1(node) {
9558           while (!node.__brush) if (!(node = node.parentNode)) return;
9559           return node.__brush;
9560         }
9561
9562         function empty$1(extent) {
9563           return extent[0][0] === extent[1][0]
9564               || extent[0][1] === extent[1][1];
9565         }
9566
9567         function brushSelection(node) {
9568           var state = node.__brush;
9569           return state ? state.dim.output(state.selection) : null;
9570         }
9571
9572         function brushX() {
9573           return brush$1(X);
9574         }
9575
9576         function brushY() {
9577           return brush$1(Y);
9578         }
9579
9580         function brush() {
9581           return brush$1(XY);
9582         }
9583
9584         function brush$1(dim) {
9585           var extent = defaultExtent,
9586               filter = defaultFilter$1,
9587               listeners = dispatch(brush, "start", "brush", "end"),
9588               handleSize = 6,
9589               touchending;
9590
9591           function brush(group) {
9592             var overlay = group
9593                 .property("__brush", initialize)
9594               .selectAll(".overlay")
9595               .data([type("overlay")]);
9596
9597             overlay.enter().append("rect")
9598                 .attr("class", "overlay")
9599                 .attr("pointer-events", "all")
9600                 .attr("cursor", cursors.overlay)
9601               .merge(overlay)
9602                 .each(function() {
9603                   var extent = local$1(this).extent;
9604                   d3_select(this)
9605                       .attr("x", extent[0][0])
9606                       .attr("y", extent[0][1])
9607                       .attr("width", extent[1][0] - extent[0][0])
9608                       .attr("height", extent[1][1] - extent[0][1]);
9609                 });
9610
9611             group.selectAll(".selection")
9612               .data([type("selection")])
9613               .enter().append("rect")
9614                 .attr("class", "selection")
9615                 .attr("cursor", cursors.selection)
9616                 .attr("fill", "#777")
9617                 .attr("fill-opacity", 0.3)
9618                 .attr("stroke", "#fff")
9619                 .attr("shape-rendering", "crispEdges");
9620
9621             var handle = group.selectAll(".handle")
9622               .data(dim.handles, function(d) { return d.type; });
9623
9624             handle.exit().remove();
9625
9626             handle.enter().append("rect")
9627                 .attr("class", function(d) { return "handle handle--" + d.type; })
9628                 .attr("cursor", function(d) { return cursors[d.type]; });
9629
9630             group
9631                 .each(redraw)
9632                 .attr("fill", "none")
9633                 .attr("pointer-events", "all")
9634                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
9635                 .on("mousedown.brush touchstart.brush", started);
9636           }
9637
9638           brush.move = function(group, selection) {
9639             if (group.selection) {
9640               group
9641                   .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
9642                   .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
9643                   .tween("brush", function() {
9644                     var that = this,
9645                         state = that.__brush,
9646                         emit = emitter(that, arguments),
9647                         selection0 = state.selection,
9648                         selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
9649                         i = d3_interpolate(selection0, selection1);
9650
9651                     function tween(t) {
9652                       state.selection = t === 1 && empty$1(selection1) ? null : i(t);
9653                       redraw.call(that);
9654                       emit.brush();
9655                     }
9656
9657                     return selection0 && selection1 ? tween : tween(1);
9658                   });
9659             } else {
9660               group
9661                   .each(function() {
9662                     var that = this,
9663                         args = arguments,
9664                         state = that.__brush,
9665                         selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
9666                         emit = emitter(that, args).beforestart();
9667
9668                     interrupt(that);
9669                     state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
9670                     redraw.call(that);
9671                     emit.start().brush().end();
9672                   });
9673             }
9674           };
9675
9676           function redraw() {
9677             var group = d3_select(this),
9678                 selection = local$1(this).selection;
9679
9680             if (selection) {
9681               group.selectAll(".selection")
9682                   .style("display", null)
9683                   .attr("x", selection[0][0])
9684                   .attr("y", selection[0][1])
9685                   .attr("width", selection[1][0] - selection[0][0])
9686                   .attr("height", selection[1][1] - selection[0][1]);
9687
9688               group.selectAll(".handle")
9689                   .style("display", null)
9690                   .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
9691                   .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
9692                   .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
9693                   .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
9694             }
9695
9696             else {
9697               group.selectAll(".selection,.handle")
9698                   .style("display", "none")
9699                   .attr("x", null)
9700                   .attr("y", null)
9701                   .attr("width", null)
9702                   .attr("height", null);
9703             }
9704           }
9705
9706           function emitter(that, args) {
9707             return that.__brush.emitter || new Emitter(that, args);
9708           }
9709
9710           function Emitter(that, args) {
9711             this.that = that;
9712             this.args = args;
9713             this.state = that.__brush;
9714             this.active = 0;
9715           }
9716
9717           Emitter.prototype = {
9718             beforestart: function() {
9719               if (++this.active === 1) this.state.emitter = this, this.starting = true;
9720               return this;
9721             },
9722             start: function() {
9723               if (this.starting) this.starting = false, this.emit("start");
9724               return this;
9725             },
9726             brush: function() {
9727               this.emit("brush");
9728               return this;
9729             },
9730             end: function() {
9731               if (--this.active === 0) delete this.state.emitter, this.emit("end");
9732               return this;
9733             },
9734             emit: function(type) {
9735               customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
9736             }
9737           };
9738
9739           function started() {
9740             if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
9741             else if (touchending) return;
9742             if (!filter.apply(this, arguments)) return;
9743
9744             var that = this,
9745                 type = event.target.__data__.type,
9746                 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
9747                 signX = dim === Y ? null : signsX[type],
9748                 signY = dim === X ? null : signsY[type],
9749                 state = local$1(that),
9750                 extent = state.extent,
9751                 selection = state.selection,
9752                 W = extent[0][0], w0, w1,
9753                 N = extent[0][1], n0, n1,
9754                 E = extent[1][0], e0, e1,
9755                 S = extent[1][1], s0, s1,
9756                 dx,
9757                 dy,
9758                 moving,
9759                 shifting = signX && signY && event.shiftKey,
9760                 lockX,
9761                 lockY,
9762                 point0 = d3_mouse(that),
9763                 point = point0,
9764                 emit = emitter(that, arguments).beforestart();
9765
9766             if (type === "overlay") {
9767               state.selection = selection = [
9768                 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
9769                 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
9770               ];
9771             } else {
9772               w0 = selection[0][0];
9773               n0 = selection[0][1];
9774               e0 = selection[1][0];
9775               s0 = selection[1][1];
9776             }
9777
9778             w1 = w0;
9779             n1 = n0;
9780             e1 = e0;
9781             s1 = s0;
9782
9783             var group = d3_select(that)
9784                 .attr("pointer-events", "none");
9785
9786             var overlay = group.selectAll(".overlay")
9787                 .attr("cursor", cursors[type]);
9788
9789             if (event.touches) {
9790               group
9791                   .on("touchmove.brush", moved, true)
9792                   .on("touchend.brush touchcancel.brush", ended, true);
9793             } else {
9794               var view = d3_select(event.view)
9795                   .on("keydown.brush", keydowned, true)
9796                   .on("keyup.brush", keyupped, true)
9797                   .on("mousemove.brush", moved, true)
9798                   .on("mouseup.brush", ended, true);
9799
9800               dragDisable(event.view);
9801             }
9802
9803             nopropagation$1();
9804             interrupt(that);
9805             redraw.call(that);
9806             emit.start();
9807
9808             function moved() {
9809               var point1 = d3_mouse(that);
9810               if (shifting && !lockX && !lockY) {
9811                 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
9812                 else lockX = true;
9813               }
9814               point = point1;
9815               moving = true;
9816               noevent$1();
9817               move();
9818             }
9819
9820             function move() {
9821               var t;
9822
9823               dx = point[0] - point0[0];
9824               dy = point[1] - point0[1];
9825
9826               switch (mode) {
9827                 case MODE_SPACE:
9828                 case MODE_DRAG: {
9829                   if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
9830                   if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
9831                   break;
9832                 }
9833                 case MODE_HANDLE: {
9834                   if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
9835                   else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
9836                   if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
9837                   else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
9838                   break;
9839                 }
9840                 case MODE_CENTER: {
9841                   if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
9842                   if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
9843                   break;
9844                 }
9845               }
9846
9847               if (e1 < w1) {
9848                 signX *= -1;
9849                 t = w0, w0 = e0, e0 = t;
9850                 t = w1, w1 = e1, e1 = t;
9851                 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
9852               }
9853
9854               if (s1 < n1) {
9855                 signY *= -1;
9856                 t = n0, n0 = s0, s0 = t;
9857                 t = n1, n1 = s1, s1 = t;
9858                 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
9859               }
9860
9861               if (state.selection) selection = state.selection; // May be set by brush.move!
9862               if (lockX) w1 = selection[0][0], e1 = selection[1][0];
9863               if (lockY) n1 = selection[0][1], s1 = selection[1][1];
9864
9865               if (selection[0][0] !== w1
9866                   || selection[0][1] !== n1
9867                   || selection[1][0] !== e1
9868                   || selection[1][1] !== s1) {
9869                 state.selection = [[w1, n1], [e1, s1]];
9870                 redraw.call(that);
9871                 emit.brush();
9872               }
9873             }
9874
9875             function ended() {
9876               nopropagation$1();
9877               if (event.touches) {
9878                 if (event.touches.length) return;
9879                 if (touchending) clearTimeout(touchending);
9880                 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
9881                 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
9882               } else {
9883                 yesdrag(event.view, moving);
9884                 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
9885               }
9886               group.attr("pointer-events", "all");
9887               overlay.attr("cursor", cursors.overlay);
9888               if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
9889               if (empty$1(selection)) state.selection = null, redraw.call(that);
9890               emit.end();
9891             }
9892
9893             function keydowned() {
9894               switch (event.keyCode) {
9895                 case 16: { // SHIFT
9896                   shifting = signX && signY;
9897                   break;
9898                 }
9899                 case 18: { // ALT
9900                   if (mode === MODE_HANDLE) {
9901                     if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9902                     if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9903                     mode = MODE_CENTER;
9904                     move();
9905                   }
9906                   break;
9907                 }
9908                 case 32: { // SPACE; takes priority over ALT
9909                   if (mode === MODE_HANDLE || mode === MODE_CENTER) {
9910                     if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
9911                     if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
9912                     mode = MODE_SPACE;
9913                     overlay.attr("cursor", cursors.selection);
9914                     move();
9915                   }
9916                   break;
9917                 }
9918                 default: return;
9919               }
9920               noevent$1();
9921             }
9922
9923             function keyupped() {
9924               switch (event.keyCode) {
9925                 case 16: { // SHIFT
9926                   if (shifting) {
9927                     lockX = lockY = shifting = false;
9928                     move();
9929                   }
9930                   break;
9931                 }
9932                 case 18: { // ALT
9933                   if (mode === MODE_CENTER) {
9934                     if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9935                     if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9936                     mode = MODE_HANDLE;
9937                     move();
9938                   }
9939                   break;
9940                 }
9941                 case 32: { // SPACE
9942                   if (mode === MODE_SPACE) {
9943                     if (event.altKey) {
9944                       if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9945                       if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9946                       mode = MODE_CENTER;
9947                     } else {
9948                       if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9949                       if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9950                       mode = MODE_HANDLE;
9951                     }
9952                     overlay.attr("cursor", cursors[type]);
9953                     move();
9954                   }
9955                   break;
9956                 }
9957                 default: return;
9958               }
9959               noevent$1();
9960             }
9961           }
9962
9963           function initialize() {
9964             var state = this.__brush || {selection: null};
9965             state.extent = extent.apply(this, arguments);
9966             state.dim = dim;
9967             return state;
9968           }
9969
9970           brush.extent = function(_) {
9971             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
9972           };
9973
9974           brush.filter = function(_) {
9975             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
9976           };
9977
9978           brush.handleSize = function(_) {
9979             return arguments.length ? (handleSize = +_, brush) : handleSize;
9980           };
9981
9982           brush.on = function() {
9983             var value = listeners.on.apply(listeners, arguments);
9984             return value === listeners ? brush : value;
9985           };
9986
9987           return brush;
9988         }
9989
9990         var cos = Math.cos;
9991         var sin = Math.sin;
9992         var pi$1 = Math.PI;
9993         var halfPi$1 = pi$1 / 2;
9994         var tau$1 = pi$1 * 2;
9995         var max$3 = Math.max;
9996
9997         function compareValue(compare) {
9998           return function(a, b) {
9999             return compare(
10000               a.source.value + a.target.value,
10001               b.source.value + b.target.value
10002             );
10003           };
10004         }
10005
10006         function chord() {
10007           var padAngle = 0,
10008               sortGroups = null,
10009               sortSubgroups = null,
10010               sortChords = null;
10011
10012           function chord(matrix) {
10013             var n = matrix.length,
10014                 groupSums = [],
10015                 groupIndex = d3_range(n),
10016                 subgroupIndex = [],
10017                 chords = [],
10018                 groups = chords.groups = new Array(n),
10019                 subgroups = new Array(n * n),
10020                 k,
10021                 x,
10022                 x0,
10023                 dx,
10024                 i,
10025                 j;
10026
10027             // Compute the sum.
10028             k = 0, i = -1; while (++i < n) {
10029               x = 0, j = -1; while (++j < n) {
10030                 x += matrix[i][j];
10031               }
10032               groupSums.push(x);
10033               subgroupIndex.push(d3_range(n));
10034               k += x;
10035             }
10036
10037             // Sort groups…
10038             if (sortGroups) groupIndex.sort(function(a, b) {
10039               return sortGroups(groupSums[a], groupSums[b]);
10040             });
10041
10042             // Sort subgroups…
10043             if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
10044               d.sort(function(a, b) {
10045                 return sortSubgroups(matrix[i][a], matrix[i][b]);
10046               });
10047             });
10048
10049             // Convert the sum to scaling factor for [0, 2pi].
10050             // TODO Allow start and end angle to be specified?
10051             // TODO Allow padding to be specified as percentage?
10052             k = max$3(0, tau$1 - padAngle * n) / k;
10053             dx = k ? padAngle : tau$1 / n;
10054
10055             // Compute the start and end angle for each group and subgroup.
10056             // Note: Opera has a bug reordering object literal properties!
10057             x = 0, i = -1; while (++i < n) {
10058               x0 = x, j = -1; while (++j < n) {
10059                 var di = groupIndex[i],
10060                     dj = subgroupIndex[di][j],
10061                     v = matrix[di][dj],
10062                     a0 = x,
10063                     a1 = x += v * k;
10064                 subgroups[dj * n + di] = {
10065                   index: di,
10066                   subindex: dj,
10067                   startAngle: a0,
10068                   endAngle: a1,
10069                   value: v
10070                 };
10071               }
10072               groups[di] = {
10073                 index: di,
10074                 startAngle: x0,
10075                 endAngle: x,
10076                 value: groupSums[di]
10077               };
10078               x += dx;
10079             }
10080
10081             // Generate chords for each (non-empty) subgroup-subgroup link.
10082             i = -1; while (++i < n) {
10083               j = i - 1; while (++j < n) {
10084                 var source = subgroups[j * n + i],
10085                     target = subgroups[i * n + j];
10086                 if (source.value || target.value) {
10087                   chords.push(source.value < target.value
10088                       ? {source: target, target: source}
10089                       : {source: source, target: target});
10090                 }
10091               }
10092             }
10093
10094             return sortChords ? chords.sort(sortChords) : chords;
10095           }
10096
10097           chord.padAngle = function(_) {
10098             return arguments.length ? (padAngle = max$3(0, _), chord) : padAngle;
10099           };
10100
10101           chord.sortGroups = function(_) {
10102             return arguments.length ? (sortGroups = _, chord) : sortGroups;
10103           };
10104
10105           chord.sortSubgroups = function(_) {
10106             return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
10107           };
10108
10109           chord.sortChords = function(_) {
10110             return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
10111           };
10112
10113           return chord;
10114         }
10115
10116         var slice$6 = Array.prototype.slice;
10117
10118         function constant$5(x) {
10119           return function() {
10120             return x;
10121           };
10122         }
10123
10124         var pi$2 = Math.PI,
10125             tau$2 = 2 * pi$2,
10126             epsilon$1 = 1e-6,
10127             tauEpsilon = tau$2 - epsilon$1;
10128
10129         function Path() {
10130           this._x0 = this._y0 = // start of current subpath
10131           this._x1 = this._y1 = null; // end of current subpath
10132           this._ = "";
10133         }
10134
10135         function path() {
10136           return new Path;
10137         }
10138
10139         Path.prototype = path.prototype = {
10140           constructor: Path,
10141           moveTo: function(x, y) {
10142             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
10143           },
10144           closePath: function() {
10145             if (this._x1 !== null) {
10146               this._x1 = this._x0, this._y1 = this._y0;
10147               this._ += "Z";
10148             }
10149           },
10150           lineTo: function(x, y) {
10151             this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
10152           },
10153           quadraticCurveTo: function(x1, y1, x, y) {
10154             this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10155           },
10156           bezierCurveTo: function(x1, y1, x2, y2, x, y) {
10157             this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10158           },
10159           arcTo: function(x1, y1, x2, y2, r) {
10160             x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
10161             var x0 = this._x1,
10162                 y0 = this._y1,
10163                 x21 = x2 - x1,
10164                 y21 = y2 - y1,
10165                 x01 = x0 - x1,
10166                 y01 = y0 - y1,
10167                 l01_2 = x01 * x01 + y01 * y01;
10168
10169             // Is the radius negative? Error.
10170             if (r < 0) throw new Error("negative radius: " + r);
10171
10172             // Is this path empty? Move to (x1,y1).
10173             if (this._x1 === null) {
10174               this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
10175             }
10176
10177             // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
10178             else if (!(l01_2 > epsilon$1));
10179
10180             // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
10181             // Equivalently, is (x1,y1) coincident with (x2,y2)?
10182             // Or, is the radius zero? Line to (x1,y1).
10183             else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
10184               this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
10185             }
10186
10187             // Otherwise, draw an arc!
10188             else {
10189               var x20 = x2 - x0,
10190                   y20 = y2 - y0,
10191                   l21_2 = x21 * x21 + y21 * y21,
10192                   l20_2 = x20 * x20 + y20 * y20,
10193                   l21 = Math.sqrt(l21_2),
10194                   l01 = Math.sqrt(l01_2),
10195                   l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
10196                   t01 = l / l01,
10197                   t21 = l / l21;
10198
10199               // If the start tangent is not coincident with (x0,y0), line to.
10200               if (Math.abs(t01 - 1) > epsilon$1) {
10201                 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
10202               }
10203
10204               this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
10205             }
10206           },
10207           arc: function(x, y, r, a0, a1, ccw) {
10208             x = +x, y = +y, r = +r;
10209             var dx = r * Math.cos(a0),
10210                 dy = r * Math.sin(a0),
10211                 x0 = x + dx,
10212                 y0 = y + dy,
10213                 cw = 1 ^ ccw,
10214                 da = ccw ? a0 - a1 : a1 - a0;
10215
10216             // Is the radius negative? Error.
10217             if (r < 0) throw new Error("negative radius: " + r);
10218
10219             // Is this path empty? Move to (x0,y0).
10220             if (this._x1 === null) {
10221               this._ += "M" + x0 + "," + y0;
10222             }
10223
10224             // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
10225             else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
10226               this._ += "L" + x0 + "," + y0;
10227             }
10228
10229             // Is this arc empty? We’re done.
10230             if (!r) return;
10231
10232             // Does the angle go the wrong way? Flip the direction.
10233             if (da < 0) da = da % tau$2 + tau$2;
10234
10235             // Is this a complete circle? Draw two arcs to complete the circle.
10236             if (da > tauEpsilon) {
10237               this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
10238             }
10239
10240             // Is this arc non-empty? Draw an arc!
10241             else if (da > epsilon$1) {
10242               this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
10243             }
10244           },
10245           rect: function(x, y, w, h) {
10246             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
10247           },
10248           toString: function() {
10249             return this._;
10250           }
10251         };
10252
10253         function defaultSource(d) {
10254           return d.source;
10255         }
10256
10257         function defaultTarget(d) {
10258           return d.target;
10259         }
10260
10261         function defaultRadius(d) {
10262           return d.radius;
10263         }
10264
10265         function defaultStartAngle(d) {
10266           return d.startAngle;
10267         }
10268
10269         function defaultEndAngle(d) {
10270           return d.endAngle;
10271         }
10272
10273         function ribbon() {
10274           var source = defaultSource,
10275               target = defaultTarget,
10276               radius = defaultRadius,
10277               startAngle = defaultStartAngle,
10278               endAngle = defaultEndAngle,
10279               context = null;
10280
10281           function ribbon() {
10282             var buffer,
10283                 argv = slice$6.call(arguments),
10284                 s = source.apply(this, argv),
10285                 t = target.apply(this, argv),
10286                 sr = +radius.apply(this, (argv[0] = s, argv)),
10287                 sa0 = startAngle.apply(this, argv) - halfPi$1,
10288                 sa1 = endAngle.apply(this, argv) - halfPi$1,
10289                 sx0 = sr * cos(sa0),
10290                 sy0 = sr * sin(sa0),
10291                 tr = +radius.apply(this, (argv[0] = t, argv)),
10292                 ta0 = startAngle.apply(this, argv) - halfPi$1,
10293                 ta1 = endAngle.apply(this, argv) - halfPi$1;
10294
10295             if (!context) context = buffer = path();
10296
10297             context.moveTo(sx0, sy0);
10298             context.arc(0, 0, sr, sa0, sa1);
10299             if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
10300               context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
10301               context.arc(0, 0, tr, ta0, ta1);
10302             }
10303             context.quadraticCurveTo(0, 0, sx0, sy0);
10304             context.closePath();
10305
10306             if (buffer) return context = null, buffer + "" || null;
10307           }
10308
10309           ribbon.radius = function(_) {
10310             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
10311           };
10312
10313           ribbon.startAngle = function(_) {
10314             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
10315           };
10316
10317           ribbon.endAngle = function(_) {
10318             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
10319           };
10320
10321           ribbon.source = function(_) {
10322             return arguments.length ? (source = _, ribbon) : source;
10323           };
10324
10325           ribbon.target = function(_) {
10326             return arguments.length ? (target = _, ribbon) : target;
10327           };
10328
10329           ribbon.context = function(_) {
10330             return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
10331           };
10332
10333           return ribbon;
10334         }
10335
10336         var prefix = "$";
10337
10338         function Map$1() {}
10339
10340         Map$1.prototype = map$3.prototype = {
10341           constructor: Map$1,
10342           has: function(key) {
10343             return (prefix + key) in this;
10344           },
10345           get: function(key) {
10346             return this[prefix + key];
10347           },
10348           set: function(key, value) {
10349             this[prefix + key] = value;
10350             return this;
10351           },
10352           remove: function(key) {
10353             var property = prefix + key;
10354             return property in this && delete this[property];
10355           },
10356           clear: function() {
10357             for (var property in this) if (property[0] === prefix) delete this[property];
10358           },
10359           keys: function() {
10360             var keys = [];
10361             for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
10362             return keys;
10363           },
10364           values: function() {
10365             var values = [];
10366             for (var property in this) if (property[0] === prefix) values.push(this[property]);
10367             return values;
10368           },
10369           entries: function() {
10370             var entries = [];
10371             for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
10372             return entries;
10373           },
10374           size: function() {
10375             var size = 0;
10376             for (var property in this) if (property[0] === prefix) ++size;
10377             return size;
10378           },
10379           empty: function() {
10380             for (var property in this) if (property[0] === prefix) return false;
10381             return true;
10382           },
10383           each: function(f) {
10384             for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
10385           }
10386         };
10387
10388         function map$3(object, f) {
10389           var map = new Map$1;
10390
10391           // Copy constructor.
10392           if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
10393
10394           // Index array by numeric index or specified key function.
10395           else if (Array.isArray(object)) {
10396             var i = -1,
10397                 n = object.length,
10398                 o;
10399
10400             if (f == null) while (++i < n) map.set(i, object[i]);
10401             else while (++i < n) map.set(f(o = object[i], i, object), o);
10402           }
10403
10404           // Convert object to map.
10405           else if (object) for (var key in object) map.set(key, object[key]);
10406
10407           return map;
10408         }
10409
10410         function nest() {
10411           var keys = [],
10412               sortKeys = [],
10413               sortValues,
10414               rollup,
10415               nest;
10416
10417           function apply(array, depth, createResult, setResult) {
10418             if (depth >= keys.length) {
10419               if (sortValues != null) array.sort(sortValues);
10420               return rollup != null ? rollup(array) : array;
10421             }
10422
10423             var i = -1,
10424                 n = array.length,
10425                 key = keys[depth++],
10426                 keyValue,
10427                 value,
10428                 valuesByKey = map$3(),
10429                 values,
10430                 result = createResult();
10431
10432             while (++i < n) {
10433               if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
10434                 values.push(value);
10435               } else {
10436                 valuesByKey.set(keyValue, [value]);
10437               }
10438             }
10439
10440             valuesByKey.each(function(values, key) {
10441               setResult(result, key, apply(values, depth, createResult, setResult));
10442             });
10443
10444             return result;
10445           }
10446
10447           function entries(map, depth) {
10448             if (++depth > keys.length) return map;
10449             var array, sortKey = sortKeys[depth - 1];
10450             if (rollup != null && depth >= keys.length) array = map.entries();
10451             else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
10452             return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
10453           }
10454
10455           return nest = {
10456             object: function(array) { return apply(array, 0, createObject, setObject); },
10457             map: function(array) { return apply(array, 0, createMap, setMap); },
10458             entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
10459             key: function(d) { keys.push(d); return nest; },
10460             sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
10461             sortValues: function(order) { sortValues = order; return nest; },
10462             rollup: function(f) { rollup = f; return nest; }
10463           };
10464         }
10465
10466         function createObject() {
10467           return {};
10468         }
10469
10470         function setObject(object, key, value) {
10471           object[key] = value;
10472         }
10473
10474         function createMap() {
10475           return map$3();
10476         }
10477
10478         function setMap(map, key, value) {
10479           map.set(key, value);
10480         }
10481
10482         function Set$1() {}
10483
10484         var proto = map$3.prototype;
10485
10486         Set$1.prototype = set$2.prototype = {
10487           constructor: Set$1,
10488           has: proto.has,
10489           add: function(value) {
10490             value += "";
10491             this[prefix + value] = value;
10492             return this;
10493           },
10494           remove: proto.remove,
10495           clear: proto.clear,
10496           values: proto.keys,
10497           size: proto.size,
10498           empty: proto.empty,
10499           each: proto.each
10500         };
10501
10502         function set$2(object, f) {
10503           var set = new Set$1;
10504
10505           // Copy constructor.
10506           if (object instanceof Set$1) object.each(function(value) { set.add(value); });
10507
10508           // Otherwise, assume it’s an array.
10509           else if (object) {
10510             var i = -1, n = object.length;
10511             if (f == null) while (++i < n) set.add(object[i]);
10512             else while (++i < n) set.add(f(object[i], i, object));
10513           }
10514
10515           return set;
10516         }
10517
10518         function keys$3(map) {
10519           var keys = [];
10520           for (var key in map) keys.push(key);
10521           return keys;
10522         }
10523
10524         function values(map) {
10525           var values = [];
10526           for (var key in map) values.push(map[key]);
10527           return values;
10528         }
10529
10530         function entries(map) {
10531           var entries = [];
10532           for (var key in map) entries.push({key: key, value: map[key]});
10533           return entries;
10534         }
10535
10536         var array$3 = Array.prototype;
10537
10538         var slice$7 = array$3.slice;
10539
10540         function ascending$1(a, b) {
10541           return a - b;
10542         }
10543
10544         function area(ring) {
10545           var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
10546           while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
10547           return area;
10548         }
10549
10550         function constant$6(x) {
10551           return function() {
10552             return x;
10553           };
10554         }
10555
10556         function contains$1(ring, hole) {
10557           var i = -1, n = hole.length, c;
10558           while (++i < n) if (c = ringContains(ring, hole[i])) return c;
10559           return 0;
10560         }
10561
10562         function ringContains(ring, point) {
10563           var x = point[0], y = point[1], contains = -1;
10564           for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
10565             var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
10566             if (segmentContains(pi, pj, point)) return 0;
10567             if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
10568           }
10569           return contains;
10570         }
10571
10572         function segmentContains(a, b, c) {
10573           var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
10574         }
10575
10576         function collinear(a, b, c) {
10577           return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
10578         }
10579
10580         function within(p, q, r) {
10581           return p <= q && q <= r || r <= q && q <= p;
10582         }
10583
10584         function noop$3() {}
10585
10586         var cases = [
10587           [],
10588           [[[1.0, 1.5], [0.5, 1.0]]],
10589           [[[1.5, 1.0], [1.0, 1.5]]],
10590           [[[1.5, 1.0], [0.5, 1.0]]],
10591           [[[1.0, 0.5], [1.5, 1.0]]],
10592           [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
10593           [[[1.0, 0.5], [1.0, 1.5]]],
10594           [[[1.0, 0.5], [0.5, 1.0]]],
10595           [[[0.5, 1.0], [1.0, 0.5]]],
10596           [[[1.0, 1.5], [1.0, 0.5]]],
10597           [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
10598           [[[1.5, 1.0], [1.0, 0.5]]],
10599           [[[0.5, 1.0], [1.5, 1.0]]],
10600           [[[1.0, 1.5], [1.5, 1.0]]],
10601           [[[0.5, 1.0], [1.0, 1.5]]],
10602           []
10603         ];
10604
10605         function contours() {
10606           var dx = 1,
10607               dy = 1,
10608               threshold = thresholdSturges,
10609               smooth = smoothLinear;
10610
10611           function contours(values) {
10612             var tz = threshold(values);
10613
10614             // Convert number of thresholds into uniform thresholds.
10615             if (!Array.isArray(tz)) {
10616               var domain = extent(values), start = domain[0], stop = domain[1];
10617               tz = tickStep(start, stop, tz);
10618               tz = d3_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
10619             } else {
10620               tz = tz.slice().sort(ascending$1);
10621             }
10622
10623             return tz.map(function(value) {
10624               return contour(values, value);
10625             });
10626           }
10627
10628           // Accumulate, smooth contour rings, assign holes to exterior rings.
10629           // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
10630           function contour(values, value) {
10631             var polygons = [],
10632                 holes = [];
10633
10634             isorings(values, value, function(ring) {
10635               smooth(ring, values, value);
10636               if (area(ring) > 0) polygons.push([ring]);
10637               else holes.push(ring);
10638             });
10639
10640             holes.forEach(function(hole) {
10641               for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
10642                 if (contains$1((polygon = polygons[i])[0], hole) !== -1) {
10643                   polygon.push(hole);
10644                   return;
10645                 }
10646               }
10647             });
10648
10649             return {
10650               type: "MultiPolygon",
10651               value: value,
10652               coordinates: polygons
10653             };
10654           }
10655
10656           // Marching squares with isolines stitched into rings.
10657           // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
10658           function isorings(values, value, callback) {
10659             var fragmentByStart = new Array,
10660                 fragmentByEnd = new Array,
10661                 x, y, t0, t1, t2, t3;
10662
10663             // Special case for the first row (y = -1, t2 = t3 = 0).
10664             x = y = -1;
10665             t1 = values[0] >= value;
10666             cases[t1 << 1].forEach(stitch);
10667             while (++x < dx - 1) {
10668               t0 = t1, t1 = values[x + 1] >= value;
10669               cases[t0 | t1 << 1].forEach(stitch);
10670             }
10671             cases[t1 << 0].forEach(stitch);
10672
10673             // General case for the intermediate rows.
10674             while (++y < dy - 1) {
10675               x = -1;
10676               t1 = values[y * dx + dx] >= value;
10677               t2 = values[y * dx] >= value;
10678               cases[t1 << 1 | t2 << 2].forEach(stitch);
10679               while (++x < dx - 1) {
10680                 t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
10681                 t3 = t2, t2 = values[y * dx + x + 1] >= value;
10682                 cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
10683               }
10684               cases[t1 | t2 << 3].forEach(stitch);
10685             }
10686
10687             // Special case for the last row (y = dy - 1, t0 = t1 = 0).
10688             x = -1;
10689             t2 = values[y * dx] >= value;
10690             cases[t2 << 2].forEach(stitch);
10691             while (++x < dx - 1) {
10692               t3 = t2, t2 = values[y * dx + x + 1] >= value;
10693               cases[t2 << 2 | t3 << 3].forEach(stitch);
10694             }
10695             cases[t2 << 3].forEach(stitch);
10696
10697             function stitch(line) {
10698               var start = [line[0][0] + x, line[0][1] + y],
10699                   end = [line[1][0] + x, line[1][1] + y],
10700                   startIndex = index(start),
10701                   endIndex = index(end),
10702                   f, g;
10703               if (f = fragmentByEnd[startIndex]) {
10704                 if (g = fragmentByStart[endIndex]) {
10705                   delete fragmentByEnd[f.end];
10706                   delete fragmentByStart[g.start];
10707                   if (f === g) {
10708                     f.ring.push(end);
10709                     callback(f.ring);
10710                   } else {
10711                     fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
10712                   }
10713                 } else {
10714                   delete fragmentByEnd[f.end];
10715                   f.ring.push(end);
10716                   fragmentByEnd[f.end = endIndex] = f;
10717                 }
10718               } else if (f = fragmentByStart[endIndex]) {
10719                 if (g = fragmentByEnd[startIndex]) {
10720                   delete fragmentByStart[f.start];
10721                   delete fragmentByEnd[g.end];
10722                   if (f === g) {
10723                     f.ring.push(end);
10724                     callback(f.ring);
10725                   } else {
10726                     fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
10727                   }
10728                 } else {
10729                   delete fragmentByStart[f.start];
10730                   f.ring.unshift(start);
10731                   fragmentByStart[f.start = startIndex] = f;
10732                 }
10733               } else {
10734                 fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
10735               }
10736             }
10737           }
10738
10739           function index(point) {
10740             return point[0] * 2 + point[1] * (dx + 1) * 4;
10741           }
10742
10743           function smoothLinear(ring, values, value) {
10744             ring.forEach(function(point) {
10745               var x = point[0],
10746                   y = point[1],
10747                   xt = x | 0,
10748                   yt = y | 0,
10749                   v0,
10750                   v1 = values[yt * dx + xt];
10751               if (x > 0 && x < dx && xt === x) {
10752                 v0 = values[yt * dx + xt - 1];
10753                 point[0] = x + (value - v0) / (v1 - v0) - 0.5;
10754               }
10755               if (y > 0 && y < dy && yt === y) {
10756                 v0 = values[(yt - 1) * dx + xt];
10757                 point[1] = y + (value - v0) / (v1 - v0) - 0.5;
10758               }
10759             });
10760           }
10761
10762           contours.contour = contour;
10763
10764           contours.size = function(_) {
10765             if (!arguments.length) return [dx, dy];
10766             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10767             if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
10768             return dx = _0, dy = _1, contours;
10769           };
10770
10771           contours.thresholds = function(_) {
10772             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), contours) : threshold;
10773           };
10774
10775           contours.smooth = function(_) {
10776             return arguments.length ? (smooth = _ ? smoothLinear : noop$3, contours) : smooth === smoothLinear;
10777           };
10778
10779           return contours;
10780         }
10781
10782         // TODO Optimize edge cases.
10783         // TODO Optimize index calculation.
10784         // TODO Optimize arguments.
10785         function blurX(source, target, r) {
10786           var n = source.width,
10787               m = source.height,
10788               w = (r << 1) + 1;
10789           for (var j = 0; j < m; ++j) {
10790             for (var i = 0, sr = 0; i < n + r; ++i) {
10791               if (i < n) {
10792                 sr += source.data[i + j * n];
10793               }
10794               if (i >= r) {
10795                 if (i >= w) {
10796                   sr -= source.data[i - w + j * n];
10797                 }
10798                 target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
10799               }
10800             }
10801           }
10802         }
10803
10804         // TODO Optimize edge cases.
10805         // TODO Optimize index calculation.
10806         // TODO Optimize arguments.
10807         function blurY(source, target, r) {
10808           var n = source.width,
10809               m = source.height,
10810               w = (r << 1) + 1;
10811           for (var i = 0; i < n; ++i) {
10812             for (var j = 0, sr = 0; j < m + r; ++j) {
10813               if (j < m) {
10814                 sr += source.data[i + j * n];
10815               }
10816               if (j >= r) {
10817                 if (j >= w) {
10818                   sr -= source.data[i + (j - w) * n];
10819                 }
10820                 target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
10821               }
10822             }
10823           }
10824         }
10825
10826         function defaultX(d) {
10827           return d[0];
10828         }
10829
10830         function defaultY(d) {
10831           return d[1];
10832         }
10833
10834         function defaultWeight() {
10835           return 1;
10836         }
10837
10838         function density() {
10839           var x = defaultX,
10840               y = defaultY,
10841               weight = defaultWeight,
10842               dx = 960,
10843               dy = 500,
10844               r = 20, // blur radius
10845               k = 2, // log2(grid cell size)
10846               o = r * 3, // grid offset, to pad for blur
10847               n = (dx + o * 2) >> k, // grid width
10848               m = (dy + o * 2) >> k, // grid height
10849               threshold = constant$6(20);
10850
10851           function density(data) {
10852             var values0 = new Float32Array(n * m),
10853                 values1 = new Float32Array(n * m);
10854
10855             data.forEach(function(d, i, data) {
10856               var xi = (+x(d, i, data) + o) >> k,
10857                   yi = (+y(d, i, data) + o) >> k,
10858                   wi = +weight(d, i, data);
10859               if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
10860                 values0[xi + yi * n] += wi;
10861               }
10862             });
10863
10864             // TODO Optimize.
10865             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10866             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10867             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10868             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10869             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10870             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10871
10872             var tz = threshold(values0);
10873
10874             // Convert number of thresholds into uniform thresholds.
10875             if (!Array.isArray(tz)) {
10876               var stop = max$2(values0);
10877               tz = tickStep(0, stop, tz);
10878               tz = d3_range(0, Math.floor(stop / tz) * tz, tz);
10879               tz.shift();
10880             }
10881
10882             return contours()
10883                 .thresholds(tz)
10884                 .size([n, m])
10885               (values0)
10886                 .map(transform);
10887           }
10888
10889           function transform(geometry) {
10890             geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
10891             geometry.coordinates.forEach(transformPolygon);
10892             return geometry;
10893           }
10894
10895           function transformPolygon(coordinates) {
10896             coordinates.forEach(transformRing);
10897           }
10898
10899           function transformRing(coordinates) {
10900             coordinates.forEach(transformPoint);
10901           }
10902
10903           // TODO Optimize.
10904           function transformPoint(coordinates) {
10905             coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
10906             coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
10907           }
10908
10909           function resize() {
10910             o = r * 3;
10911             n = (dx + o * 2) >> k;
10912             m = (dy + o * 2) >> k;
10913             return density;
10914           }
10915
10916           density.x = function(_) {
10917             return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x;
10918           };
10919
10920           density.y = function(_) {
10921             return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y;
10922           };
10923
10924           density.weight = function(_) {
10925             return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight;
10926           };
10927
10928           density.size = function(_) {
10929             if (!arguments.length) return [dx, dy];
10930             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10931             if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
10932             return dx = _0, dy = _1, resize();
10933           };
10934
10935           density.cellSize = function(_) {
10936             if (!arguments.length) return 1 << k;
10937             if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
10938             return k = Math.floor(Math.log(_) / Math.LN2), resize();
10939           };
10940
10941           density.thresholds = function(_) {
10942             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), density) : threshold;
10943           };
10944
10945           density.bandwidth = function(_) {
10946             if (!arguments.length) return Math.sqrt(r * (r + 1));
10947             if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
10948             return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
10949           };
10950
10951           return density;
10952         }
10953
10954         var EOL = {},
10955             EOF = {},
10956             QUOTE = 34,
10957             NEWLINE = 10,
10958             RETURN = 13;
10959
10960         function objectConverter(columns) {
10961           return new Function("d", "return {" + columns.map(function(name, i) {
10962             return JSON.stringify(name) + ": d[" + i + "]";
10963           }).join(",") + "}");
10964         }
10965
10966         function customConverter(columns, f) {
10967           var object = objectConverter(columns);
10968           return function(row, i) {
10969             return f(object(row), i, columns);
10970           };
10971         }
10972
10973         // Compute unique columns in order of discovery.
10974         function inferColumns(rows) {
10975           var columnSet = Object.create(null),
10976               columns = [];
10977
10978           rows.forEach(function(row) {
10979             for (var column in row) {
10980               if (!(column in columnSet)) {
10981                 columns.push(columnSet[column] = column);
10982               }
10983             }
10984           });
10985
10986           return columns;
10987         }
10988
10989         function pad(value, width) {
10990           var s = value + "", length = s.length;
10991           return length < width ? new Array(width - length + 1).join(0) + s : s;
10992         }
10993
10994         function formatYear(year) {
10995           return year < 0 ? "-" + pad(-year, 6)
10996             : year > 9999 ? "+" + pad(year, 6)
10997             : pad(year, 4);
10998         }
10999
11000         function formatDate(date) {
11001           var hours = date.getUTCHours(),
11002               minutes = date.getUTCMinutes(),
11003               seconds = date.getUTCSeconds(),
11004               milliseconds = date.getUTCMilliseconds();
11005           return isNaN(date) ? "Invalid Date"
11006               : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
11007               + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
11008               : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
11009               : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
11010               : "");
11011         }
11012
11013         function dsvFormat(delimiter) {
11014           var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
11015               DELIMITER = delimiter.charCodeAt(0);
11016
11017           function parse(text, f) {
11018             var convert, columns, rows = parseRows(text, function(row, i) {
11019               if (convert) return convert(row, i - 1);
11020               columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
11021             });
11022             rows.columns = columns || [];
11023             return rows;
11024           }
11025
11026           function parseRows(text, f) {
11027             var rows = [], // output rows
11028                 N = text.length,
11029                 I = 0, // current character index
11030                 n = 0, // current line number
11031                 t, // current token
11032                 eof = N <= 0, // current token followed by EOF?
11033                 eol = false; // current token followed by EOL?
11034
11035             // Strip the trailing newline.
11036             if (text.charCodeAt(N - 1) === NEWLINE) --N;
11037             if (text.charCodeAt(N - 1) === RETURN) --N;
11038
11039             function token() {
11040               if (eof) return EOF;
11041               if (eol) return eol = false, EOL;
11042
11043               // Unescape quotes.
11044               var i, j = I, c;
11045               if (text.charCodeAt(j) === QUOTE) {
11046                 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
11047                 if ((i = I) >= N) eof = true;
11048                 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
11049                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11050                 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
11051               }
11052
11053               // Find next delimiter or newline.
11054               while (I < N) {
11055                 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
11056                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11057                 else if (c !== DELIMITER) continue;
11058                 return text.slice(j, i);
11059               }
11060
11061               // Return last token before EOF.
11062               return eof = true, text.slice(j, N);
11063             }
11064
11065             while ((t = token()) !== EOF) {
11066               var row = [];
11067               while (t !== EOL && t !== EOF) row.push(t), t = token();
11068               if (f && (row = f(row, n++)) == null) continue;
11069               rows.push(row);
11070             }
11071
11072             return rows;
11073           }
11074
11075           function preformatBody(rows, columns) {
11076             return rows.map(function(row) {
11077               return columns.map(function(column) {
11078                 return formatValue(row[column]);
11079               }).join(delimiter);
11080             });
11081           }
11082
11083           function format(rows, columns) {
11084             if (columns == null) columns = inferColumns(rows);
11085             return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
11086           }
11087
11088           function formatBody(rows, columns) {
11089             if (columns == null) columns = inferColumns(rows);
11090             return preformatBody(rows, columns).join("\n");
11091           }
11092
11093           function formatRows(rows) {
11094             return rows.map(formatRow).join("\n");
11095           }
11096
11097           function formatRow(row) {
11098             return row.map(formatValue).join(delimiter);
11099           }
11100
11101           function formatValue(value) {
11102             return value == null ? ""
11103                 : value instanceof Date ? formatDate(value)
11104                 : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
11105                 : value;
11106           }
11107
11108           return {
11109             parse: parse,
11110             parseRows: parseRows,
11111             format: format,
11112             formatBody: formatBody,
11113             formatRows: formatRows
11114           };
11115         }
11116
11117         var csv = dsvFormat(",");
11118
11119         var csvParse = csv.parse;
11120         var csvParseRows = csv.parseRows;
11121         var csvFormat = csv.format;
11122         var csvFormatBody = csv.formatBody;
11123         var csvFormatRows = csv.formatRows;
11124
11125         var tsv = dsvFormat("\t");
11126
11127         var tsvParse = tsv.parse;
11128         var tsvParseRows = tsv.parseRows;
11129         var tsvFormat = tsv.format;
11130         var tsvFormatBody = tsv.formatBody;
11131         var tsvFormatRows = tsv.formatRows;
11132
11133         function autoType(object) {
11134           for (var key in object) {
11135             var value = object[key].trim(), number;
11136             if (!value) value = null;
11137             else if (value === "true") value = true;
11138             else if (value === "false") value = false;
11139             else if (value === "NaN") value = NaN;
11140             else if (!isNaN(number = +value)) value = number;
11141             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);
11142             else continue;
11143             object[key] = value;
11144           }
11145           return object;
11146         }
11147
11148         function responseBlob(response) {
11149           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11150           return response.blob();
11151         }
11152
11153         function blob(input, init) {
11154           return fetch(input, init).then(responseBlob);
11155         }
11156
11157         function responseArrayBuffer(response) {
11158           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11159           return response.arrayBuffer();
11160         }
11161
11162         function buffer(input, init) {
11163           return fetch(input, init).then(responseArrayBuffer);
11164         }
11165
11166         function responseText(response) {
11167           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11168           return response.text();
11169         }
11170
11171         function d3_text(input, init) {
11172           return fetch(input, init).then(responseText);
11173         }
11174
11175         function dsvParse(parse) {
11176           return function(input, init, row) {
11177             if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
11178             return d3_text(input, init).then(function(response) {
11179               return parse(response, row);
11180             });
11181           };
11182         }
11183
11184         function dsv(delimiter, input, init, row) {
11185           if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
11186           var format = dsvFormat(delimiter);
11187           return d3_text(input, init).then(function(response) {
11188             return format.parse(response, row);
11189           });
11190         }
11191
11192         var csv$1 = dsvParse(csvParse);
11193         var tsv$1 = dsvParse(tsvParse);
11194
11195         function image(input, init) {
11196           return new Promise(function(resolve, reject) {
11197             var image = new Image;
11198             for (var key in init) image[key] = init[key];
11199             image.onerror = reject;
11200             image.onload = function() { resolve(image); };
11201             image.src = input;
11202           });
11203         }
11204
11205         function responseJson(response) {
11206           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11207           return response.json();
11208         }
11209
11210         function d3_json(input, init) {
11211           return fetch(input, init).then(responseJson);
11212         }
11213
11214         function parser(type) {
11215           return function(input, init)  {
11216             return d3_text(input, init).then(function(text) {
11217               return (new DOMParser).parseFromString(text, type);
11218             });
11219           };
11220         }
11221
11222         var d3_xml = parser("application/xml");
11223
11224         var html = parser("text/html");
11225
11226         var svg = parser("image/svg+xml");
11227
11228         function center$1(x, y) {
11229           var nodes;
11230
11231           if (x == null) x = 0;
11232           if (y == null) y = 0;
11233
11234           function force() {
11235             var i,
11236                 n = nodes.length,
11237                 node,
11238                 sx = 0,
11239                 sy = 0;
11240
11241             for (i = 0; i < n; ++i) {
11242               node = nodes[i], sx += node.x, sy += node.y;
11243             }
11244
11245             for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
11246               node = nodes[i], node.x -= sx, node.y -= sy;
11247             }
11248           }
11249
11250           force.initialize = function(_) {
11251             nodes = _;
11252           };
11253
11254           force.x = function(_) {
11255             return arguments.length ? (x = +_, force) : x;
11256           };
11257
11258           force.y = function(_) {
11259             return arguments.length ? (y = +_, force) : y;
11260           };
11261
11262           return force;
11263         }
11264
11265         function constant$7(x) {
11266           return function() {
11267             return x;
11268           };
11269         }
11270
11271         function jiggle() {
11272           return (Math.random() - 0.5) * 1e-6;
11273         }
11274
11275         function tree_add(d) {
11276           var x = +this._x.call(null, d),
11277               y = +this._y.call(null, d);
11278           return add(this.cover(x, y), x, y, d);
11279         }
11280
11281         function add(tree, x, y, d) {
11282           if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
11283
11284           var parent,
11285               node = tree._root,
11286               leaf = {data: d},
11287               x0 = tree._x0,
11288               y0 = tree._y0,
11289               x1 = tree._x1,
11290               y1 = tree._y1,
11291               xm,
11292               ym,
11293               xp,
11294               yp,
11295               right,
11296               bottom,
11297               i,
11298               j;
11299
11300           // If the tree is empty, initialize the root as a leaf.
11301           if (!node) return tree._root = leaf, tree;
11302
11303           // Find the existing leaf for the new point, or add it.
11304           while (node.length) {
11305             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11306             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11307             if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
11308           }
11309
11310           // Is the new point is exactly coincident with the existing point?
11311           xp = +tree._x.call(null, node.data);
11312           yp = +tree._y.call(null, node.data);
11313           if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
11314
11315           // Otherwise, split the leaf node until the old and new point are separated.
11316           do {
11317             parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
11318             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11319             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11320           } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
11321           return parent[j] = node, parent[i] = leaf, tree;
11322         }
11323
11324         function addAll(data) {
11325           var d, i, n = data.length,
11326               x,
11327               y,
11328               xz = new Array(n),
11329               yz = new Array(n),
11330               x0 = Infinity,
11331               y0 = Infinity,
11332               x1 = -Infinity,
11333               y1 = -Infinity;
11334
11335           // Compute the points and their extent.
11336           for (i = 0; i < n; ++i) {
11337             if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
11338             xz[i] = x;
11339             yz[i] = y;
11340             if (x < x0) x0 = x;
11341             if (x > x1) x1 = x;
11342             if (y < y0) y0 = y;
11343             if (y > y1) y1 = y;
11344           }
11345
11346           // If there were no (valid) points, abort.
11347           if (x0 > x1 || y0 > y1) return this;
11348
11349           // Expand the tree to cover the new points.
11350           this.cover(x0, y0).cover(x1, y1);
11351
11352           // Add the new points.
11353           for (i = 0; i < n; ++i) {
11354             add(this, xz[i], yz[i], data[i]);
11355           }
11356
11357           return this;
11358         }
11359
11360         function tree_cover(x, y) {
11361           if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
11362
11363           var x0 = this._x0,
11364               y0 = this._y0,
11365               x1 = this._x1,
11366               y1 = this._y1;
11367
11368           // If the quadtree has no extent, initialize them.
11369           // Integer extent are necessary so that if we later double the extent,
11370           // the existing quadrant boundaries don’t change due to floating point error!
11371           if (isNaN(x0)) {
11372             x1 = (x0 = Math.floor(x)) + 1;
11373             y1 = (y0 = Math.floor(y)) + 1;
11374           }
11375
11376           // Otherwise, double repeatedly to cover.
11377           else {
11378             var z = x1 - x0,
11379                 node = this._root,
11380                 parent,
11381                 i;
11382
11383             while (x0 > x || x >= x1 || y0 > y || y >= y1) {
11384               i = (y < y0) << 1 | (x < x0);
11385               parent = new Array(4), parent[i] = node, node = parent, z *= 2;
11386               switch (i) {
11387                 case 0: x1 = x0 + z, y1 = y0 + z; break;
11388                 case 1: x0 = x1 - z, y1 = y0 + z; break;
11389                 case 2: x1 = x0 + z, y0 = y1 - z; break;
11390                 case 3: x0 = x1 - z, y0 = y1 - z; break;
11391               }
11392             }
11393
11394             if (this._root && this._root.length) this._root = node;
11395           }
11396
11397           this._x0 = x0;
11398           this._y0 = y0;
11399           this._x1 = x1;
11400           this._y1 = y1;
11401           return this;
11402         }
11403
11404         function tree_data() {
11405           var data = [];
11406           this.visit(function(node) {
11407             if (!node.length) do data.push(node.data); while (node = node.next)
11408           });
11409           return data;
11410         }
11411
11412         function tree_extent(_) {
11413           return arguments.length
11414               ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
11415               : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
11416         }
11417
11418         function Quad(node, x0, y0, x1, y1) {
11419           this.node = node;
11420           this.x0 = x0;
11421           this.y0 = y0;
11422           this.x1 = x1;
11423           this.y1 = y1;
11424         }
11425
11426         function tree_find(x, y, radius) {
11427           var data,
11428               x0 = this._x0,
11429               y0 = this._y0,
11430               x1,
11431               y1,
11432               x2,
11433               y2,
11434               x3 = this._x1,
11435               y3 = this._y1,
11436               quads = [],
11437               node = this._root,
11438               q,
11439               i;
11440
11441           if (node) quads.push(new Quad(node, x0, y0, x3, y3));
11442           if (radius == null) radius = Infinity;
11443           else {
11444             x0 = x - radius, y0 = y - radius;
11445             x3 = x + radius, y3 = y + radius;
11446             radius *= radius;
11447           }
11448
11449           while (q = quads.pop()) {
11450
11451             // Stop searching if this quadrant can’t contain a closer node.
11452             if (!(node = q.node)
11453                 || (x1 = q.x0) > x3
11454                 || (y1 = q.y0) > y3
11455                 || (x2 = q.x1) < x0
11456                 || (y2 = q.y1) < y0) continue;
11457
11458             // Bisect the current quadrant.
11459             if (node.length) {
11460               var xm = (x1 + x2) / 2,
11461                   ym = (y1 + y2) / 2;
11462
11463               quads.push(
11464                 new Quad(node[3], xm, ym, x2, y2),
11465                 new Quad(node[2], x1, ym, xm, y2),
11466                 new Quad(node[1], xm, y1, x2, ym),
11467                 new Quad(node[0], x1, y1, xm, ym)
11468               );
11469
11470               // Visit the closest quadrant first.
11471               if (i = (y >= ym) << 1 | (x >= xm)) {
11472                 q = quads[quads.length - 1];
11473                 quads[quads.length - 1] = quads[quads.length - 1 - i];
11474                 quads[quads.length - 1 - i] = q;
11475               }
11476             }
11477
11478             // Visit this point. (Visiting coincident points isn’t necessary!)
11479             else {
11480               var dx = x - +this._x.call(null, node.data),
11481                   dy = y - +this._y.call(null, node.data),
11482                   d2 = dx * dx + dy * dy;
11483               if (d2 < radius) {
11484                 var d = Math.sqrt(radius = d2);
11485                 x0 = x - d, y0 = y - d;
11486                 x3 = x + d, y3 = y + d;
11487                 data = node.data;
11488               }
11489             }
11490           }
11491
11492           return data;
11493         }
11494
11495         function tree_remove(d) {
11496           if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
11497
11498           var parent,
11499               node = this._root,
11500               retainer,
11501               previous,
11502               next,
11503               x0 = this._x0,
11504               y0 = this._y0,
11505               x1 = this._x1,
11506               y1 = this._y1,
11507               x,
11508               y,
11509               xm,
11510               ym,
11511               right,
11512               bottom,
11513               i,
11514               j;
11515
11516           // If the tree is empty, initialize the root as a leaf.
11517           if (!node) return this;
11518
11519           // Find the leaf node for the point.
11520           // While descending, also retain the deepest parent with a non-removed sibling.
11521           if (node.length) while (true) {
11522             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11523             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11524             if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
11525             if (!node.length) break;
11526             if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
11527           }
11528
11529           // Find the point to remove.
11530           while (node.data !== d) if (!(previous = node, node = node.next)) return this;
11531           if (next = node.next) delete node.next;
11532
11533           // If there are multiple coincident points, remove just the point.
11534           if (previous) return (next ? previous.next = next : delete previous.next), this;
11535
11536           // If this is the root point, remove it.
11537           if (!parent) return this._root = next, this;
11538
11539           // Remove this leaf.
11540           next ? parent[i] = next : delete parent[i];
11541
11542           // If the parent now contains exactly one leaf, collapse superfluous parents.
11543           if ((node = parent[0] || parent[1] || parent[2] || parent[3])
11544               && node === (parent[3] || parent[2] || parent[1] || parent[0])
11545               && !node.length) {
11546             if (retainer) retainer[j] = node;
11547             else this._root = node;
11548           }
11549
11550           return this;
11551         }
11552
11553         function removeAll(data) {
11554           for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
11555           return this;
11556         }
11557
11558         function tree_root() {
11559           return this._root;
11560         }
11561
11562         function tree_size() {
11563           var size = 0;
11564           this.visit(function(node) {
11565             if (!node.length) do ++size; while (node = node.next)
11566           });
11567           return size;
11568         }
11569
11570         function tree_visit(callback) {
11571           var quads = [], q, node = this._root, child, x0, y0, x1, y1;
11572           if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
11573           while (q = quads.pop()) {
11574             if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
11575               var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11576               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11577               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11578               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11579               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11580             }
11581           }
11582           return this;
11583         }
11584
11585         function tree_visitAfter(callback) {
11586           var quads = [], next = [], q;
11587           if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
11588           while (q = quads.pop()) {
11589             var node = q.node;
11590             if (node.length) {
11591               var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11592               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11593               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11594               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11595               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11596             }
11597             next.push(q);
11598           }
11599           while (q = next.pop()) {
11600             callback(q.node, q.x0, q.y0, q.x1, q.y1);
11601           }
11602           return this;
11603         }
11604
11605         function defaultX$1(d) {
11606           return d[0];
11607         }
11608
11609         function tree_x(_) {
11610           return arguments.length ? (this._x = _, this) : this._x;
11611         }
11612
11613         function defaultY$1(d) {
11614           return d[1];
11615         }
11616
11617         function tree_y(_) {
11618           return arguments.length ? (this._y = _, this) : this._y;
11619         }
11620
11621         function quadtree(nodes, x, y) {
11622           var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN);
11623           return nodes == null ? tree : tree.addAll(nodes);
11624         }
11625
11626         function Quadtree(x, y, x0, y0, x1, y1) {
11627           this._x = x;
11628           this._y = y;
11629           this._x0 = x0;
11630           this._y0 = y0;
11631           this._x1 = x1;
11632           this._y1 = y1;
11633           this._root = undefined;
11634         }
11635
11636         function leaf_copy(leaf) {
11637           var copy = {data: leaf.data}, next = copy;
11638           while (leaf = leaf.next) next = next.next = {data: leaf.data};
11639           return copy;
11640         }
11641
11642         var treeProto = quadtree.prototype = Quadtree.prototype;
11643
11644         treeProto.copy = function() {
11645           var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
11646               node = this._root,
11647               nodes,
11648               child;
11649
11650           if (!node) return copy;
11651
11652           if (!node.length) return copy._root = leaf_copy(node), copy;
11653
11654           nodes = [{source: node, target: copy._root = new Array(4)}];
11655           while (node = nodes.pop()) {
11656             for (var i = 0; i < 4; ++i) {
11657               if (child = node.source[i]) {
11658                 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
11659                 else node.target[i] = leaf_copy(child);
11660               }
11661             }
11662           }
11663
11664           return copy;
11665         };
11666
11667         treeProto.add = tree_add;
11668         treeProto.addAll = addAll;
11669         treeProto.cover = tree_cover;
11670         treeProto.data = tree_data;
11671         treeProto.extent = tree_extent;
11672         treeProto.find = tree_find;
11673         treeProto.remove = tree_remove;
11674         treeProto.removeAll = removeAll;
11675         treeProto.root = tree_root;
11676         treeProto.size = tree_size;
11677         treeProto.visit = tree_visit;
11678         treeProto.visitAfter = tree_visitAfter;
11679         treeProto.x = tree_x;
11680         treeProto.y = tree_y;
11681
11682         function x(d) {
11683           return d.x + d.vx;
11684         }
11685
11686         function y(d) {
11687           return d.y + d.vy;
11688         }
11689
11690         function collide(radius) {
11691           var nodes,
11692               radii,
11693               strength = 1,
11694               iterations = 1;
11695
11696           if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius);
11697
11698           function force() {
11699             var i, n = nodes.length,
11700                 tree,
11701                 node,
11702                 xi,
11703                 yi,
11704                 ri,
11705                 ri2;
11706
11707             for (var k = 0; k < iterations; ++k) {
11708               tree = quadtree(nodes, x, y).visitAfter(prepare);
11709               for (i = 0; i < n; ++i) {
11710                 node = nodes[i];
11711                 ri = radii[node.index], ri2 = ri * ri;
11712                 xi = node.x + node.vx;
11713                 yi = node.y + node.vy;
11714                 tree.visit(apply);
11715               }
11716             }
11717
11718             function apply(quad, x0, y0, x1, y1) {
11719               var data = quad.data, rj = quad.r, r = ri + rj;
11720               if (data) {
11721                 if (data.index > node.index) {
11722                   var x = xi - data.x - data.vx,
11723                       y = yi - data.y - data.vy,
11724                       l = x * x + y * y;
11725                   if (l < r * r) {
11726                     if (x === 0) x = jiggle(), l += x * x;
11727                     if (y === 0) y = jiggle(), l += y * y;
11728                     l = (r - (l = Math.sqrt(l))) / l * strength;
11729                     node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
11730                     node.vy += (y *= l) * r;
11731                     data.vx -= x * (r = 1 - r);
11732                     data.vy -= y * r;
11733                   }
11734                 }
11735                 return;
11736               }
11737               return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
11738             }
11739           }
11740
11741           function prepare(quad) {
11742             if (quad.data) return quad.r = radii[quad.data.index];
11743             for (var i = quad.r = 0; i < 4; ++i) {
11744               if (quad[i] && quad[i].r > quad.r) {
11745                 quad.r = quad[i].r;
11746               }
11747             }
11748           }
11749
11750           function initialize() {
11751             if (!nodes) return;
11752             var i, n = nodes.length, node;
11753             radii = new Array(n);
11754             for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
11755           }
11756
11757           force.initialize = function(_) {
11758             nodes = _;
11759             initialize();
11760           };
11761
11762           force.iterations = function(_) {
11763             return arguments.length ? (iterations = +_, force) : iterations;
11764           };
11765
11766           force.strength = function(_) {
11767             return arguments.length ? (strength = +_, force) : strength;
11768           };
11769
11770           force.radius = function(_) {
11771             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
11772           };
11773
11774           return force;
11775         }
11776
11777         function index(d) {
11778           return d.index;
11779         }
11780
11781         function find(nodeById, nodeId) {
11782           var node = nodeById.get(nodeId);
11783           if (!node) throw new Error("missing: " + nodeId);
11784           return node;
11785         }
11786
11787         function link(links) {
11788           var id = index,
11789               strength = defaultStrength,
11790               strengths,
11791               distance = constant$7(30),
11792               distances,
11793               nodes,
11794               count,
11795               bias,
11796               iterations = 1;
11797
11798           if (links == null) links = [];
11799
11800           function defaultStrength(link) {
11801             return 1 / Math.min(count[link.source.index], count[link.target.index]);
11802           }
11803
11804           function force(alpha) {
11805             for (var k = 0, n = links.length; k < iterations; ++k) {
11806               for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
11807                 link = links[i], source = link.source, target = link.target;
11808                 x = target.x + target.vx - source.x - source.vx || jiggle();
11809                 y = target.y + target.vy - source.y - source.vy || jiggle();
11810                 l = Math.sqrt(x * x + y * y);
11811                 l = (l - distances[i]) / l * alpha * strengths[i];
11812                 x *= l, y *= l;
11813                 target.vx -= x * (b = bias[i]);
11814                 target.vy -= y * b;
11815                 source.vx += x * (b = 1 - b);
11816                 source.vy += y * b;
11817               }
11818             }
11819           }
11820
11821           function initialize() {
11822             if (!nodes) return;
11823
11824             var i,
11825                 n = nodes.length,
11826                 m = links.length,
11827                 nodeById = map$3(nodes, id),
11828                 link;
11829
11830             for (i = 0, count = new Array(n); i < m; ++i) {
11831               link = links[i], link.index = i;
11832               if (typeof link.source !== "object") link.source = find(nodeById, link.source);
11833               if (typeof link.target !== "object") link.target = find(nodeById, link.target);
11834               count[link.source.index] = (count[link.source.index] || 0) + 1;
11835               count[link.target.index] = (count[link.target.index] || 0) + 1;
11836             }
11837
11838             for (i = 0, bias = new Array(m); i < m; ++i) {
11839               link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
11840             }
11841
11842             strengths = new Array(m), initializeStrength();
11843             distances = new Array(m), initializeDistance();
11844           }
11845
11846           function initializeStrength() {
11847             if (!nodes) return;
11848
11849             for (var i = 0, n = links.length; i < n; ++i) {
11850               strengths[i] = +strength(links[i], i, links);
11851             }
11852           }
11853
11854           function initializeDistance() {
11855             if (!nodes) return;
11856
11857             for (var i = 0, n = links.length; i < n; ++i) {
11858               distances[i] = +distance(links[i], i, links);
11859             }
11860           }
11861
11862           force.initialize = function(_) {
11863             nodes = _;
11864             initialize();
11865           };
11866
11867           force.links = function(_) {
11868             return arguments.length ? (links = _, initialize(), force) : links;
11869           };
11870
11871           force.id = function(_) {
11872             return arguments.length ? (id = _, force) : id;
11873           };
11874
11875           force.iterations = function(_) {
11876             return arguments.length ? (iterations = +_, force) : iterations;
11877           };
11878
11879           force.strength = function(_) {
11880             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength;
11881           };
11882
11883           force.distance = function(_) {
11884             return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance;
11885           };
11886
11887           return force;
11888         }
11889
11890         function x$1(d) {
11891           return d.x;
11892         }
11893
11894         function y$1(d) {
11895           return d.y;
11896         }
11897
11898         var initialRadius = 10,
11899             initialAngle = Math.PI * (3 - Math.sqrt(5));
11900
11901         function simulation(nodes) {
11902           var simulation,
11903               alpha = 1,
11904               alphaMin = 0.001,
11905               alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
11906               alphaTarget = 0,
11907               velocityDecay = 0.6,
11908               forces = map$3(),
11909               stepper = timer(step),
11910               event = dispatch("tick", "end");
11911
11912           if (nodes == null) nodes = [];
11913
11914           function step() {
11915             tick();
11916             event.call("tick", simulation);
11917             if (alpha < alphaMin) {
11918               stepper.stop();
11919               event.call("end", simulation);
11920             }
11921           }
11922
11923           function tick(iterations) {
11924             var i, n = nodes.length, node;
11925
11926             if (iterations === undefined) iterations = 1;
11927
11928             for (var k = 0; k < iterations; ++k) {
11929               alpha += (alphaTarget - alpha) * alphaDecay;
11930
11931               forces.each(function (force) {
11932                 force(alpha);
11933               });
11934
11935               for (i = 0; i < n; ++i) {
11936                 node = nodes[i];
11937                 if (node.fx == null) node.x += node.vx *= velocityDecay;
11938                 else node.x = node.fx, node.vx = 0;
11939                 if (node.fy == null) node.y += node.vy *= velocityDecay;
11940                 else node.y = node.fy, node.vy = 0;
11941               }
11942             }
11943
11944             return simulation;
11945           }
11946
11947           function initializeNodes() {
11948             for (var i = 0, n = nodes.length, node; i < n; ++i) {
11949               node = nodes[i], node.index = i;
11950               if (node.fx != null) node.x = node.fx;
11951               if (node.fy != null) node.y = node.fy;
11952               if (isNaN(node.x) || isNaN(node.y)) {
11953                 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
11954                 node.x = radius * Math.cos(angle);
11955                 node.y = radius * Math.sin(angle);
11956               }
11957               if (isNaN(node.vx) || isNaN(node.vy)) {
11958                 node.vx = node.vy = 0;
11959               }
11960             }
11961           }
11962
11963           function initializeForce(force) {
11964             if (force.initialize) force.initialize(nodes);
11965             return force;
11966           }
11967
11968           initializeNodes();
11969
11970           return simulation = {
11971             tick: tick,
11972
11973             restart: function() {
11974               return stepper.restart(step), simulation;
11975             },
11976
11977             stop: function() {
11978               return stepper.stop(), simulation;
11979             },
11980
11981             nodes: function(_) {
11982               return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
11983             },
11984
11985             alpha: function(_) {
11986               return arguments.length ? (alpha = +_, simulation) : alpha;
11987             },
11988
11989             alphaMin: function(_) {
11990               return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
11991             },
11992
11993             alphaDecay: function(_) {
11994               return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
11995             },
11996
11997             alphaTarget: function(_) {
11998               return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
11999             },
12000
12001             velocityDecay: function(_) {
12002               return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
12003             },
12004
12005             force: function(name, _) {
12006               return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
12007             },
12008
12009             find: function(x, y, radius) {
12010               var i = 0,
12011                   n = nodes.length,
12012                   dx,
12013                   dy,
12014                   d2,
12015                   node,
12016                   closest;
12017
12018               if (radius == null) radius = Infinity;
12019               else radius *= radius;
12020
12021               for (i = 0; i < n; ++i) {
12022                 node = nodes[i];
12023                 dx = x - node.x;
12024                 dy = y - node.y;
12025                 d2 = dx * dx + dy * dy;
12026                 if (d2 < radius) closest = node, radius = d2;
12027               }
12028
12029               return closest;
12030             },
12031
12032             on: function(name, _) {
12033               return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
12034             }
12035           };
12036         }
12037
12038         function manyBody() {
12039           var nodes,
12040               node,
12041               alpha,
12042               strength = constant$7(-30),
12043               strengths,
12044               distanceMin2 = 1,
12045               distanceMax2 = Infinity,
12046               theta2 = 0.81;
12047
12048           function force(_) {
12049             var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
12050             for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
12051           }
12052
12053           function initialize() {
12054             if (!nodes) return;
12055             var i, n = nodes.length, node;
12056             strengths = new Array(n);
12057             for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
12058           }
12059
12060           function accumulate(quad) {
12061             var strength = 0, q, c, weight = 0, x, y, i;
12062
12063             // For internal nodes, accumulate forces from child quadrants.
12064             if (quad.length) {
12065               for (x = y = i = 0; i < 4; ++i) {
12066                 if ((q = quad[i]) && (c = Math.abs(q.value))) {
12067                   strength += q.value, weight += c, x += c * q.x, y += c * q.y;
12068                 }
12069               }
12070               quad.x = x / weight;
12071               quad.y = y / weight;
12072             }
12073
12074             // For leaf nodes, accumulate forces from coincident quadrants.
12075             else {
12076               q = quad;
12077               q.x = q.data.x;
12078               q.y = q.data.y;
12079               do strength += strengths[q.data.index];
12080               while (q = q.next);
12081             }
12082
12083             quad.value = strength;
12084           }
12085
12086           function apply(quad, x1, _, x2) {
12087             if (!quad.value) return true;
12088
12089             var x = quad.x - node.x,
12090                 y = quad.y - node.y,
12091                 w = x2 - x1,
12092                 l = x * x + y * y;
12093
12094             // Apply the Barnes-Hut approximation if possible.
12095             // Limit forces for very close nodes; randomize direction if coincident.
12096             if (w * w / theta2 < l) {
12097               if (l < distanceMax2) {
12098                 if (x === 0) x = jiggle(), l += x * x;
12099                 if (y === 0) y = jiggle(), l += y * y;
12100                 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12101                 node.vx += x * quad.value * alpha / l;
12102                 node.vy += y * quad.value * alpha / l;
12103               }
12104               return true;
12105             }
12106
12107             // Otherwise, process points directly.
12108             else if (quad.length || l >= distanceMax2) return;
12109
12110             // Limit forces for very close nodes; randomize direction if coincident.
12111             if (quad.data !== node || quad.next) {
12112               if (x === 0) x = jiggle(), l += x * x;
12113               if (y === 0) y = jiggle(), l += y * y;
12114               if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12115             }
12116
12117             do if (quad.data !== node) {
12118               w = strengths[quad.data.index] * alpha / l;
12119               node.vx += x * w;
12120               node.vy += y * w;
12121             } while (quad = quad.next);
12122           }
12123
12124           force.initialize = function(_) {
12125             nodes = _;
12126             initialize();
12127           };
12128
12129           force.strength = function(_) {
12130             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12131           };
12132
12133           force.distanceMin = function(_) {
12134             return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
12135           };
12136
12137           force.distanceMax = function(_) {
12138             return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
12139           };
12140
12141           force.theta = function(_) {
12142             return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
12143           };
12144
12145           return force;
12146         }
12147
12148         function radial(radius, x, y) {
12149           var nodes,
12150               strength = constant$7(0.1),
12151               strengths,
12152               radiuses;
12153
12154           if (typeof radius !== "function") radius = constant$7(+radius);
12155           if (x == null) x = 0;
12156           if (y == null) y = 0;
12157
12158           function force(alpha) {
12159             for (var i = 0, n = nodes.length; i < n; ++i) {
12160               var node = nodes[i],
12161                   dx = node.x - x || 1e-6,
12162                   dy = node.y - y || 1e-6,
12163                   r = Math.sqrt(dx * dx + dy * dy),
12164                   k = (radiuses[i] - r) * strengths[i] * alpha / r;
12165               node.vx += dx * k;
12166               node.vy += dy * k;
12167             }
12168           }
12169
12170           function initialize() {
12171             if (!nodes) return;
12172             var i, n = nodes.length;
12173             strengths = new Array(n);
12174             radiuses = new Array(n);
12175             for (i = 0; i < n; ++i) {
12176               radiuses[i] = +radius(nodes[i], i, nodes);
12177               strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
12178             }
12179           }
12180
12181           force.initialize = function(_) {
12182             nodes = _, initialize();
12183           };
12184
12185           force.strength = function(_) {
12186             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12187           };
12188
12189           force.radius = function(_) {
12190             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
12191           };
12192
12193           force.x = function(_) {
12194             return arguments.length ? (x = +_, force) : x;
12195           };
12196
12197           force.y = function(_) {
12198             return arguments.length ? (y = +_, force) : y;
12199           };
12200
12201           return force;
12202         }
12203
12204         function x$2(x) {
12205           var strength = constant$7(0.1),
12206               nodes,
12207               strengths,
12208               xz;
12209
12210           if (typeof x !== "function") x = constant$7(x == null ? 0 : +x);
12211
12212           function force(alpha) {
12213             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12214               node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
12215             }
12216           }
12217
12218           function initialize() {
12219             if (!nodes) return;
12220             var i, n = nodes.length;
12221             strengths = new Array(n);
12222             xz = new Array(n);
12223             for (i = 0; i < n; ++i) {
12224               strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12225             }
12226           }
12227
12228           force.initialize = function(_) {
12229             nodes = _;
12230             initialize();
12231           };
12232
12233           force.strength = function(_) {
12234             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12235           };
12236
12237           force.x = function(_) {
12238             return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x;
12239           };
12240
12241           return force;
12242         }
12243
12244         function y$2(y) {
12245           var strength = constant$7(0.1),
12246               nodes,
12247               strengths,
12248               yz;
12249
12250           if (typeof y !== "function") y = constant$7(y == null ? 0 : +y);
12251
12252           function force(alpha) {
12253             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12254               node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
12255             }
12256           }
12257
12258           function initialize() {
12259             if (!nodes) return;
12260             var i, n = nodes.length;
12261             strengths = new Array(n);
12262             yz = new Array(n);
12263             for (i = 0; i < n; ++i) {
12264               strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12265             }
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.y = function(_) {
12278             return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y;
12279           };
12280
12281           return force;
12282         }
12283
12284         // Computes the decimal coefficient and exponent of the specified number x with
12285         // significant digits p, where x is positive and p is in [1, 21] or undefined.
12286         // For example, formatDecimal(1.23) returns ["123", 0].
12287         function formatDecimal(x, p) {
12288           if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
12289           var i, coefficient = x.slice(0, i);
12290
12291           // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
12292           // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
12293           return [
12294             coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
12295             +x.slice(i + 1)
12296           ];
12297         }
12298
12299         function exponent$1(x) {
12300           return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
12301         }
12302
12303         function formatGroup(grouping, thousands) {
12304           return function(value, width) {
12305             var i = value.length,
12306                 t = [],
12307                 j = 0,
12308                 g = grouping[0],
12309                 length = 0;
12310
12311             while (i > 0 && g > 0) {
12312               if (length + g + 1 > width) g = Math.max(1, width - length);
12313               t.push(value.substring(i -= g, i + g));
12314               if ((length += g + 1) > width) break;
12315               g = grouping[j = (j + 1) % grouping.length];
12316             }
12317
12318             return t.reverse().join(thousands);
12319           };
12320         }
12321
12322         function formatNumerals(numerals) {
12323           return function(value) {
12324             return value.replace(/[0-9]/g, function(i) {
12325               return numerals[+i];
12326             });
12327           };
12328         }
12329
12330         // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
12331         var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
12332
12333         function formatSpecifier(specifier) {
12334           return new FormatSpecifier(specifier);
12335         }
12336
12337         formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
12338
12339         function FormatSpecifier(specifier) {
12340           if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
12341           var match;
12342           this.fill = match[1] || " ";
12343           this.align = match[2] || ">";
12344           this.sign = match[3] || "-";
12345           this.symbol = match[4] || "";
12346           this.zero = !!match[5];
12347           this.width = match[6] && +match[6];
12348           this.comma = !!match[7];
12349           this.precision = match[8] && +match[8].slice(1);
12350           this.trim = !!match[9];
12351           this.type = match[10] || "";
12352         }
12353
12354         FormatSpecifier.prototype.toString = function() {
12355           return this.fill
12356               + this.align
12357               + this.sign
12358               + this.symbol
12359               + (this.zero ? "0" : "")
12360               + (this.width == null ? "" : Math.max(1, this.width | 0))
12361               + (this.comma ? "," : "")
12362               + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
12363               + (this.trim ? "~" : "")
12364               + this.type;
12365         };
12366
12367         // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
12368         function formatTrim(s) {
12369           out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
12370             switch (s[i]) {
12371               case ".": i0 = i1 = i; break;
12372               case "0": if (i0 === 0) i0 = i; i1 = i; break;
12373               default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;
12374             }
12375           }
12376           return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
12377         }
12378
12379         var prefixExponent;
12380
12381         function formatPrefixAuto(x, p) {
12382           var d = formatDecimal(x, p);
12383           if (!d) return x + "";
12384           var coefficient = d[0],
12385               exponent = d[1],
12386               i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
12387               n = coefficient.length;
12388           return i === n ? coefficient
12389               : i > n ? coefficient + new Array(i - n + 1).join("0")
12390               : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
12391               : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
12392         }
12393
12394         function formatRounded(x, p) {
12395           var d = formatDecimal(x, p);
12396           if (!d) return x + "";
12397           var coefficient = d[0],
12398               exponent = d[1];
12399           return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
12400               : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
12401               : coefficient + new Array(exponent - coefficient.length + 2).join("0");
12402         }
12403
12404         var formatTypes = {
12405           "%": function(x, p) { return (x * 100).toFixed(p); },
12406           "b": function(x) { return Math.round(x).toString(2); },
12407           "c": function(x) { return x + ""; },
12408           "d": function(x) { return Math.round(x).toString(10); },
12409           "e": function(x, p) { return x.toExponential(p); },
12410           "f": function(x, p) { return x.toFixed(p); },
12411           "g": function(x, p) { return x.toPrecision(p); },
12412           "o": function(x) { return Math.round(x).toString(8); },
12413           "p": function(x, p) { return formatRounded(x * 100, p); },
12414           "r": formatRounded,
12415           "s": formatPrefixAuto,
12416           "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
12417           "x": function(x) { return Math.round(x).toString(16); }
12418         };
12419
12420         function identity$3(x) {
12421           return x;
12422         }
12423
12424         var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
12425
12426         function formatLocale(locale) {
12427           var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
12428               currency = locale.currency,
12429               decimal = locale.decimal,
12430               numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
12431               percent = locale.percent || "%";
12432
12433           function newFormat(specifier) {
12434             specifier = formatSpecifier(specifier);
12435
12436             var fill = specifier.fill,
12437                 align = specifier.align,
12438                 sign = specifier.sign,
12439                 symbol = specifier.symbol,
12440                 zero = specifier.zero,
12441                 width = specifier.width,
12442                 comma = specifier.comma,
12443                 precision = specifier.precision,
12444                 trim = specifier.trim,
12445                 type = specifier.type;
12446
12447             // The "n" type is an alias for ",g".
12448             if (type === "n") comma = true, type = "g";
12449
12450             // The "" type, and any invalid type, is an alias for ".12~g".
12451             else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = "g";
12452
12453             // If zero fill is specified, padding goes after sign and before digits.
12454             if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
12455
12456             // Compute the prefix and suffix.
12457             // For SI-prefix, the suffix is lazily computed.
12458             var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
12459                 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
12460
12461             // What format function should we use?
12462             // Is this an integer type?
12463             // Can this type generate exponential notation?
12464             var formatType = formatTypes[type],
12465                 maybeSuffix = /[defgprs%]/.test(type);
12466
12467             // Set the default precision if not specified,
12468             // or clamp the specified precision to the supported range.
12469             // For significant precision, it must be in [1, 21].
12470             // For fixed precision, it must be in [0, 20].
12471             precision = precision == null ? 6
12472                 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
12473                 : Math.max(0, Math.min(20, precision));
12474
12475             function format(value) {
12476               var valuePrefix = prefix,
12477                   valueSuffix = suffix,
12478                   i, n, c;
12479
12480               if (type === "c") {
12481                 valueSuffix = formatType(value) + valueSuffix;
12482                 value = "";
12483               } else {
12484                 value = +value;
12485
12486                 // Perform the initial formatting.
12487                 var valueNegative = value < 0;
12488                 value = formatType(Math.abs(value), precision);
12489
12490                 // Trim insignificant zeros.
12491                 if (trim) value = formatTrim(value);
12492
12493                 // If a negative value rounds to zero during formatting, treat as positive.
12494                 if (valueNegative && +value === 0) valueNegative = false;
12495
12496                 // Compute the prefix and suffix.
12497                 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
12498                 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
12499
12500                 // Break the formatted value into the integer “value” part that can be
12501                 // grouped, and fractional or exponential “suffix” part that is not.
12502                 if (maybeSuffix) {
12503                   i = -1, n = value.length;
12504                   while (++i < n) {
12505                     if (c = value.charCodeAt(i), 48 > c || c > 57) {
12506                       valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
12507                       value = value.slice(0, i);
12508                       break;
12509                     }
12510                   }
12511                 }
12512               }
12513
12514               // If the fill character is not "0", grouping is applied before padding.
12515               if (comma && !zero) value = group(value, Infinity);
12516
12517               // Compute the padding.
12518               var length = valuePrefix.length + value.length + valueSuffix.length,
12519                   padding = length < width ? new Array(width - length + 1).join(fill) : "";
12520
12521               // If the fill character is "0", grouping is applied after padding.
12522               if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
12523
12524               // Reconstruct the final output based on the desired alignment.
12525               switch (align) {
12526                 case "<": value = valuePrefix + value + valueSuffix + padding; break;
12527                 case "=": value = valuePrefix + padding + value + valueSuffix; break;
12528                 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
12529                 default: value = padding + valuePrefix + value + valueSuffix; break;
12530               }
12531
12532               return numerals(value);
12533             }
12534
12535             format.toString = function() {
12536               return specifier + "";
12537             };
12538
12539             return format;
12540           }
12541
12542           function formatPrefix(specifier, value) {
12543             var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
12544                 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
12545                 k = Math.pow(10, -e),
12546                 prefix = prefixes[8 + e / 3];
12547             return function(value) {
12548               return f(k * value) + prefix;
12549             };
12550           }
12551
12552           return {
12553             format: newFormat,
12554             formatPrefix: formatPrefix
12555           };
12556         }
12557
12558         var locale;
12559         var format;
12560         var formatPrefix;
12561
12562         defaultLocale({
12563           decimal: ".",
12564           thousands: ",",
12565           grouping: [3],
12566           currency: ["$", ""]
12567         });
12568
12569         function defaultLocale(definition) {
12570           locale = formatLocale(definition);
12571           format = locale.format;
12572           formatPrefix = locale.formatPrefix;
12573           return locale;
12574         }
12575
12576         function precisionFixed(step) {
12577           return Math.max(0, -exponent$1(Math.abs(step)));
12578         }
12579
12580         function precisionPrefix(step, value) {
12581           return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
12582         }
12583
12584         function precisionRound(step, max) {
12585           step = Math.abs(step), max = Math.abs(max) - step;
12586           return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
12587         }
12588
12589         // Adds floating point numbers with twice the normal precision.
12590         // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
12591         // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
12592         // 305–363 (1997).
12593         // Code adapted from GeographicLib by Charles F. F. Karney,
12594         // http://geographiclib.sourceforge.net/
12595
12596         function adder() {
12597           return new Adder;
12598         }
12599
12600         function Adder() {
12601           this.reset();
12602         }
12603
12604         Adder.prototype = {
12605           constructor: Adder,
12606           reset: function() {
12607             this.s = // rounded value
12608             this.t = 0; // exact error
12609           },
12610           add: function(y) {
12611             add$1(temp, y, this.t);
12612             add$1(this, temp.s, this.s);
12613             if (this.s) this.t += temp.t;
12614             else this.s = temp.t;
12615           },
12616           valueOf: function() {
12617             return this.s;
12618           }
12619         };
12620
12621         var temp = new Adder;
12622
12623         function add$1(adder, a, b) {
12624           var x = adder.s = a + b,
12625               bv = x - a,
12626               av = x - bv;
12627           adder.t = (a - av) + (b - bv);
12628         }
12629
12630         var epsilon$2 = 1e-6;
12631         var epsilon2$1 = 1e-12;
12632         var pi$3 = Math.PI;
12633         var halfPi$2 = pi$3 / 2;
12634         var quarterPi = pi$3 / 4;
12635         var tau$3 = pi$3 * 2;
12636
12637         var degrees$1 = 180 / pi$3;
12638         var radians = pi$3 / 180;
12639
12640         var abs$2 = Math.abs;
12641         var atan = Math.atan;
12642         var atan2 = Math.atan2;
12643         var cos$1 = Math.cos;
12644         var ceil = Math.ceil;
12645         var exp = Math.exp;
12646         var log = Math.log;
12647         var pow = Math.pow;
12648         var sin$1 = Math.sin;
12649         var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
12650         var sqrt = Math.sqrt;
12651         var tan = Math.tan;
12652
12653         function acos(x) {
12654           return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
12655         }
12656
12657         function asin(x) {
12658           return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
12659         }
12660
12661         function haversin(x) {
12662           return (x = sin$1(x / 2)) * x;
12663         }
12664
12665         function noop$4() {}
12666
12667         function streamGeometry(geometry, stream) {
12668           if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
12669             streamGeometryType[geometry.type](geometry, stream);
12670           }
12671         }
12672
12673         var streamObjectType = {
12674           Feature: function(object, stream) {
12675             streamGeometry(object.geometry, stream);
12676           },
12677           FeatureCollection: function(object, stream) {
12678             var features = object.features, i = -1, n = features.length;
12679             while (++i < n) streamGeometry(features[i].geometry, stream);
12680           }
12681         };
12682
12683         var streamGeometryType = {
12684           Sphere: function(object, stream) {
12685             stream.sphere();
12686           },
12687           Point: function(object, stream) {
12688             object = object.coordinates;
12689             stream.point(object[0], object[1], object[2]);
12690           },
12691           MultiPoint: function(object, stream) {
12692             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12693             while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
12694           },
12695           LineString: function(object, stream) {
12696             streamLine(object.coordinates, stream, 0);
12697           },
12698           MultiLineString: function(object, stream) {
12699             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12700             while (++i < n) streamLine(coordinates[i], stream, 0);
12701           },
12702           Polygon: function(object, stream) {
12703             streamPolygon(object.coordinates, stream);
12704           },
12705           MultiPolygon: function(object, stream) {
12706             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12707             while (++i < n) streamPolygon(coordinates[i], stream);
12708           },
12709           GeometryCollection: function(object, stream) {
12710             var geometries = object.geometries, i = -1, n = geometries.length;
12711             while (++i < n) streamGeometry(geometries[i], stream);
12712           }
12713         };
12714
12715         function streamLine(coordinates, stream, closed) {
12716           var i = -1, n = coordinates.length - closed, coordinate;
12717           stream.lineStart();
12718           while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
12719           stream.lineEnd();
12720         }
12721
12722         function streamPolygon(coordinates, stream) {
12723           var i = -1, n = coordinates.length;
12724           stream.polygonStart();
12725           while (++i < n) streamLine(coordinates[i], stream, 1);
12726           stream.polygonEnd();
12727         }
12728
12729         function d3_geoStream(object, stream) {
12730           if (object && streamObjectType.hasOwnProperty(object.type)) {
12731             streamObjectType[object.type](object, stream);
12732           } else {
12733             streamGeometry(object, stream);
12734           }
12735         }
12736
12737         var areaRingSum = adder();
12738
12739         var areaSum = adder(),
12740             lambda00,
12741             phi00,
12742             lambda0,
12743             cosPhi0,
12744             sinPhi0;
12745
12746         var areaStream = {
12747           point: noop$4,
12748           lineStart: noop$4,
12749           lineEnd: noop$4,
12750           polygonStart: function() {
12751             areaRingSum.reset();
12752             areaStream.lineStart = areaRingStart;
12753             areaStream.lineEnd = areaRingEnd;
12754           },
12755           polygonEnd: function() {
12756             var areaRing = +areaRingSum;
12757             areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
12758             this.lineStart = this.lineEnd = this.point = noop$4;
12759           },
12760           sphere: function() {
12761             areaSum.add(tau$3);
12762           }
12763         };
12764
12765         function areaRingStart() {
12766           areaStream.point = areaPointFirst;
12767         }
12768
12769         function areaRingEnd() {
12770           areaPoint(lambda00, phi00);
12771         }
12772
12773         function areaPointFirst(lambda, phi) {
12774           areaStream.point = areaPoint;
12775           lambda00 = lambda, phi00 = phi;
12776           lambda *= radians, phi *= radians;
12777           lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
12778         }
12779
12780         function areaPoint(lambda, phi) {
12781           lambda *= radians, phi *= radians;
12782           phi = phi / 2 + quarterPi; // half the angular distance from south pole
12783
12784           // Spherical excess E for a spherical triangle with vertices: south pole,
12785           // previous point, current point.  Uses a formula derived from Cagnoli’s
12786           // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
12787           var dLambda = lambda - lambda0,
12788               sdLambda = dLambda >= 0 ? 1 : -1,
12789               adLambda = sdLambda * dLambda,
12790               cosPhi = cos$1(phi),
12791               sinPhi = sin$1(phi),
12792               k = sinPhi0 * sinPhi,
12793               u = cosPhi0 * cosPhi + k * cos$1(adLambda),
12794               v = k * sdLambda * sin$1(adLambda);
12795           areaRingSum.add(atan2(v, u));
12796
12797           // Advance the previous points.
12798           lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
12799         }
12800
12801         function d3_geoArea(object) {
12802           areaSum.reset();
12803           d3_geoStream(object, areaStream);
12804           return areaSum * 2;
12805         }
12806
12807         function spherical(cartesian) {
12808           return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
12809         }
12810
12811         function cartesian(spherical) {
12812           var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
12813           return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
12814         }
12815
12816         function cartesianDot(a, b) {
12817           return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
12818         }
12819
12820         function cartesianCross(a, b) {
12821           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]];
12822         }
12823
12824         // TODO return a
12825         function cartesianAddInPlace(a, b) {
12826           a[0] += b[0], a[1] += b[1], a[2] += b[2];
12827         }
12828
12829         function cartesianScale(vector, k) {
12830           return [vector[0] * k, vector[1] * k, vector[2] * k];
12831         }
12832
12833         // TODO return d
12834         function cartesianNormalizeInPlace(d) {
12835           var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
12836           d[0] /= l, d[1] /= l, d[2] /= l;
12837         }
12838
12839         var lambda0$1, phi0, lambda1, phi1, // bounds
12840             lambda2, // previous lambda-coordinate
12841             lambda00$1, phi00$1, // first point
12842             p0, // previous 3D point
12843             deltaSum = adder(),
12844             ranges,
12845             range;
12846
12847         var boundsStream = {
12848           point: boundsPoint,
12849           lineStart: boundsLineStart,
12850           lineEnd: boundsLineEnd,
12851           polygonStart: function() {
12852             boundsStream.point = boundsRingPoint;
12853             boundsStream.lineStart = boundsRingStart;
12854             boundsStream.lineEnd = boundsRingEnd;
12855             deltaSum.reset();
12856             areaStream.polygonStart();
12857           },
12858           polygonEnd: function() {
12859             areaStream.polygonEnd();
12860             boundsStream.point = boundsPoint;
12861             boundsStream.lineStart = boundsLineStart;
12862             boundsStream.lineEnd = boundsLineEnd;
12863             if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
12864             else if (deltaSum > epsilon$2) phi1 = 90;
12865             else if (deltaSum < -epsilon$2) phi0 = -90;
12866             range[0] = lambda0$1, range[1] = lambda1;
12867           }
12868         };
12869
12870         function boundsPoint(lambda, phi) {
12871           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12872           if (phi < phi0) phi0 = phi;
12873           if (phi > phi1) phi1 = phi;
12874         }
12875
12876         function linePoint(lambda, phi) {
12877           var p = cartesian([lambda * radians, phi * radians]);
12878           if (p0) {
12879             var normal = cartesianCross(p0, p),
12880                 equatorial = [normal[1], -normal[0], 0],
12881                 inflection = cartesianCross(equatorial, normal);
12882             cartesianNormalizeInPlace(inflection);
12883             inflection = spherical(inflection);
12884             var delta = lambda - lambda2,
12885                 sign = delta > 0 ? 1 : -1,
12886                 lambdai = inflection[0] * degrees$1 * sign,
12887                 phii,
12888                 antimeridian = abs$2(delta) > 180;
12889             if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12890               phii = inflection[1] * degrees$1;
12891               if (phii > phi1) phi1 = phii;
12892             } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12893               phii = -inflection[1] * degrees$1;
12894               if (phii < phi0) phi0 = phii;
12895             } else {
12896               if (phi < phi0) phi0 = phi;
12897               if (phi > phi1) phi1 = phi;
12898             }
12899             if (antimeridian) {
12900               if (lambda < lambda2) {
12901                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12902               } else {
12903                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12904               }
12905             } else {
12906               if (lambda1 >= lambda0$1) {
12907                 if (lambda < lambda0$1) lambda0$1 = lambda;
12908                 if (lambda > lambda1) lambda1 = lambda;
12909               } else {
12910                 if (lambda > lambda2) {
12911                   if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12912                 } else {
12913                   if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12914                 }
12915               }
12916             }
12917           } else {
12918             ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12919           }
12920           if (phi < phi0) phi0 = phi;
12921           if (phi > phi1) phi1 = phi;
12922           p0 = p, lambda2 = lambda;
12923         }
12924
12925         function boundsLineStart() {
12926           boundsStream.point = linePoint;
12927         }
12928
12929         function boundsLineEnd() {
12930           range[0] = lambda0$1, range[1] = lambda1;
12931           boundsStream.point = boundsPoint;
12932           p0 = null;
12933         }
12934
12935         function boundsRingPoint(lambda, phi) {
12936           if (p0) {
12937             var delta = lambda - lambda2;
12938             deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
12939           } else {
12940             lambda00$1 = lambda, phi00$1 = phi;
12941           }
12942           areaStream.point(lambda, phi);
12943           linePoint(lambda, phi);
12944         }
12945
12946         function boundsRingStart() {
12947           areaStream.lineStart();
12948         }
12949
12950         function boundsRingEnd() {
12951           boundsRingPoint(lambda00$1, phi00$1);
12952           areaStream.lineEnd();
12953           if (abs$2(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
12954           range[0] = lambda0$1, range[1] = lambda1;
12955           p0 = null;
12956         }
12957
12958         // Finds the left-right distance between two longitudes.
12959         // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
12960         // the distance between ±180° to be 360°.
12961         function angle(lambda0, lambda1) {
12962           return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
12963         }
12964
12965         function rangeCompare(a, b) {
12966           return a[0] - b[0];
12967         }
12968
12969         function rangeContains(range, x) {
12970           return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
12971         }
12972
12973         function d3_geoBounds(feature) {
12974           var i, n, a, b, merged, deltaMax, delta;
12975
12976           phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
12977           ranges = [];
12978           d3_geoStream(feature, boundsStream);
12979
12980           // First, sort ranges by their minimum longitudes.
12981           if (n = ranges.length) {
12982             ranges.sort(rangeCompare);
12983
12984             // Then, merge any ranges that overlap.
12985             for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
12986               b = ranges[i];
12987               if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
12988                 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
12989                 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
12990               } else {
12991                 merged.push(a = b);
12992               }
12993             }
12994
12995             // Finally, find the largest gap between the merged ranges.
12996             // The final bounding box will be the inverse of this gap.
12997             for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
12998               b = merged[i];
12999               if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
13000             }
13001           }
13002
13003           ranges = range = null;
13004
13005           return lambda0$1 === Infinity || phi0 === Infinity
13006               ? [[NaN, NaN], [NaN, NaN]]
13007               : [[lambda0$1, phi0], [lambda1, phi1]];
13008         }
13009
13010         var W0, W1,
13011             X0, Y0, Z0,
13012             X1, Y1, Z1,
13013             X2, Y2, Z2,
13014             lambda00$2, phi00$2, // first point
13015             x0, y0, z0; // previous point
13016
13017         var centroidStream = {
13018           sphere: noop$4,
13019           point: centroidPoint,
13020           lineStart: centroidLineStart,
13021           lineEnd: centroidLineEnd,
13022           polygonStart: function() {
13023             centroidStream.lineStart = centroidRingStart;
13024             centroidStream.lineEnd = centroidRingEnd;
13025           },
13026           polygonEnd: function() {
13027             centroidStream.lineStart = centroidLineStart;
13028             centroidStream.lineEnd = centroidLineEnd;
13029           }
13030         };
13031
13032         // Arithmetic mean of Cartesian vectors.
13033         function centroidPoint(lambda, phi) {
13034           lambda *= radians, phi *= radians;
13035           var cosPhi = cos$1(phi);
13036           centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
13037         }
13038
13039         function centroidPointCartesian(x, y, z) {
13040           ++W0;
13041           X0 += (x - X0) / W0;
13042           Y0 += (y - Y0) / W0;
13043           Z0 += (z - Z0) / W0;
13044         }
13045
13046         function centroidLineStart() {
13047           centroidStream.point = centroidLinePointFirst;
13048         }
13049
13050         function centroidLinePointFirst(lambda, phi) {
13051           lambda *= radians, phi *= radians;
13052           var cosPhi = cos$1(phi);
13053           x0 = cosPhi * cos$1(lambda);
13054           y0 = cosPhi * sin$1(lambda);
13055           z0 = sin$1(phi);
13056           centroidStream.point = centroidLinePoint;
13057           centroidPointCartesian(x0, y0, z0);
13058         }
13059
13060         function centroidLinePoint(lambda, phi) {
13061           lambda *= radians, phi *= radians;
13062           var cosPhi = cos$1(phi),
13063               x = cosPhi * cos$1(lambda),
13064               y = cosPhi * sin$1(lambda),
13065               z = sin$1(phi),
13066               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);
13067           W1 += w;
13068           X1 += w * (x0 + (x0 = x));
13069           Y1 += w * (y0 + (y0 = y));
13070           Z1 += w * (z0 + (z0 = z));
13071           centroidPointCartesian(x0, y0, z0);
13072         }
13073
13074         function centroidLineEnd() {
13075           centroidStream.point = centroidPoint;
13076         }
13077
13078         // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
13079         // J. Applied Mechanics 42, 239 (1975).
13080         function centroidRingStart() {
13081           centroidStream.point = centroidRingPointFirst;
13082         }
13083
13084         function centroidRingEnd() {
13085           centroidRingPoint(lambda00$2, phi00$2);
13086           centroidStream.point = centroidPoint;
13087         }
13088
13089         function centroidRingPointFirst(lambda, phi) {
13090           lambda00$2 = lambda, phi00$2 = phi;
13091           lambda *= radians, phi *= radians;
13092           centroidStream.point = centroidRingPoint;
13093           var cosPhi = cos$1(phi);
13094           x0 = cosPhi * cos$1(lambda);
13095           y0 = cosPhi * sin$1(lambda);
13096           z0 = sin$1(phi);
13097           centroidPointCartesian(x0, y0, z0);
13098         }
13099
13100         function centroidRingPoint(lambda, phi) {
13101           lambda *= radians, phi *= radians;
13102           var cosPhi = cos$1(phi),
13103               x = cosPhi * cos$1(lambda),
13104               y = cosPhi * sin$1(lambda),
13105               z = sin$1(phi),
13106               cx = y0 * z - z0 * y,
13107               cy = z0 * x - x0 * z,
13108               cz = x0 * y - y0 * x,
13109               m = sqrt(cx * cx + cy * cy + cz * cz),
13110               w = asin(m), // line weight = angle
13111               v = m && -w / m; // area weight multiplier
13112           X2 += v * cx;
13113           Y2 += v * cy;
13114           Z2 += v * cz;
13115           W1 += w;
13116           X1 += w * (x0 + (x0 = x));
13117           Y1 += w * (y0 + (y0 = y));
13118           Z1 += w * (z0 + (z0 = z));
13119           centroidPointCartesian(x0, y0, z0);
13120         }
13121
13122         function d3_geoCentroid(object) {
13123           W0 = W1 =
13124           X0 = Y0 = Z0 =
13125           X1 = Y1 = Z1 =
13126           X2 = Y2 = Z2 = 0;
13127           d3_geoStream(object, centroidStream);
13128
13129           var x = X2,
13130               y = Y2,
13131               z = Z2,
13132               m = x * x + y * y + z * z;
13133
13134           // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
13135           if (m < epsilon2$1) {
13136             x = X1, y = Y1, z = Z1;
13137             // If the feature has zero length, fall back to arithmetic mean of point vectors.
13138             if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
13139             m = x * x + y * y + z * z;
13140             // If the feature still has an undefined ccentroid, then return.
13141             if (m < epsilon2$1) return [NaN, NaN];
13142           }
13143
13144           return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
13145         }
13146
13147         function constant$8(x) {
13148           return function() {
13149             return x;
13150           };
13151         }
13152
13153         function compose(a, b) {
13154
13155           function compose(x, y) {
13156             return x = a(x, y), b(x[0], x[1]);
13157           }
13158
13159           if (a.invert && b.invert) compose.invert = function(x, y) {
13160             return x = b.invert(x, y), x && a.invert(x[0], x[1]);
13161           };
13162
13163           return compose;
13164         }
13165
13166         function rotationIdentity(lambda, phi) {
13167           return [abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi];
13168         }
13169
13170         rotationIdentity.invert = rotationIdentity;
13171
13172         function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
13173           return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
13174             : rotationLambda(deltaLambda))
13175             : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
13176             : rotationIdentity);
13177         }
13178
13179         function forwardRotationLambda(deltaLambda) {
13180           return function(lambda, phi) {
13181             return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
13182           };
13183         }
13184
13185         function rotationLambda(deltaLambda) {
13186           var rotation = forwardRotationLambda(deltaLambda);
13187           rotation.invert = forwardRotationLambda(-deltaLambda);
13188           return rotation;
13189         }
13190
13191         function rotationPhiGamma(deltaPhi, deltaGamma) {
13192           var cosDeltaPhi = cos$1(deltaPhi),
13193               sinDeltaPhi = sin$1(deltaPhi),
13194               cosDeltaGamma = cos$1(deltaGamma),
13195               sinDeltaGamma = sin$1(deltaGamma);
13196
13197           function rotation(lambda, phi) {
13198             var cosPhi = cos$1(phi),
13199                 x = cos$1(lambda) * cosPhi,
13200                 y = sin$1(lambda) * cosPhi,
13201                 z = sin$1(phi),
13202                 k = z * cosDeltaPhi + x * sinDeltaPhi;
13203             return [
13204               atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
13205               asin(k * cosDeltaGamma + y * sinDeltaGamma)
13206             ];
13207           }
13208
13209           rotation.invert = function(lambda, phi) {
13210             var cosPhi = cos$1(phi),
13211                 x = cos$1(lambda) * cosPhi,
13212                 y = sin$1(lambda) * cosPhi,
13213                 z = sin$1(phi),
13214                 k = z * cosDeltaGamma - y * sinDeltaGamma;
13215             return [
13216               atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
13217               asin(k * cosDeltaPhi - x * sinDeltaPhi)
13218             ];
13219           };
13220
13221           return rotation;
13222         }
13223
13224         function rotation(rotate) {
13225           rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
13226
13227           function forward(coordinates) {
13228             coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
13229             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13230           }
13231
13232           forward.invert = function(coordinates) {
13233             coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
13234             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13235           };
13236
13237           return forward;
13238         }
13239
13240         // Generates a circle centered at [0°, 0°], with a given radius and precision.
13241         function circleStream(stream, radius, delta, direction, t0, t1) {
13242           if (!delta) return;
13243           var cosRadius = cos$1(radius),
13244               sinRadius = sin$1(radius),
13245               step = direction * delta;
13246           if (t0 == null) {
13247             t0 = radius + direction * tau$3;
13248             t1 = radius - step / 2;
13249           } else {
13250             t0 = circleRadius(cosRadius, t0);
13251             t1 = circleRadius(cosRadius, t1);
13252             if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
13253           }
13254           for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
13255             point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
13256             stream.point(point[0], point[1]);
13257           }
13258         }
13259
13260         // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
13261         function circleRadius(cosRadius, point) {
13262           point = cartesian(point), point[0] -= cosRadius;
13263           cartesianNormalizeInPlace(point);
13264           var radius = acos(-point[1]);
13265           return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
13266         }
13267
13268         function circle() {
13269           var center = constant$8([0, 0]),
13270               radius = constant$8(90),
13271               precision = constant$8(6),
13272               ring,
13273               rotate,
13274               stream = {point: point};
13275
13276           function point(x, y) {
13277             ring.push(x = rotate(x, y));
13278             x[0] *= degrees$1, x[1] *= degrees$1;
13279           }
13280
13281           function circle() {
13282             var c = center.apply(this, arguments),
13283                 r = radius.apply(this, arguments) * radians,
13284                 p = precision.apply(this, arguments) * radians;
13285             ring = [];
13286             rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
13287             circleStream(stream, r, p, 1);
13288             c = {type: "Polygon", coordinates: [ring]};
13289             ring = rotate = null;
13290             return c;
13291           }
13292
13293           circle.center = function(_) {
13294             return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center;
13295           };
13296
13297           circle.radius = function(_) {
13298             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius;
13299           };
13300
13301           circle.precision = function(_) {
13302             return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision;
13303           };
13304
13305           return circle;
13306         }
13307
13308         function clipBuffer() {
13309           var lines = [],
13310               line;
13311           return {
13312             point: function(x, y) {
13313               line.push([x, y]);
13314             },
13315             lineStart: function() {
13316               lines.push(line = []);
13317             },
13318             lineEnd: noop$4,
13319             rejoin: function() {
13320               if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
13321             },
13322             result: function() {
13323               var result = lines;
13324               lines = [];
13325               line = null;
13326               return result;
13327             }
13328           };
13329         }
13330
13331         function pointEqual(a, b) {
13332           return abs$2(a[0] - b[0]) < epsilon$2 && abs$2(a[1] - b[1]) < epsilon$2;
13333         }
13334
13335         function Intersection(point, points, other, entry) {
13336           this.x = point;
13337           this.z = points;
13338           this.o = other; // another intersection
13339           this.e = entry; // is an entry?
13340           this.v = false; // visited
13341           this.n = this.p = null; // next & previous
13342         }
13343
13344         // A generalized polygon clipping algorithm: given a polygon that has been cut
13345         // into its visible line segments, and rejoins the segments by interpolating
13346         // along the clip edge.
13347         function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
13348           var subject = [],
13349               clip = [],
13350               i,
13351               n;
13352
13353           segments.forEach(function(segment) {
13354             if ((n = segment.length - 1) <= 0) return;
13355             var n, p0 = segment[0], p1 = segment[n], x;
13356
13357             // If the first and last points of a segment are coincident, then treat as a
13358             // closed ring. TODO if all rings are closed, then the winding order of the
13359             // exterior ring should be checked.
13360             if (pointEqual(p0, p1)) {
13361               stream.lineStart();
13362               for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
13363               stream.lineEnd();
13364               return;
13365             }
13366
13367             subject.push(x = new Intersection(p0, segment, null, true));
13368             clip.push(x.o = new Intersection(p0, null, x, false));
13369             subject.push(x = new Intersection(p1, segment, null, false));
13370             clip.push(x.o = new Intersection(p1, null, x, true));
13371           });
13372
13373           if (!subject.length) return;
13374
13375           clip.sort(compareIntersection);
13376           link$1(subject);
13377           link$1(clip);
13378
13379           for (i = 0, n = clip.length; i < n; ++i) {
13380             clip[i].e = startInside = !startInside;
13381           }
13382
13383           var start = subject[0],
13384               points,
13385               point;
13386
13387           while (1) {
13388             // Find first unvisited intersection.
13389             var current = start,
13390                 isSubject = true;
13391             while (current.v) if ((current = current.n) === start) return;
13392             points = current.z;
13393             stream.lineStart();
13394             do {
13395               current.v = current.o.v = true;
13396               if (current.e) {
13397                 if (isSubject) {
13398                   for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
13399                 } else {
13400                   interpolate(current.x, current.n.x, 1, stream);
13401                 }
13402                 current = current.n;
13403               } else {
13404                 if (isSubject) {
13405                   points = current.p.z;
13406                   for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
13407                 } else {
13408                   interpolate(current.x, current.p.x, -1, stream);
13409                 }
13410                 current = current.p;
13411               }
13412               current = current.o;
13413               points = current.z;
13414               isSubject = !isSubject;
13415             } while (!current.v);
13416             stream.lineEnd();
13417           }
13418         }
13419
13420         function link$1(array) {
13421           if (!(n = array.length)) return;
13422           var n,
13423               i = 0,
13424               a = array[0],
13425               b;
13426           while (++i < n) {
13427             a.n = b = array[i];
13428             b.p = a;
13429             a = b;
13430           }
13431           a.n = b = array[0];
13432           b.p = a;
13433         }
13434
13435         var sum$1 = adder();
13436
13437         function polygonContains(polygon, point) {
13438           var lambda = point[0],
13439               phi = point[1],
13440               sinPhi = sin$1(phi),
13441               normal = [sin$1(lambda), -cos$1(lambda), 0],
13442               angle = 0,
13443               winding = 0;
13444
13445           sum$1.reset();
13446
13447           if (sinPhi === 1) phi = halfPi$2 + epsilon$2;
13448           else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2;
13449
13450           for (var i = 0, n = polygon.length; i < n; ++i) {
13451             if (!(m = (ring = polygon[i]).length)) continue;
13452             var ring,
13453                 m,
13454                 point0 = ring[m - 1],
13455                 lambda0 = point0[0],
13456                 phi0 = point0[1] / 2 + quarterPi,
13457                 sinPhi0 = sin$1(phi0),
13458                 cosPhi0 = cos$1(phi0);
13459
13460             for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
13461               var point1 = ring[j],
13462                   lambda1 = point1[0],
13463                   phi1 = point1[1] / 2 + quarterPi,
13464                   sinPhi1 = sin$1(phi1),
13465                   cosPhi1 = cos$1(phi1),
13466                   delta = lambda1 - lambda0,
13467                   sign = delta >= 0 ? 1 : -1,
13468                   absDelta = sign * delta,
13469                   antimeridian = absDelta > pi$3,
13470                   k = sinPhi0 * sinPhi1;
13471
13472               sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
13473               angle += antimeridian ? delta + sign * tau$3 : delta;
13474
13475               // Are the longitudes either side of the point’s meridian (lambda),
13476               // and are the latitudes smaller than the parallel (phi)?
13477               if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
13478                 var arc = cartesianCross(cartesian(point0), cartesian(point1));
13479                 cartesianNormalizeInPlace(arc);
13480                 var intersection = cartesianCross(normal, arc);
13481                 cartesianNormalizeInPlace(intersection);
13482                 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
13483                 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
13484                   winding += antimeridian ^ delta >= 0 ? 1 : -1;
13485                 }
13486               }
13487             }
13488           }
13489
13490           // First, determine whether the South pole is inside or outside:
13491           //
13492           // It is inside if:
13493           // * the polygon winds around it in a clockwise direction.
13494           // * the polygon does not (cumulatively) wind around it, but has a negative
13495           //   (counter-clockwise) area.
13496           //
13497           // Second, count the (signed) number of times a segment crosses a lambda
13498           // from the point to the South pole.  If it is zero, then the point is the
13499           // same side as the South pole.
13500
13501           return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
13502         }
13503
13504         function clip(pointVisible, clipLine, interpolate, start) {
13505           return function(sink) {
13506             var line = clipLine(sink),
13507                 ringBuffer = clipBuffer(),
13508                 ringSink = clipLine(ringBuffer),
13509                 polygonStarted = false,
13510                 polygon,
13511                 segments,
13512                 ring;
13513
13514             var clip = {
13515               point: point,
13516               lineStart: lineStart,
13517               lineEnd: lineEnd,
13518               polygonStart: function() {
13519                 clip.point = pointRing;
13520                 clip.lineStart = ringStart;
13521                 clip.lineEnd = ringEnd;
13522                 segments = [];
13523                 polygon = [];
13524               },
13525               polygonEnd: function() {
13526                 clip.point = point;
13527                 clip.lineStart = lineStart;
13528                 clip.lineEnd = lineEnd;
13529                 segments = merge(segments);
13530                 var startInside = polygonContains(polygon, start);
13531                 if (segments.length) {
13532                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13533                   clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
13534                 } else if (startInside) {
13535                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13536                   sink.lineStart();
13537                   interpolate(null, null, 1, sink);
13538                   sink.lineEnd();
13539                 }
13540                 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
13541                 segments = polygon = null;
13542               },
13543               sphere: function() {
13544                 sink.polygonStart();
13545                 sink.lineStart();
13546                 interpolate(null, null, 1, sink);
13547                 sink.lineEnd();
13548                 sink.polygonEnd();
13549               }
13550             };
13551
13552             function point(lambda, phi) {
13553               if (pointVisible(lambda, phi)) sink.point(lambda, phi);
13554             }
13555
13556             function pointLine(lambda, phi) {
13557               line.point(lambda, phi);
13558             }
13559
13560             function lineStart() {
13561               clip.point = pointLine;
13562               line.lineStart();
13563             }
13564
13565             function lineEnd() {
13566               clip.point = point;
13567               line.lineEnd();
13568             }
13569
13570             function pointRing(lambda, phi) {
13571               ring.push([lambda, phi]);
13572               ringSink.point(lambda, phi);
13573             }
13574
13575             function ringStart() {
13576               ringSink.lineStart();
13577               ring = [];
13578             }
13579
13580             function ringEnd() {
13581               pointRing(ring[0][0], ring[0][1]);
13582               ringSink.lineEnd();
13583
13584               var clean = ringSink.clean(),
13585                   ringSegments = ringBuffer.result(),
13586                   i, n = ringSegments.length, m,
13587                   segment,
13588                   point;
13589
13590               ring.pop();
13591               polygon.push(ring);
13592               ring = null;
13593
13594               if (!n) return;
13595
13596               // No intersections.
13597               if (clean & 1) {
13598                 segment = ringSegments[0];
13599                 if ((m = segment.length - 1) > 0) {
13600                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13601                   sink.lineStart();
13602                   for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
13603                   sink.lineEnd();
13604                 }
13605                 return;
13606               }
13607
13608               // Rejoin connected segments.
13609               // TODO reuse ringBuffer.rejoin()?
13610               if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
13611
13612               segments.push(ringSegments.filter(validSegment));
13613             }
13614
13615             return clip;
13616           };
13617         }
13618
13619         function validSegment(segment) {
13620           return segment.length > 1;
13621         }
13622
13623         // Intersections are sorted along the clip edge. For both antimeridian cutting
13624         // and circle clipping, the same comparison is used.
13625         function compareIntersection(a, b) {
13626           return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
13627                - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
13628         }
13629
13630         var clipAntimeridian = clip(
13631           function() { return true; },
13632           clipAntimeridianLine,
13633           clipAntimeridianInterpolate,
13634           [-pi$3, -halfPi$2]
13635         );
13636
13637         // Takes a line and cuts into visible segments. Return values: 0 - there were
13638         // intersections or the line was empty; 1 - no intersections; 2 - there were
13639         // intersections, and the first and last segments should be rejoined.
13640         function clipAntimeridianLine(stream) {
13641           var lambda0 = NaN,
13642               phi0 = NaN,
13643               sign0 = NaN,
13644               clean; // no intersections
13645
13646           return {
13647             lineStart: function() {
13648               stream.lineStart();
13649               clean = 1;
13650             },
13651             point: function(lambda1, phi1) {
13652               var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
13653                   delta = abs$2(lambda1 - lambda0);
13654               if (abs$2(delta - pi$3) < epsilon$2) { // line crosses a pole
13655                 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
13656                 stream.point(sign0, phi0);
13657                 stream.lineEnd();
13658                 stream.lineStart();
13659                 stream.point(sign1, phi0);
13660                 stream.point(lambda1, phi0);
13661                 clean = 0;
13662               } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
13663                 if (abs$2(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
13664                 if (abs$2(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
13665                 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
13666                 stream.point(sign0, phi0);
13667                 stream.lineEnd();
13668                 stream.lineStart();
13669                 stream.point(sign1, phi0);
13670                 clean = 0;
13671               }
13672               stream.point(lambda0 = lambda1, phi0 = phi1);
13673               sign0 = sign1;
13674             },
13675             lineEnd: function() {
13676               stream.lineEnd();
13677               lambda0 = phi0 = NaN;
13678             },
13679             clean: function() {
13680               return 2 - clean; // if intersections, rejoin first and last segments
13681             }
13682           };
13683         }
13684
13685         function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
13686           var cosPhi0,
13687               cosPhi1,
13688               sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
13689           return abs$2(sinLambda0Lambda1) > epsilon$2
13690               ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
13691                   - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
13692                   / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
13693               : (phi0 + phi1) / 2;
13694         }
13695
13696         function clipAntimeridianInterpolate(from, to, direction, stream) {
13697           var phi;
13698           if (from == null) {
13699             phi = direction * halfPi$2;
13700             stream.point(-pi$3, phi);
13701             stream.point(0, phi);
13702             stream.point(pi$3, phi);
13703             stream.point(pi$3, 0);
13704             stream.point(pi$3, -phi);
13705             stream.point(0, -phi);
13706             stream.point(-pi$3, -phi);
13707             stream.point(-pi$3, 0);
13708             stream.point(-pi$3, phi);
13709           } else if (abs$2(from[0] - to[0]) > epsilon$2) {
13710             var lambda = from[0] < to[0] ? pi$3 : -pi$3;
13711             phi = direction * lambda / 2;
13712             stream.point(-lambda, phi);
13713             stream.point(0, phi);
13714             stream.point(lambda, phi);
13715           } else {
13716             stream.point(to[0], to[1]);
13717           }
13718         }
13719
13720         function clipCircle(radius) {
13721           var cr = cos$1(radius),
13722               delta = 6 * radians,
13723               smallRadius = cr > 0,
13724               notHemisphere = abs$2(cr) > epsilon$2; // TODO optimise for this common case
13725
13726           function interpolate(from, to, direction, stream) {
13727             circleStream(stream, radius, delta, direction, from, to);
13728           }
13729
13730           function visible(lambda, phi) {
13731             return cos$1(lambda) * cos$1(phi) > cr;
13732           }
13733
13734           // Takes a line and cuts into visible segments. Return values used for polygon
13735           // clipping: 0 - there were intersections or the line was empty; 1 - no
13736           // intersections 2 - there were intersections, and the first and last segments
13737           // should be rejoined.
13738           function clipLine(stream) {
13739             var point0, // previous point
13740                 c0, // code for previous point
13741                 v0, // visibility of previous point
13742                 v00, // visibility of first point
13743                 clean; // no intersections
13744             return {
13745               lineStart: function() {
13746                 v00 = v0 = false;
13747                 clean = 1;
13748               },
13749               point: function(lambda, phi) {
13750                 var point1 = [lambda, phi],
13751                     point2,
13752                     v = visible(lambda, phi),
13753                     c = smallRadius
13754                       ? v ? 0 : code(lambda, phi)
13755                       : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
13756                 if (!point0 && (v00 = v0 = v)) stream.lineStart();
13757                 // Handle degeneracies.
13758                 // TODO ignore if not clipping polygons.
13759                 if (v !== v0) {
13760                   point2 = intersect(point0, point1);
13761                   if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
13762                     point1[0] += epsilon$2;
13763                     point1[1] += epsilon$2;
13764                     v = visible(point1[0], point1[1]);
13765                   }
13766                 }
13767                 if (v !== v0) {
13768                   clean = 0;
13769                   if (v) {
13770                     // outside going in
13771                     stream.lineStart();
13772                     point2 = intersect(point1, point0);
13773                     stream.point(point2[0], point2[1]);
13774                   } else {
13775                     // inside going out
13776                     point2 = intersect(point0, point1);
13777                     stream.point(point2[0], point2[1]);
13778                     stream.lineEnd();
13779                   }
13780                   point0 = point2;
13781                 } else if (notHemisphere && point0 && smallRadius ^ v) {
13782                   var t;
13783                   // If the codes for two points are different, or are both zero,
13784                   // and there this segment intersects with the small circle.
13785                   if (!(c & c0) && (t = intersect(point1, point0, true))) {
13786                     clean = 0;
13787                     if (smallRadius) {
13788                       stream.lineStart();
13789                       stream.point(t[0][0], t[0][1]);
13790                       stream.point(t[1][0], t[1][1]);
13791                       stream.lineEnd();
13792                     } else {
13793                       stream.point(t[1][0], t[1][1]);
13794                       stream.lineEnd();
13795                       stream.lineStart();
13796                       stream.point(t[0][0], t[0][1]);
13797                     }
13798                   }
13799                 }
13800                 if (v && (!point0 || !pointEqual(point0, point1))) {
13801                   stream.point(point1[0], point1[1]);
13802                 }
13803                 point0 = point1, v0 = v, c0 = c;
13804               },
13805               lineEnd: function() {
13806                 if (v0) stream.lineEnd();
13807                 point0 = null;
13808               },
13809               // Rejoin first and last segments if there were intersections and the first
13810               // and last points were visible.
13811               clean: function() {
13812                 return clean | ((v00 && v0) << 1);
13813               }
13814             };
13815           }
13816
13817           // Intersects the great circle between a and b with the clip circle.
13818           function intersect(a, b, two) {
13819             var pa = cartesian(a),
13820                 pb = cartesian(b);
13821
13822             // We have two planes, n1.p = d1 and n2.p = d2.
13823             // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
13824             var n1 = [1, 0, 0], // normal
13825                 n2 = cartesianCross(pa, pb),
13826                 n2n2 = cartesianDot(n2, n2),
13827                 n1n2 = n2[0], // cartesianDot(n1, n2),
13828                 determinant = n2n2 - n1n2 * n1n2;
13829
13830             // Two polar points.
13831             if (!determinant) return !two && a;
13832
13833             var c1 =  cr * n2n2 / determinant,
13834                 c2 = -cr * n1n2 / determinant,
13835                 n1xn2 = cartesianCross(n1, n2),
13836                 A = cartesianScale(n1, c1),
13837                 B = cartesianScale(n2, c2);
13838             cartesianAddInPlace(A, B);
13839
13840             // Solve |p(t)|^2 = 1.
13841             var u = n1xn2,
13842                 w = cartesianDot(A, u),
13843                 uu = cartesianDot(u, u),
13844                 t2 = w * w - uu * (cartesianDot(A, A) - 1);
13845
13846             if (t2 < 0) return;
13847
13848             var t = sqrt(t2),
13849                 q = cartesianScale(u, (-w - t) / uu);
13850             cartesianAddInPlace(q, A);
13851             q = spherical(q);
13852
13853             if (!two) return q;
13854
13855             // Two intersection points.
13856             var lambda0 = a[0],
13857                 lambda1 = b[0],
13858                 phi0 = a[1],
13859                 phi1 = b[1],
13860                 z;
13861
13862             if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
13863
13864             var delta = lambda1 - lambda0,
13865                 polar = abs$2(delta - pi$3) < epsilon$2,
13866                 meridian = polar || delta < epsilon$2;
13867
13868             if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
13869
13870             // Check that the first point is between a and b.
13871             if (meridian
13872                 ? polar
13873                   ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
13874                   : phi0 <= q[1] && q[1] <= phi1
13875                 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
13876               var q1 = cartesianScale(u, (-w + t) / uu);
13877               cartesianAddInPlace(q1, A);
13878               return [q, spherical(q1)];
13879             }
13880           }
13881
13882           // Generates a 4-bit vector representing the location of a point relative to
13883           // the small circle's bounding box.
13884           function code(lambda, phi) {
13885             var r = smallRadius ? radius : pi$3 - radius,
13886                 code = 0;
13887             if (lambda < -r) code |= 1; // left
13888             else if (lambda > r) code |= 2; // right
13889             if (phi < -r) code |= 4; // below
13890             else if (phi > r) code |= 8; // above
13891             return code;
13892           }
13893
13894           return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
13895         }
13896
13897         function clipLine(a, b, x0, y0, x1, y1) {
13898           var ax = a[0],
13899               ay = a[1],
13900               bx = b[0],
13901               by = b[1],
13902               t0 = 0,
13903               t1 = 1,
13904               dx = bx - ax,
13905               dy = by - ay,
13906               r;
13907
13908           r = x0 - ax;
13909           if (!dx && r > 0) return;
13910           r /= dx;
13911           if (dx < 0) {
13912             if (r < t0) return;
13913             if (r < t1) t1 = r;
13914           } else if (dx > 0) {
13915             if (r > t1) return;
13916             if (r > t0) t0 = r;
13917           }
13918
13919           r = x1 - ax;
13920           if (!dx && r < 0) return;
13921           r /= dx;
13922           if (dx < 0) {
13923             if (r > t1) return;
13924             if (r > t0) t0 = r;
13925           } else if (dx > 0) {
13926             if (r < t0) return;
13927             if (r < t1) t1 = r;
13928           }
13929
13930           r = y0 - ay;
13931           if (!dy && r > 0) return;
13932           r /= dy;
13933           if (dy < 0) {
13934             if (r < t0) return;
13935             if (r < t1) t1 = r;
13936           } else if (dy > 0) {
13937             if (r > t1) return;
13938             if (r > t0) t0 = r;
13939           }
13940
13941           r = y1 - ay;
13942           if (!dy && r < 0) return;
13943           r /= dy;
13944           if (dy < 0) {
13945             if (r > t1) return;
13946             if (r > t0) t0 = r;
13947           } else if (dy > 0) {
13948             if (r < t0) return;
13949             if (r < t1) t1 = r;
13950           }
13951
13952           if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
13953           if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
13954           return true;
13955         }
13956
13957         var clipMax = 1e9, clipMin = -clipMax;
13958
13959         // TODO Use d3-polygon’s polygonContains here for the ring check?
13960         // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
13961
13962         function clipRectangle(x0, y0, x1, y1) {
13963
13964           function visible(x, y) {
13965             return x0 <= x && x <= x1 && y0 <= y && y <= y1;
13966           }
13967
13968           function interpolate(from, to, direction, stream) {
13969             var a = 0, a1 = 0;
13970             if (from == null
13971                 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
13972                 || comparePoint(from, to) < 0 ^ direction > 0) {
13973               do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
13974               while ((a = (a + direction + 4) % 4) !== a1);
13975             } else {
13976               stream.point(to[0], to[1]);
13977             }
13978           }
13979
13980           function corner(p, direction) {
13981             return abs$2(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
13982                 : abs$2(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
13983                 : abs$2(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
13984                 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
13985           }
13986
13987           function compareIntersection(a, b) {
13988             return comparePoint(a.x, b.x);
13989           }
13990
13991           function comparePoint(a, b) {
13992             var ca = corner(a, 1),
13993                 cb = corner(b, 1);
13994             return ca !== cb ? ca - cb
13995                 : ca === 0 ? b[1] - a[1]
13996                 : ca === 1 ? a[0] - b[0]
13997                 : ca === 2 ? a[1] - b[1]
13998                 : b[0] - a[0];
13999           }
14000
14001           return function(stream) {
14002             var activeStream = stream,
14003                 bufferStream = clipBuffer(),
14004                 segments,
14005                 polygon,
14006                 ring,
14007                 x__, y__, v__, // first point
14008                 x_, y_, v_, // previous point
14009                 first,
14010                 clean;
14011
14012             var clipStream = {
14013               point: point,
14014               lineStart: lineStart,
14015               lineEnd: lineEnd,
14016               polygonStart: polygonStart,
14017               polygonEnd: polygonEnd
14018             };
14019
14020             function point(x, y) {
14021               if (visible(x, y)) activeStream.point(x, y);
14022             }
14023
14024             function polygonInside() {
14025               var winding = 0;
14026
14027               for (var i = 0, n = polygon.length; i < n; ++i) {
14028                 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
14029                   a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
14030                   if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
14031                   else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
14032                 }
14033               }
14034
14035               return winding;
14036             }
14037
14038             // Buffer geometry within a polygon and then clip it en masse.
14039             function polygonStart() {
14040               activeStream = bufferStream, segments = [], polygon = [], clean = true;
14041             }
14042
14043             function polygonEnd() {
14044               var startInside = polygonInside(),
14045                   cleanInside = clean && startInside,
14046                   visible = (segments = merge(segments)).length;
14047               if (cleanInside || visible) {
14048                 stream.polygonStart();
14049                 if (cleanInside) {
14050                   stream.lineStart();
14051                   interpolate(null, null, 1, stream);
14052                   stream.lineEnd();
14053                 }
14054                 if (visible) {
14055                   clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
14056                 }
14057                 stream.polygonEnd();
14058               }
14059               activeStream = stream, segments = polygon = ring = null;
14060             }
14061
14062             function lineStart() {
14063               clipStream.point = linePoint;
14064               if (polygon) polygon.push(ring = []);
14065               first = true;
14066               v_ = false;
14067               x_ = y_ = NaN;
14068             }
14069
14070             // TODO rather than special-case polygons, simply handle them separately.
14071             // Ideally, coincident intersection points should be jittered to avoid
14072             // clipping issues.
14073             function lineEnd() {
14074               if (segments) {
14075                 linePoint(x__, y__);
14076                 if (v__ && v_) bufferStream.rejoin();
14077                 segments.push(bufferStream.result());
14078               }
14079               clipStream.point = point;
14080               if (v_) activeStream.lineEnd();
14081             }
14082
14083             function linePoint(x, y) {
14084               var v = visible(x, y);
14085               if (polygon) ring.push([x, y]);
14086               if (first) {
14087                 x__ = x, y__ = y, v__ = v;
14088                 first = false;
14089                 if (v) {
14090                   activeStream.lineStart();
14091                   activeStream.point(x, y);
14092                 }
14093               } else {
14094                 if (v && v_) activeStream.point(x, y);
14095                 else {
14096                   var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
14097                       b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
14098                   if (clipLine(a, b, x0, y0, x1, y1)) {
14099                     if (!v_) {
14100                       activeStream.lineStart();
14101                       activeStream.point(a[0], a[1]);
14102                     }
14103                     activeStream.point(b[0], b[1]);
14104                     if (!v) activeStream.lineEnd();
14105                     clean = false;
14106                   } else if (v) {
14107                     activeStream.lineStart();
14108                     activeStream.point(x, y);
14109                     clean = false;
14110                   }
14111                 }
14112               }
14113               x_ = x, y_ = y, v_ = v;
14114             }
14115
14116             return clipStream;
14117           };
14118         }
14119
14120         function extent$1() {
14121           var x0 = 0,
14122               y0 = 0,
14123               x1 = 960,
14124               y1 = 500,
14125               cache,
14126               cacheStream,
14127               clip;
14128
14129           return clip = {
14130             stream: function(stream) {
14131               return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
14132             },
14133             extent: function(_) {
14134               return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
14135             }
14136           };
14137         }
14138
14139         var lengthSum = adder(),
14140             lambda0$2,
14141             sinPhi0$1,
14142             cosPhi0$1;
14143
14144         var lengthStream = {
14145           sphere: noop$4,
14146           point: noop$4,
14147           lineStart: lengthLineStart,
14148           lineEnd: noop$4,
14149           polygonStart: noop$4,
14150           polygonEnd: noop$4
14151         };
14152
14153         function lengthLineStart() {
14154           lengthStream.point = lengthPointFirst;
14155           lengthStream.lineEnd = lengthLineEnd;
14156         }
14157
14158         function lengthLineEnd() {
14159           lengthStream.point = lengthStream.lineEnd = noop$4;
14160         }
14161
14162         function lengthPointFirst(lambda, phi) {
14163           lambda *= radians, phi *= radians;
14164           lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
14165           lengthStream.point = lengthPoint;
14166         }
14167
14168         function lengthPoint(lambda, phi) {
14169           lambda *= radians, phi *= radians;
14170           var sinPhi = sin$1(phi),
14171               cosPhi = cos$1(phi),
14172               delta = abs$2(lambda - lambda0$2),
14173               cosDelta = cos$1(delta),
14174               sinDelta = sin$1(delta),
14175               x = cosPhi * sinDelta,
14176               y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
14177               z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
14178           lengthSum.add(atan2(sqrt(x * x + y * y), z));
14179           lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
14180         }
14181
14182         function d3_geoLength(object) {
14183           lengthSum.reset();
14184           d3_geoStream(object, lengthStream);
14185           return +lengthSum;
14186         }
14187
14188         var coordinates = [null, null],
14189             object$1 = {type: "LineString", coordinates: coordinates};
14190
14191         function distance(a, b) {
14192           coordinates[0] = a;
14193           coordinates[1] = b;
14194           return d3_geoLength(object$1);
14195         }
14196
14197         var containsObjectType = {
14198           Feature: function(object, point) {
14199             return containsGeometry(object.geometry, point);
14200           },
14201           FeatureCollection: function(object, point) {
14202             var features = object.features, i = -1, n = features.length;
14203             while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
14204             return false;
14205           }
14206         };
14207
14208         var containsGeometryType = {
14209           Sphere: function() {
14210             return true;
14211           },
14212           Point: function(object, point) {
14213             return containsPoint(object.coordinates, point);
14214           },
14215           MultiPoint: function(object, point) {
14216             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14217             while (++i < n) if (containsPoint(coordinates[i], point)) return true;
14218             return false;
14219           },
14220           LineString: function(object, point) {
14221             return containsLine(object.coordinates, point);
14222           },
14223           MultiLineString: function(object, point) {
14224             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14225             while (++i < n) if (containsLine(coordinates[i], point)) return true;
14226             return false;
14227           },
14228           Polygon: function(object, point) {
14229             return containsPolygon(object.coordinates, point);
14230           },
14231           MultiPolygon: function(object, point) {
14232             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14233             while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
14234             return false;
14235           },
14236           GeometryCollection: function(object, point) {
14237             var geometries = object.geometries, i = -1, n = geometries.length;
14238             while (++i < n) if (containsGeometry(geometries[i], point)) return true;
14239             return false;
14240           }
14241         };
14242
14243         function containsGeometry(geometry, point) {
14244           return geometry && containsGeometryType.hasOwnProperty(geometry.type)
14245               ? containsGeometryType[geometry.type](geometry, point)
14246               : false;
14247         }
14248
14249         function containsPoint(coordinates, point) {
14250           return distance(coordinates, point) === 0;
14251         }
14252
14253         function containsLine(coordinates, point) {
14254           var ab = distance(coordinates[0], coordinates[1]),
14255               ao = distance(coordinates[0], point),
14256               ob = distance(point, coordinates[1]);
14257           return ao + ob <= ab + epsilon$2;
14258         }
14259
14260         function containsPolygon(coordinates, point) {
14261           return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
14262         }
14263
14264         function ringRadians(ring) {
14265           return ring = ring.map(pointRadians), ring.pop(), ring;
14266         }
14267
14268         function pointRadians(point) {
14269           return [point[0] * radians, point[1] * radians];
14270         }
14271
14272         function contains$2(object, point) {
14273           return (object && containsObjectType.hasOwnProperty(object.type)
14274               ? containsObjectType[object.type]
14275               : containsGeometry)(object, point);
14276         }
14277
14278         function graticuleX(y0, y1, dy) {
14279           var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
14280           return function(x) { return y.map(function(y) { return [x, y]; }); };
14281         }
14282
14283         function graticuleY(x0, x1, dx) {
14284           var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
14285           return function(y) { return x.map(function(x) { return [x, y]; }); };
14286         }
14287
14288         function graticule() {
14289           var x1, x0, X1, X0,
14290               y1, y0, Y1, Y0,
14291               dx = 10, dy = dx, DX = 90, DY = 360,
14292               x, y, X, Y,
14293               precision = 2.5;
14294
14295           function graticule() {
14296             return {type: "MultiLineString", coordinates: lines()};
14297           }
14298
14299           function lines() {
14300             return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
14301                 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
14302                 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$2(x % DX) > epsilon$2; }).map(x))
14303                 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$2(y % DY) > epsilon$2; }).map(y));
14304           }
14305
14306           graticule.lines = function() {
14307             return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
14308           };
14309
14310           graticule.outline = function() {
14311             return {
14312               type: "Polygon",
14313               coordinates: [
14314                 X(X0).concat(
14315                 Y(Y1).slice(1),
14316                 X(X1).reverse().slice(1),
14317                 Y(Y0).reverse().slice(1))
14318               ]
14319             };
14320           };
14321
14322           graticule.extent = function(_) {
14323             if (!arguments.length) return graticule.extentMinor();
14324             return graticule.extentMajor(_).extentMinor(_);
14325           };
14326
14327           graticule.extentMajor = function(_) {
14328             if (!arguments.length) return [[X0, Y0], [X1, Y1]];
14329             X0 = +_[0][0], X1 = +_[1][0];
14330             Y0 = +_[0][1], Y1 = +_[1][1];
14331             if (X0 > X1) _ = X0, X0 = X1, X1 = _;
14332             if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
14333             return graticule.precision(precision);
14334           };
14335
14336           graticule.extentMinor = function(_) {
14337             if (!arguments.length) return [[x0, y0], [x1, y1]];
14338             x0 = +_[0][0], x1 = +_[1][0];
14339             y0 = +_[0][1], y1 = +_[1][1];
14340             if (x0 > x1) _ = x0, x0 = x1, x1 = _;
14341             if (y0 > y1) _ = y0, y0 = y1, y1 = _;
14342             return graticule.precision(precision);
14343           };
14344
14345           graticule.step = function(_) {
14346             if (!arguments.length) return graticule.stepMinor();
14347             return graticule.stepMajor(_).stepMinor(_);
14348           };
14349
14350           graticule.stepMajor = function(_) {
14351             if (!arguments.length) return [DX, DY];
14352             DX = +_[0], DY = +_[1];
14353             return graticule;
14354           };
14355
14356           graticule.stepMinor = function(_) {
14357             if (!arguments.length) return [dx, dy];
14358             dx = +_[0], dy = +_[1];
14359             return graticule;
14360           };
14361
14362           graticule.precision = function(_) {
14363             if (!arguments.length) return precision;
14364             precision = +_;
14365             x = graticuleX(y0, y1, 90);
14366             y = graticuleY(x0, x1, precision);
14367             X = graticuleX(Y0, Y1, 90);
14368             Y = graticuleY(X0, X1, precision);
14369             return graticule;
14370           };
14371
14372           return graticule
14373               .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
14374               .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
14375         }
14376
14377         function graticule10() {
14378           return graticule()();
14379         }
14380
14381         function interpolate$1(a, b) {
14382           var x0 = a[0] * radians,
14383               y0 = a[1] * radians,
14384               x1 = b[0] * radians,
14385               y1 = b[1] * radians,
14386               cy0 = cos$1(y0),
14387               sy0 = sin$1(y0),
14388               cy1 = cos$1(y1),
14389               sy1 = sin$1(y1),
14390               kx0 = cy0 * cos$1(x0),
14391               ky0 = cy0 * sin$1(x0),
14392               kx1 = cy1 * cos$1(x1),
14393               ky1 = cy1 * sin$1(x1),
14394               d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
14395               k = sin$1(d);
14396
14397           var interpolate = d ? function(t) {
14398             var B = sin$1(t *= d) / k,
14399                 A = sin$1(d - t) / k,
14400                 x = A * kx0 + B * kx1,
14401                 y = A * ky0 + B * ky1,
14402                 z = A * sy0 + B * sy1;
14403             return [
14404               atan2(y, x) * degrees$1,
14405               atan2(z, sqrt(x * x + y * y)) * degrees$1
14406             ];
14407           } : function() {
14408             return [x0 * degrees$1, y0 * degrees$1];
14409           };
14410
14411           interpolate.distance = d;
14412
14413           return interpolate;
14414         }
14415
14416         function identity$4(x) {
14417           return x;
14418         }
14419
14420         var areaSum$1 = adder(),
14421             areaRingSum$1 = adder(),
14422             x00,
14423             y00,
14424             x0$1,
14425             y0$1;
14426
14427         var areaStream$1 = {
14428           point: noop$4,
14429           lineStart: noop$4,
14430           lineEnd: noop$4,
14431           polygonStart: function() {
14432             areaStream$1.lineStart = areaRingStart$1;
14433             areaStream$1.lineEnd = areaRingEnd$1;
14434           },
14435           polygonEnd: function() {
14436             areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$4;
14437             areaSum$1.add(abs$2(areaRingSum$1));
14438             areaRingSum$1.reset();
14439           },
14440           result: function() {
14441             var area = areaSum$1 / 2;
14442             areaSum$1.reset();
14443             return area;
14444           }
14445         };
14446
14447         function areaRingStart$1() {
14448           areaStream$1.point = areaPointFirst$1;
14449         }
14450
14451         function areaPointFirst$1(x, y) {
14452           areaStream$1.point = areaPoint$1;
14453           x00 = x0$1 = x, y00 = y0$1 = y;
14454         }
14455
14456         function areaPoint$1(x, y) {
14457           areaRingSum$1.add(y0$1 * x - x0$1 * y);
14458           x0$1 = x, y0$1 = y;
14459         }
14460
14461         function areaRingEnd$1() {
14462           areaPoint$1(x00, y00);
14463         }
14464
14465         var x0$2 = Infinity,
14466             y0$2 = x0$2,
14467             x1 = -x0$2,
14468             y1 = x1;
14469
14470         var boundsStream$1 = {
14471           point: boundsPoint$1,
14472           lineStart: noop$4,
14473           lineEnd: noop$4,
14474           polygonStart: noop$4,
14475           polygonEnd: noop$4,
14476           result: function() {
14477             var bounds = [[x0$2, y0$2], [x1, y1]];
14478             x1 = y1 = -(y0$2 = x0$2 = Infinity);
14479             return bounds;
14480           }
14481         };
14482
14483         function boundsPoint$1(x, y) {
14484           if (x < x0$2) x0$2 = x;
14485           if (x > x1) x1 = x;
14486           if (y < y0$2) y0$2 = y;
14487           if (y > y1) y1 = y;
14488         }
14489
14490         // TODO Enforce positive area for exterior, negative area for interior?
14491
14492         var X0$1 = 0,
14493             Y0$1 = 0,
14494             Z0$1 = 0,
14495             X1$1 = 0,
14496             Y1$1 = 0,
14497             Z1$1 = 0,
14498             X2$1 = 0,
14499             Y2$1 = 0,
14500             Z2$1 = 0,
14501             x00$1,
14502             y00$1,
14503             x0$3,
14504             y0$3;
14505
14506         var centroidStream$1 = {
14507           point: centroidPoint$1,
14508           lineStart: centroidLineStart$1,
14509           lineEnd: centroidLineEnd$1,
14510           polygonStart: function() {
14511             centroidStream$1.lineStart = centroidRingStart$1;
14512             centroidStream$1.lineEnd = centroidRingEnd$1;
14513           },
14514           polygonEnd: function() {
14515             centroidStream$1.point = centroidPoint$1;
14516             centroidStream$1.lineStart = centroidLineStart$1;
14517             centroidStream$1.lineEnd = centroidLineEnd$1;
14518           },
14519           result: function() {
14520             var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
14521                 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
14522                 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
14523                 : [NaN, NaN];
14524             X0$1 = Y0$1 = Z0$1 =
14525             X1$1 = Y1$1 = Z1$1 =
14526             X2$1 = Y2$1 = Z2$1 = 0;
14527             return centroid;
14528           }
14529         };
14530
14531         function centroidPoint$1(x, y) {
14532           X0$1 += x;
14533           Y0$1 += y;
14534           ++Z0$1;
14535         }
14536
14537         function centroidLineStart$1() {
14538           centroidStream$1.point = centroidPointFirstLine;
14539         }
14540
14541         function centroidPointFirstLine(x, y) {
14542           centroidStream$1.point = centroidPointLine;
14543           centroidPoint$1(x0$3 = x, y0$3 = y);
14544         }
14545
14546         function centroidPointLine(x, y) {
14547           var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
14548           X1$1 += z * (x0$3 + x) / 2;
14549           Y1$1 += z * (y0$3 + y) / 2;
14550           Z1$1 += z;
14551           centroidPoint$1(x0$3 = x, y0$3 = y);
14552         }
14553
14554         function centroidLineEnd$1() {
14555           centroidStream$1.point = centroidPoint$1;
14556         }
14557
14558         function centroidRingStart$1() {
14559           centroidStream$1.point = centroidPointFirstRing;
14560         }
14561
14562         function centroidRingEnd$1() {
14563           centroidPointRing(x00$1, y00$1);
14564         }
14565
14566         function centroidPointFirstRing(x, y) {
14567           centroidStream$1.point = centroidPointRing;
14568           centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
14569         }
14570
14571         function centroidPointRing(x, y) {
14572           var dx = x - x0$3,
14573               dy = y - y0$3,
14574               z = sqrt(dx * dx + dy * dy);
14575
14576           X1$1 += z * (x0$3 + x) / 2;
14577           Y1$1 += z * (y0$3 + y) / 2;
14578           Z1$1 += z;
14579
14580           z = y0$3 * x - x0$3 * y;
14581           X2$1 += z * (x0$3 + x);
14582           Y2$1 += z * (y0$3 + y);
14583           Z2$1 += z * 3;
14584           centroidPoint$1(x0$3 = x, y0$3 = y);
14585         }
14586
14587         function PathContext(context) {
14588           this._context = context;
14589         }
14590
14591         PathContext.prototype = {
14592           _radius: 4.5,
14593           pointRadius: function(_) {
14594             return this._radius = _, this;
14595           },
14596           polygonStart: function() {
14597             this._line = 0;
14598           },
14599           polygonEnd: function() {
14600             this._line = NaN;
14601           },
14602           lineStart: function() {
14603             this._point = 0;
14604           },
14605           lineEnd: function() {
14606             if (this._line === 0) this._context.closePath();
14607             this._point = NaN;
14608           },
14609           point: function(x, y) {
14610             switch (this._point) {
14611               case 0: {
14612                 this._context.moveTo(x, y);
14613                 this._point = 1;
14614                 break;
14615               }
14616               case 1: {
14617                 this._context.lineTo(x, y);
14618                 break;
14619               }
14620               default: {
14621                 this._context.moveTo(x + this._radius, y);
14622                 this._context.arc(x, y, this._radius, 0, tau$3);
14623                 break;
14624               }
14625             }
14626           },
14627           result: noop$4
14628         };
14629
14630         var lengthSum$1 = adder(),
14631             lengthRing,
14632             x00$2,
14633             y00$2,
14634             x0$4,
14635             y0$4;
14636
14637         var lengthStream$1 = {
14638           point: noop$4,
14639           lineStart: function() {
14640             lengthStream$1.point = lengthPointFirst$1;
14641           },
14642           lineEnd: function() {
14643             if (lengthRing) lengthPoint$1(x00$2, y00$2);
14644             lengthStream$1.point = noop$4;
14645           },
14646           polygonStart: function() {
14647             lengthRing = true;
14648           },
14649           polygonEnd: function() {
14650             lengthRing = null;
14651           },
14652           result: function() {
14653             var length = +lengthSum$1;
14654             lengthSum$1.reset();
14655             return length;
14656           }
14657         };
14658
14659         function lengthPointFirst$1(x, y) {
14660           lengthStream$1.point = lengthPoint$1;
14661           x00$2 = x0$4 = x, y00$2 = y0$4 = y;
14662         }
14663
14664         function lengthPoint$1(x, y) {
14665           x0$4 -= x, y0$4 -= y;
14666           lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
14667           x0$4 = x, y0$4 = y;
14668         }
14669
14670         function PathString() {
14671           this._string = [];
14672         }
14673
14674         PathString.prototype = {
14675           _radius: 4.5,
14676           _circle: circle$1(4.5),
14677           pointRadius: function(_) {
14678             if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
14679             return this;
14680           },
14681           polygonStart: function() {
14682             this._line = 0;
14683           },
14684           polygonEnd: function() {
14685             this._line = NaN;
14686           },
14687           lineStart: function() {
14688             this._point = 0;
14689           },
14690           lineEnd: function() {
14691             if (this._line === 0) this._string.push("Z");
14692             this._point = NaN;
14693           },
14694           point: function(x, y) {
14695             switch (this._point) {
14696               case 0: {
14697                 this._string.push("M", x, ",", y);
14698                 this._point = 1;
14699                 break;
14700               }
14701               case 1: {
14702                 this._string.push("L", x, ",", y);
14703                 break;
14704               }
14705               default: {
14706                 if (this._circle == null) this._circle = circle$1(this._radius);
14707                 this._string.push("M", x, ",", y, this._circle);
14708                 break;
14709               }
14710             }
14711           },
14712           result: function() {
14713             if (this._string.length) {
14714               var result = this._string.join("");
14715               this._string = [];
14716               return result;
14717             } else {
14718               return null;
14719             }
14720           }
14721         };
14722
14723         function circle$1(radius) {
14724           return "m0," + radius
14725               + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
14726               + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
14727               + "z";
14728         }
14729
14730         function d3_geoPath(projection, context) {
14731           var pointRadius = 4.5,
14732               projectionStream,
14733               contextStream;
14734
14735           function path(object) {
14736             if (object) {
14737               if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
14738               d3_geoStream(object, projectionStream(contextStream));
14739             }
14740             return contextStream.result();
14741           }
14742
14743           path.area = function(object) {
14744             d3_geoStream(object, projectionStream(areaStream$1));
14745             return areaStream$1.result();
14746           };
14747
14748           path.measure = function(object) {
14749             d3_geoStream(object, projectionStream(lengthStream$1));
14750             return lengthStream$1.result();
14751           };
14752
14753           path.bounds = function(object) {
14754             d3_geoStream(object, projectionStream(boundsStream$1));
14755             return boundsStream$1.result();
14756           };
14757
14758           path.centroid = function(object) {
14759             d3_geoStream(object, projectionStream(centroidStream$1));
14760             return centroidStream$1.result();
14761           };
14762
14763           path.projection = function(_) {
14764             return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
14765           };
14766
14767           path.context = function(_) {
14768             if (!arguments.length) return context;
14769             contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
14770             if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
14771             return path;
14772           };
14773
14774           path.pointRadius = function(_) {
14775             if (!arguments.length) return pointRadius;
14776             pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
14777             return path;
14778           };
14779
14780           return path.projection(projection).context(context);
14781         }
14782
14783         function d3_geoTransform(methods) {
14784           return {
14785             stream: transformer(methods)
14786           };
14787         }
14788
14789         function transformer(methods) {
14790           return function(stream) {
14791             var s = new TransformStream;
14792             for (var key in methods) s[key] = methods[key];
14793             s.stream = stream;
14794             return s;
14795           };
14796         }
14797
14798         function TransformStream() {}
14799
14800         TransformStream.prototype = {
14801           constructor: TransformStream,
14802           point: function(x, y) { this.stream.point(x, y); },
14803           sphere: function() { this.stream.sphere(); },
14804           lineStart: function() { this.stream.lineStart(); },
14805           lineEnd: function() { this.stream.lineEnd(); },
14806           polygonStart: function() { this.stream.polygonStart(); },
14807           polygonEnd: function() { this.stream.polygonEnd(); }
14808         };
14809
14810         function fit(projection, fitBounds, object) {
14811           var clip = projection.clipExtent && projection.clipExtent();
14812           projection.scale(150).translate([0, 0]);
14813           if (clip != null) projection.clipExtent(null);
14814           d3_geoStream(object, projection.stream(boundsStream$1));
14815           fitBounds(boundsStream$1.result());
14816           if (clip != null) projection.clipExtent(clip);
14817           return projection;
14818         }
14819
14820         function fitExtent(projection, extent, object) {
14821           return fit(projection, function(b) {
14822             var w = extent[1][0] - extent[0][0],
14823                 h = extent[1][1] - extent[0][1],
14824                 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
14825                 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
14826                 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
14827             projection.scale(150 * k).translate([x, y]);
14828           }, object);
14829         }
14830
14831         function fitSize(projection, size, object) {
14832           return fitExtent(projection, [[0, 0], size], object);
14833         }
14834
14835         function fitWidth(projection, width, object) {
14836           return fit(projection, function(b) {
14837             var w = +width,
14838                 k = w / (b[1][0] - b[0][0]),
14839                 x = (w - k * (b[1][0] + b[0][0])) / 2,
14840                 y = -k * b[0][1];
14841             projection.scale(150 * k).translate([x, y]);
14842           }, object);
14843         }
14844
14845         function fitHeight(projection, height, object) {
14846           return fit(projection, function(b) {
14847             var h = +height,
14848                 k = h / (b[1][1] - b[0][1]),
14849                 x = -k * b[0][0],
14850                 y = (h - k * (b[1][1] + b[0][1])) / 2;
14851             projection.scale(150 * k).translate([x, y]);
14852           }, object);
14853         }
14854
14855         var maxDepth = 16, // maximum depth of subdivision
14856             cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
14857
14858         function resample(project, delta2) {
14859           return +delta2 ? resample$1(project, delta2) : resampleNone(project);
14860         }
14861
14862         function resampleNone(project) {
14863           return transformer({
14864             point: function(x, y) {
14865               x = project(x, y);
14866               this.stream.point(x[0], x[1]);
14867             }
14868           });
14869         }
14870
14871         function resample$1(project, delta2) {
14872
14873           function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
14874             var dx = x1 - x0,
14875                 dy = y1 - y0,
14876                 d2 = dx * dx + dy * dy;
14877             if (d2 > 4 * delta2 && depth--) {
14878               var a = a0 + a1,
14879                   b = b0 + b1,
14880                   c = c0 + c1,
14881                   m = sqrt(a * a + b * b + c * c),
14882                   phi2 = asin(c /= m),
14883                   lambda2 = abs$2(abs$2(c) - 1) < epsilon$2 || abs$2(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
14884                   p = project(lambda2, phi2),
14885                   x2 = p[0],
14886                   y2 = p[1],
14887                   dx2 = x2 - x0,
14888                   dy2 = y2 - y0,
14889                   dz = dy * dx2 - dx * dy2;
14890               if (dz * dz / d2 > delta2 // perpendicular projected distance
14891                   || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
14892                   || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
14893                 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
14894                 stream.point(x2, y2);
14895                 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
14896               }
14897             }
14898           }
14899           return function(stream) {
14900             var lambda00, x00, y00, a00, b00, c00, // first point
14901                 lambda0, x0, y0, a0, b0, c0; // previous point
14902
14903             var resampleStream = {
14904               point: point,
14905               lineStart: lineStart,
14906               lineEnd: lineEnd,
14907               polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
14908               polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
14909             };
14910
14911             function point(x, y) {
14912               x = project(x, y);
14913               stream.point(x[0], x[1]);
14914             }
14915
14916             function lineStart() {
14917               x0 = NaN;
14918               resampleStream.point = linePoint;
14919               stream.lineStart();
14920             }
14921
14922             function linePoint(lambda, phi) {
14923               var c = cartesian([lambda, phi]), p = project(lambda, phi);
14924               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);
14925               stream.point(x0, y0);
14926             }
14927
14928             function lineEnd() {
14929               resampleStream.point = point;
14930               stream.lineEnd();
14931             }
14932
14933             function ringStart() {
14934               lineStart();
14935               resampleStream.point = ringPoint;
14936               resampleStream.lineEnd = ringEnd;
14937             }
14938
14939             function ringPoint(lambda, phi) {
14940               linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
14941               resampleStream.point = linePoint;
14942             }
14943
14944             function ringEnd() {
14945               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
14946               resampleStream.lineEnd = lineEnd;
14947               lineEnd();
14948             }
14949
14950             return resampleStream;
14951           };
14952         }
14953
14954         var transformRadians = transformer({
14955           point: function(x, y) {
14956             this.stream.point(x * radians, y * radians);
14957           }
14958         });
14959
14960         function transformRotate(rotate) {
14961           return transformer({
14962             point: function(x, y) {
14963               var r = rotate(x, y);
14964               return this.stream.point(r[0], r[1]);
14965             }
14966           });
14967         }
14968
14969         function scaleTranslate(k, dx, dy) {
14970           function transform(x, y) {
14971             return [dx + k * x, dy - k * y];
14972           }
14973           transform.invert = function(x, y) {
14974             return [(x - dx) / k, (dy - y) / k];
14975           };
14976           return transform;
14977         }
14978
14979         function scaleTranslateRotate(k, dx, dy, alpha) {
14980           var cosAlpha = cos$1(alpha),
14981               sinAlpha = sin$1(alpha),
14982               a = cosAlpha * k,
14983               b = sinAlpha * k,
14984               ai = cosAlpha / k,
14985               bi = sinAlpha / k,
14986               ci = (sinAlpha * dy - cosAlpha * dx) / k,
14987               fi = (sinAlpha * dx + cosAlpha * dy) / k;
14988           function transform(x, y) {
14989             return [a * x - b * y + dx, dy - b * x - a * y];
14990           }
14991           transform.invert = function(x, y) {
14992             return [ai * x - bi * y + ci, fi - bi * x - ai * y];
14993           };
14994           return transform;
14995         }
14996
14997         function projection(project) {
14998           return projectionMutator(function() { return project; })();
14999         }
15000
15001         function projectionMutator(projectAt) {
15002           var project,
15003               k = 150, // scale
15004               x = 480, y = 250, // translate
15005               lambda = 0, phi = 0, // center
15006               deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
15007               alpha = 0, // post-rotate
15008               theta = null, preclip = clipAntimeridian, // pre-clip angle
15009               x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent
15010               delta2 = 0.5, // precision
15011               projectResample,
15012               projectTransform,
15013               projectRotateTransform,
15014               cache,
15015               cacheStream;
15016
15017           function projection(point) {
15018             return projectRotateTransform(point[0] * radians, point[1] * radians);
15019           }
15020
15021           function invert(point) {
15022             point = projectRotateTransform.invert(point[0], point[1]);
15023             return point && [point[0] * degrees$1, point[1] * degrees$1];
15024           }
15025
15026           projection.stream = function(stream) {
15027             return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
15028           };
15029
15030           projection.preclip = function(_) {
15031             return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
15032           };
15033
15034           projection.postclip = function(_) {
15035             return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15036           };
15037
15038           projection.clipAngle = function(_) {
15039             return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
15040           };
15041
15042           projection.clipExtent = function(_) {
15043             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]];
15044           };
15045
15046           projection.scale = function(_) {
15047             return arguments.length ? (k = +_, recenter()) : k;
15048           };
15049
15050           projection.translate = function(_) {
15051             return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
15052           };
15053
15054           projection.center = function(_) {
15055             return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
15056           };
15057
15058           projection.rotate = function(_) {
15059             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];
15060           };
15061
15062           projection.angle = function(_) {
15063             return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
15064           };
15065
15066           projection.precision = function(_) {
15067             return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
15068           };
15069
15070           projection.fitExtent = function(extent, object) {
15071             return fitExtent(projection, extent, object);
15072           };
15073
15074           projection.fitSize = function(size, object) {
15075             return fitSize(projection, size, object);
15076           };
15077
15078           projection.fitWidth = function(width, object) {
15079             return fitWidth(projection, width, object);
15080           };
15081
15082           projection.fitHeight = function(height, object) {
15083             return fitHeight(projection, height, object);
15084           };
15085
15086           function recenter() {
15087             var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
15088                 transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
15089             rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
15090             projectTransform = compose(project, transform);
15091             projectRotateTransform = compose(rotate, projectTransform);
15092             projectResample = resample(projectTransform, delta2);
15093             return reset();
15094           }
15095
15096           function reset() {
15097             cache = cacheStream = null;
15098             return projection;
15099           }
15100
15101           return function() {
15102             project = projectAt.apply(this, arguments);
15103             projection.invert = project.invert && invert;
15104             return recenter();
15105           };
15106         }
15107
15108         function conicProjection(projectAt) {
15109           var phi0 = 0,
15110               phi1 = pi$3 / 3,
15111               m = projectionMutator(projectAt),
15112               p = m(phi0, phi1);
15113
15114           p.parallels = function(_) {
15115             return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
15116           };
15117
15118           return p;
15119         }
15120
15121         function cylindricalEqualAreaRaw(phi0) {
15122           var cosPhi0 = cos$1(phi0);
15123
15124           function forward(lambda, phi) {
15125             return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
15126           }
15127
15128           forward.invert = function(x, y) {
15129             return [x / cosPhi0, asin(y * cosPhi0)];
15130           };
15131
15132           return forward;
15133         }
15134
15135         function conicEqualAreaRaw(y0, y1) {
15136           var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
15137
15138           // Are the parallels symmetrical around the Equator?
15139           if (abs$2(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
15140
15141           var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
15142
15143           function project(x, y) {
15144             var r = sqrt(c - 2 * n * sin$1(y)) / n;
15145             return [r * sin$1(x *= n), r0 - r * cos$1(x)];
15146           }
15147
15148           project.invert = function(x, y) {
15149             var r0y = r0 - y;
15150             return [atan2(x, abs$2(r0y)) / n * sign$2(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
15151           };
15152
15153           return project;
15154         }
15155
15156         function conicEqualArea() {
15157           return conicProjection(conicEqualAreaRaw)
15158               .scale(155.424)
15159               .center([0, 33.6442]);
15160         }
15161
15162         function albers() {
15163           return conicEqualArea()
15164               .parallels([29.5, 45.5])
15165               .scale(1070)
15166               .translate([480, 250])
15167               .rotate([96, 0])
15168               .center([-0.6, 38.7]);
15169         }
15170
15171         // The projections must have mutually exclusive clip regions on the sphere,
15172         // as this will avoid emitting interleaving lines and polygons.
15173         function multiplex(streams) {
15174           var n = streams.length;
15175           return {
15176             point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
15177             sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
15178             lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
15179             lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
15180             polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
15181             polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
15182           };
15183         }
15184
15185         // A composite projection for the United States, configured by default for
15186         // 960×500. The projection also works quite well at 960×600 if you change the
15187         // scale to 1285 and adjust the translate accordingly. The set of standard
15188         // parallels for each region comes from USGS, which is published here:
15189         // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
15190         function albersUsa() {
15191           var cache,
15192               cacheStream,
15193               lower48 = albers(), lower48Point,
15194               alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
15195               hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
15196               point, pointStream = {point: function(x, y) { point = [x, y]; }};
15197
15198           function albersUsa(coordinates) {
15199             var x = coordinates[0], y = coordinates[1];
15200             return point = null,
15201                 (lower48Point.point(x, y), point)
15202                 || (alaskaPoint.point(x, y), point)
15203                 || (hawaiiPoint.point(x, y), point);
15204           }
15205
15206           albersUsa.invert = function(coordinates) {
15207             var k = lower48.scale(),
15208                 t = lower48.translate(),
15209                 x = (coordinates[0] - t[0]) / k,
15210                 y = (coordinates[1] - t[1]) / k;
15211             return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
15212                 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
15213                 : lower48).invert(coordinates);
15214           };
15215
15216           albersUsa.stream = function(stream) {
15217             return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
15218           };
15219
15220           albersUsa.precision = function(_) {
15221             if (!arguments.length) return lower48.precision();
15222             lower48.precision(_), alaska.precision(_), hawaii.precision(_);
15223             return reset();
15224           };
15225
15226           albersUsa.scale = function(_) {
15227             if (!arguments.length) return lower48.scale();
15228             lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
15229             return albersUsa.translate(lower48.translate());
15230           };
15231
15232           albersUsa.translate = function(_) {
15233             if (!arguments.length) return lower48.translate();
15234             var k = lower48.scale(), x = +_[0], y = +_[1];
15235
15236             lower48Point = lower48
15237                 .translate(_)
15238                 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
15239                 .stream(pointStream);
15240
15241             alaskaPoint = alaska
15242                 .translate([x - 0.307 * k, y + 0.201 * k])
15243                 .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]])
15244                 .stream(pointStream);
15245
15246             hawaiiPoint = hawaii
15247                 .translate([x - 0.205 * k, y + 0.212 * k])
15248                 .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]])
15249                 .stream(pointStream);
15250
15251             return reset();
15252           };
15253
15254           albersUsa.fitExtent = function(extent, object) {
15255             return fitExtent(albersUsa, extent, object);
15256           };
15257
15258           albersUsa.fitSize = function(size, object) {
15259             return fitSize(albersUsa, size, object);
15260           };
15261
15262           albersUsa.fitWidth = function(width, object) {
15263             return fitWidth(albersUsa, width, object);
15264           };
15265
15266           albersUsa.fitHeight = function(height, object) {
15267             return fitHeight(albersUsa, height, object);
15268           };
15269
15270           function reset() {
15271             cache = cacheStream = null;
15272             return albersUsa;
15273           }
15274
15275           return albersUsa.scale(1070);
15276         }
15277
15278         function azimuthalRaw(scale) {
15279           return function(x, y) {
15280             var cx = cos$1(x),
15281                 cy = cos$1(y),
15282                 k = scale(cx * cy);
15283             return [
15284               k * cy * sin$1(x),
15285               k * sin$1(y)
15286             ];
15287           }
15288         }
15289
15290         function azimuthalInvert(angle) {
15291           return function(x, y) {
15292             var z = sqrt(x * x + y * y),
15293                 c = angle(z),
15294                 sc = sin$1(c),
15295                 cc = cos$1(c);
15296             return [
15297               atan2(x * sc, z * cc),
15298               asin(z && y * sc / z)
15299             ];
15300           }
15301         }
15302
15303         var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
15304           return sqrt(2 / (1 + cxcy));
15305         });
15306
15307         azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
15308           return 2 * asin(z / 2);
15309         });
15310
15311         function azimuthalEqualArea() {
15312           return projection(azimuthalEqualAreaRaw)
15313               .scale(124.75)
15314               .clipAngle(180 - 1e-3);
15315         }
15316
15317         var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
15318           return (c = acos(c)) && c / sin$1(c);
15319         });
15320
15321         azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
15322           return z;
15323         });
15324
15325         function azimuthalEquidistant() {
15326           return projection(azimuthalEquidistantRaw)
15327               .scale(79.4188)
15328               .clipAngle(180 - 1e-3);
15329         }
15330
15331         function mercatorRaw(lambda, phi) {
15332           return [lambda, log(tan((halfPi$2 + phi) / 2))];
15333         }
15334
15335         mercatorRaw.invert = function(x, y) {
15336           return [x, 2 * atan(exp(y)) - halfPi$2];
15337         };
15338
15339         function mercator() {
15340           return mercatorProjection(mercatorRaw)
15341               .scale(961 / tau$3);
15342         }
15343
15344         function mercatorProjection(project) {
15345           var m = projection(project),
15346               center = m.center,
15347               scale = m.scale,
15348               translate = m.translate,
15349               clipExtent = m.clipExtent,
15350               x0 = null, y0, x1, y1; // clip extent
15351
15352           m.scale = function(_) {
15353             return arguments.length ? (scale(_), reclip()) : scale();
15354           };
15355
15356           m.translate = function(_) {
15357             return arguments.length ? (translate(_), reclip()) : translate();
15358           };
15359
15360           m.center = function(_) {
15361             return arguments.length ? (center(_), reclip()) : center();
15362           };
15363
15364           m.clipExtent = function(_) {
15365             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]];
15366           };
15367
15368           function reclip() {
15369             var k = pi$3 * scale(),
15370                 t = m(rotation(m.rotate()).invert([0, 0]));
15371             return clipExtent(x0 == null
15372                 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
15373                 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
15374                 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
15375           }
15376
15377           return reclip();
15378         }
15379
15380         function tany(y) {
15381           return tan((halfPi$2 + y) / 2);
15382         }
15383
15384         function conicConformalRaw(y0, y1) {
15385           var cy0 = cos$1(y0),
15386               n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
15387               f = cy0 * pow(tany(y0), n) / n;
15388
15389           if (!n) return mercatorRaw;
15390
15391           function project(x, y) {
15392             if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
15393             else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
15394             var r = f / pow(tany(y), n);
15395             return [r * sin$1(n * x), f - r * cos$1(n * x)];
15396           }
15397
15398           project.invert = function(x, y) {
15399             var fy = f - y, r = sign$2(n) * sqrt(x * x + fy * fy);
15400             return [atan2(x, abs$2(fy)) / n * sign$2(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
15401           };
15402
15403           return project;
15404         }
15405
15406         function conicConformal() {
15407           return conicProjection(conicConformalRaw)
15408               .scale(109.5)
15409               .parallels([30, 30]);
15410         }
15411
15412         function equirectangularRaw(lambda, phi) {
15413           return [lambda, phi];
15414         }
15415
15416         equirectangularRaw.invert = equirectangularRaw;
15417
15418         function equirectangular() {
15419           return projection(equirectangularRaw)
15420               .scale(152.63);
15421         }
15422
15423         function conicEquidistantRaw(y0, y1) {
15424           var cy0 = cos$1(y0),
15425               n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
15426               g = cy0 / n + y0;
15427
15428           if (abs$2(n) < epsilon$2) return equirectangularRaw;
15429
15430           function project(x, y) {
15431             var gy = g - y, nx = n * x;
15432             return [gy * sin$1(nx), g - gy * cos$1(nx)];
15433           }
15434
15435           project.invert = function(x, y) {
15436             var gy = g - y;
15437             return [atan2(x, abs$2(gy)) / n * sign$2(gy), g - sign$2(n) * sqrt(x * x + gy * gy)];
15438           };
15439
15440           return project;
15441         }
15442
15443         function conicEquidistant() {
15444           return conicProjection(conicEquidistantRaw)
15445               .scale(131.154)
15446               .center([0, 13.9389]);
15447         }
15448
15449         var A1 = 1.340264,
15450             A2 = -0.081106,
15451             A3 = 0.000893,
15452             A4 = 0.003796,
15453             M = sqrt(3) / 2,
15454             iterations = 12;
15455
15456         function equalEarthRaw(lambda, phi) {
15457           var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
15458           return [
15459             lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
15460             l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
15461           ];
15462         }
15463
15464         equalEarthRaw.invert = function(x, y) {
15465           var l = y, l2 = l * l, l6 = l2 * l2 * l2;
15466           for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
15467             fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
15468             fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
15469             l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
15470             if (abs$2(delta) < epsilon2$1) break;
15471           }
15472           return [
15473             M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),
15474             asin(sin$1(l) / M)
15475           ];
15476         };
15477
15478         function equalEarth() {
15479           return projection(equalEarthRaw)
15480               .scale(177.158);
15481         }
15482
15483         function gnomonicRaw(x, y) {
15484           var cy = cos$1(y), k = cos$1(x) * cy;
15485           return [cy * sin$1(x) / k, sin$1(y) / k];
15486         }
15487
15488         gnomonicRaw.invert = azimuthalInvert(atan);
15489
15490         function gnomonic() {
15491           return projection(gnomonicRaw)
15492               .scale(144.049)
15493               .clipAngle(60);
15494         }
15495
15496         function scaleTranslate$1(kx, ky, tx, ty) {
15497           return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
15498             point: function(x, y) {
15499               this.stream.point(x * kx + tx, y * ky + ty);
15500             }
15501           });
15502         }
15503
15504         function d3_geoIdentity() {
15505           var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
15506               x0 = null, y0, x1, y1, // clip extent
15507               postclip = identity$4,
15508               cache,
15509               cacheStream,
15510               projection;
15511
15512           function reset() {
15513             cache = cacheStream = null;
15514             return projection;
15515           }
15516
15517           return projection = {
15518             stream: function(stream) {
15519               return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
15520             },
15521             postclip: function(_) {
15522               return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15523             },
15524             clipExtent: function(_) {
15525               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]];
15526             },
15527             scale: function(_) {
15528               return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k;
15529             },
15530             translate: function(_) {
15531               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
15532             },
15533             reflectX: function(_) {
15534               return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
15535             },
15536             reflectY: function(_) {
15537               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
15538             },
15539             fitExtent: function(extent, object) {
15540               return fitExtent(projection, extent, object);
15541             },
15542             fitSize: function(size, object) {
15543               return fitSize(projection, size, object);
15544             },
15545             fitWidth: function(width, object) {
15546               return fitWidth(projection, width, object);
15547             },
15548             fitHeight: function(height, object) {
15549               return fitHeight(projection, height, object);
15550             }
15551           };
15552         }
15553
15554         function naturalEarth1Raw(lambda, phi) {
15555           var phi2 = phi * phi, phi4 = phi2 * phi2;
15556           return [
15557             lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
15558             phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
15559           ];
15560         }
15561
15562         naturalEarth1Raw.invert = function(x, y) {
15563           var phi = y, i = 25, delta;
15564           do {
15565             var phi2 = phi * phi, phi4 = phi2 * phi2;
15566             phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
15567                 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
15568           } while (abs$2(delta) > epsilon$2 && --i > 0);
15569           return [
15570             x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
15571             phi
15572           ];
15573         };
15574
15575         function naturalEarth1() {
15576           return projection(naturalEarth1Raw)
15577               .scale(175.295);
15578         }
15579
15580         function orthographicRaw(x, y) {
15581           return [cos$1(y) * sin$1(x), sin$1(y)];
15582         }
15583
15584         orthographicRaw.invert = azimuthalInvert(asin);
15585
15586         function orthographic() {
15587           return projection(orthographicRaw)
15588               .scale(249.5)
15589               .clipAngle(90 + epsilon$2);
15590         }
15591
15592         function stereographicRaw(x, y) {
15593           var cy = cos$1(y), k = 1 + cos$1(x) * cy;
15594           return [cy * sin$1(x) / k, sin$1(y) / k];
15595         }
15596
15597         stereographicRaw.invert = azimuthalInvert(function(z) {
15598           return 2 * atan(z);
15599         });
15600
15601         function stereographic() {
15602           return projection(stereographicRaw)
15603               .scale(250)
15604               .clipAngle(142);
15605         }
15606
15607         function transverseMercatorRaw(lambda, phi) {
15608           return [log(tan((halfPi$2 + phi) / 2)), -lambda];
15609         }
15610
15611         transverseMercatorRaw.invert = function(x, y) {
15612           return [-y, 2 * atan(exp(x)) - halfPi$2];
15613         };
15614
15615         function transverseMercator() {
15616           var m = mercatorProjection(transverseMercatorRaw),
15617               center = m.center,
15618               rotate = m.rotate;
15619
15620           m.center = function(_) {
15621             return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
15622           };
15623
15624           m.rotate = function(_) {
15625             return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
15626           };
15627
15628           return rotate([0, 0, 90])
15629               .scale(159.155);
15630         }
15631
15632         function defaultSeparation(a, b) {
15633           return a.parent === b.parent ? 1 : 2;
15634         }
15635
15636         function meanX(children) {
15637           return children.reduce(meanXReduce, 0) / children.length;
15638         }
15639
15640         function meanXReduce(x, c) {
15641           return x + c.x;
15642         }
15643
15644         function maxY(children) {
15645           return 1 + children.reduce(maxYReduce, 0);
15646         }
15647
15648         function maxYReduce(y, c) {
15649           return Math.max(y, c.y);
15650         }
15651
15652         function leafLeft(node) {
15653           var children;
15654           while (children = node.children) node = children[0];
15655           return node;
15656         }
15657
15658         function leafRight(node) {
15659           var children;
15660           while (children = node.children) node = children[children.length - 1];
15661           return node;
15662         }
15663
15664         function cluster() {
15665           var separation = defaultSeparation,
15666               dx = 1,
15667               dy = 1,
15668               nodeSize = false;
15669
15670           function cluster(root) {
15671             var previousNode,
15672                 x = 0;
15673
15674             // First walk, computing the initial x & y values.
15675             root.eachAfter(function(node) {
15676               var children = node.children;
15677               if (children) {
15678                 node.x = meanX(children);
15679                 node.y = maxY(children);
15680               } else {
15681                 node.x = previousNode ? x += separation(node, previousNode) : 0;
15682                 node.y = 0;
15683                 previousNode = node;
15684               }
15685             });
15686
15687             var left = leafLeft(root),
15688                 right = leafRight(root),
15689                 x0 = left.x - separation(left, right) / 2,
15690                 x1 = right.x + separation(right, left) / 2;
15691
15692             // Second walk, normalizing x & y to the desired size.
15693             return root.eachAfter(nodeSize ? function(node) {
15694               node.x = (node.x - root.x) * dx;
15695               node.y = (root.y - node.y) * dy;
15696             } : function(node) {
15697               node.x = (node.x - x0) / (x1 - x0) * dx;
15698               node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
15699             });
15700           }
15701
15702           cluster.separation = function(x) {
15703             return arguments.length ? (separation = x, cluster) : separation;
15704           };
15705
15706           cluster.size = function(x) {
15707             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
15708           };
15709
15710           cluster.nodeSize = function(x) {
15711             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
15712           };
15713
15714           return cluster;
15715         }
15716
15717         function count(node) {
15718           var sum = 0,
15719               children = node.children,
15720               i = children && children.length;
15721           if (!i) sum = 1;
15722           else while (--i >= 0) sum += children[i].value;
15723           node.value = sum;
15724         }
15725
15726         function node_count() {
15727           return this.eachAfter(count);
15728         }
15729
15730         function node_each(callback) {
15731           var node = this, current, next = [node], children, i, n;
15732           do {
15733             current = next.reverse(), next = [];
15734             while (node = current.pop()) {
15735               callback(node), children = node.children;
15736               if (children) for (i = 0, n = children.length; i < n; ++i) {
15737                 next.push(children[i]);
15738               }
15739             }
15740           } while (next.length);
15741           return this;
15742         }
15743
15744         function node_eachBefore(callback) {
15745           var node = this, nodes = [node], children, i;
15746           while (node = nodes.pop()) {
15747             callback(node), children = node.children;
15748             if (children) for (i = children.length - 1; i >= 0; --i) {
15749               nodes.push(children[i]);
15750             }
15751           }
15752           return this;
15753         }
15754
15755         function node_eachAfter(callback) {
15756           var node = this, nodes = [node], next = [], children, i, n;
15757           while (node = nodes.pop()) {
15758             next.push(node), children = node.children;
15759             if (children) for (i = 0, n = children.length; i < n; ++i) {
15760               nodes.push(children[i]);
15761             }
15762           }
15763           while (node = next.pop()) {
15764             callback(node);
15765           }
15766           return this;
15767         }
15768
15769         function node_sum(value) {
15770           return this.eachAfter(function(node) {
15771             var sum = +value(node.data) || 0,
15772                 children = node.children,
15773                 i = children && children.length;
15774             while (--i >= 0) sum += children[i].value;
15775             node.value = sum;
15776           });
15777         }
15778
15779         function node_sort(compare) {
15780           return this.eachBefore(function(node) {
15781             if (node.children) {
15782               node.children.sort(compare);
15783             }
15784           });
15785         }
15786
15787         function node_path(end) {
15788           var start = this,
15789               ancestor = leastCommonAncestor(start, end),
15790               nodes = [start];
15791           while (start !== ancestor) {
15792             start = start.parent;
15793             nodes.push(start);
15794           }
15795           var k = nodes.length;
15796           while (end !== ancestor) {
15797             nodes.splice(k, 0, end);
15798             end = end.parent;
15799           }
15800           return nodes;
15801         }
15802
15803         function leastCommonAncestor(a, b) {
15804           if (a === b) return a;
15805           var aNodes = a.ancestors(),
15806               bNodes = b.ancestors(),
15807               c = null;
15808           a = aNodes.pop();
15809           b = bNodes.pop();
15810           while (a === b) {
15811             c = a;
15812             a = aNodes.pop();
15813             b = bNodes.pop();
15814           }
15815           return c;
15816         }
15817
15818         function node_ancestors() {
15819           var node = this, nodes = [node];
15820           while (node = node.parent) {
15821             nodes.push(node);
15822           }
15823           return nodes;
15824         }
15825
15826         function node_descendants() {
15827           var nodes = [];
15828           this.each(function(node) {
15829             nodes.push(node);
15830           });
15831           return nodes;
15832         }
15833
15834         function node_leaves() {
15835           var leaves = [];
15836           this.eachBefore(function(node) {
15837             if (!node.children) {
15838               leaves.push(node);
15839             }
15840           });
15841           return leaves;
15842         }
15843
15844         function node_links() {
15845           var root = this, links = [];
15846           root.each(function(node) {
15847             if (node !== root) { // Don’t include the root’s parent, if any.
15848               links.push({source: node.parent, target: node});
15849             }
15850           });
15851           return links;
15852         }
15853
15854         function hierarchy(data, children) {
15855           var root = new Node(data),
15856               valued = +data.value && (root.value = data.value),
15857               node,
15858               nodes = [root],
15859               child,
15860               childs,
15861               i,
15862               n;
15863
15864           if (children == null) children = defaultChildren;
15865
15866           while (node = nodes.pop()) {
15867             if (valued) node.value = +node.data.value;
15868             if ((childs = children(node.data)) && (n = childs.length)) {
15869               node.children = new Array(n);
15870               for (i = n - 1; i >= 0; --i) {
15871                 nodes.push(child = node.children[i] = new Node(childs[i]));
15872                 child.parent = node;
15873                 child.depth = node.depth + 1;
15874               }
15875             }
15876           }
15877
15878           return root.eachBefore(computeHeight);
15879         }
15880
15881         function node_copy() {
15882           return hierarchy(this).eachBefore(copyData);
15883         }
15884
15885         function defaultChildren(d) {
15886           return d.children;
15887         }
15888
15889         function copyData(node) {
15890           node.data = node.data.data;
15891         }
15892
15893         function computeHeight(node) {
15894           var height = 0;
15895           do node.height = height;
15896           while ((node = node.parent) && (node.height < ++height));
15897         }
15898
15899         function Node(data) {
15900           this.data = data;
15901           this.depth =
15902           this.height = 0;
15903           this.parent = null;
15904         }
15905
15906         Node.prototype = hierarchy.prototype = {
15907           constructor: Node,
15908           count: node_count,
15909           each: node_each,
15910           eachAfter: node_eachAfter,
15911           eachBefore: node_eachBefore,
15912           sum: node_sum,
15913           sort: node_sort,
15914           path: node_path,
15915           ancestors: node_ancestors,
15916           descendants: node_descendants,
15917           leaves: node_leaves,
15918           links: node_links,
15919           copy: node_copy
15920         };
15921
15922         var slice$8 = Array.prototype.slice;
15923
15924         function shuffle$1(array) {
15925           var m = array.length,
15926               t,
15927               i;
15928
15929           while (m) {
15930             i = Math.random() * m-- | 0;
15931             t = array[m];
15932             array[m] = array[i];
15933             array[i] = t;
15934           }
15935
15936           return array;
15937         }
15938
15939         function enclose(circles) {
15940           var i = 0, n = (circles = shuffle$1(slice$8.call(circles))).length, B = [], p, e;
15941
15942           while (i < n) {
15943             p = circles[i];
15944             if (e && enclosesWeak(e, p)) ++i;
15945             else e = encloseBasis(B = extendBasis(B, p)), i = 0;
15946           }
15947
15948           return e;
15949         }
15950
15951         function extendBasis(B, p) {
15952           var i, j;
15953
15954           if (enclosesWeakAll(p, B)) return [p];
15955
15956           // If we get here then B must have at least one element.
15957           for (i = 0; i < B.length; ++i) {
15958             if (enclosesNot(p, B[i])
15959                 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
15960               return [B[i], p];
15961             }
15962           }
15963
15964           // If we get here then B must have at least two elements.
15965           for (i = 0; i < B.length - 1; ++i) {
15966             for (j = i + 1; j < B.length; ++j) {
15967               if (enclosesNot(encloseBasis2(B[i], B[j]), p)
15968                   && enclosesNot(encloseBasis2(B[i], p), B[j])
15969                   && enclosesNot(encloseBasis2(B[j], p), B[i])
15970                   && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
15971                 return [B[i], B[j], p];
15972               }
15973             }
15974           }
15975
15976           // If we get here then something is very wrong.
15977           throw new Error;
15978         }
15979
15980         function enclosesNot(a, b) {
15981           var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
15982           return dr < 0 || dr * dr < dx * dx + dy * dy;
15983         }
15984
15985         function enclosesWeak(a, b) {
15986           var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
15987           return dr > 0 && dr * dr > dx * dx + dy * dy;
15988         }
15989
15990         function enclosesWeakAll(a, B) {
15991           for (var i = 0; i < B.length; ++i) {
15992             if (!enclosesWeak(a, B[i])) {
15993               return false;
15994             }
15995           }
15996           return true;
15997         }
15998
15999         function encloseBasis(B) {
16000           switch (B.length) {
16001             case 1: return encloseBasis1(B[0]);
16002             case 2: return encloseBasis2(B[0], B[1]);
16003             case 3: return encloseBasis3(B[0], B[1], B[2]);
16004           }
16005         }
16006
16007         function encloseBasis1(a) {
16008           return {
16009             x: a.x,
16010             y: a.y,
16011             r: a.r
16012           };
16013         }
16014
16015         function encloseBasis2(a, b) {
16016           var x1 = a.x, y1 = a.y, r1 = a.r,
16017               x2 = b.x, y2 = b.y, r2 = b.r,
16018               x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
16019               l = Math.sqrt(x21 * x21 + y21 * y21);
16020           return {
16021             x: (x1 + x2 + x21 / l * r21) / 2,
16022             y: (y1 + y2 + y21 / l * r21) / 2,
16023             r: (l + r1 + r2) / 2
16024           };
16025         }
16026
16027         function encloseBasis3(a, b, c) {
16028           var x1 = a.x, y1 = a.y, r1 = a.r,
16029               x2 = b.x, y2 = b.y, r2 = b.r,
16030               x3 = c.x, y3 = c.y, r3 = c.r,
16031               a2 = x1 - x2,
16032               a3 = x1 - x3,
16033               b2 = y1 - y2,
16034               b3 = y1 - y3,
16035               c2 = r2 - r1,
16036               c3 = r3 - r1,
16037               d1 = x1 * x1 + y1 * y1 - r1 * r1,
16038               d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
16039               d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
16040               ab = a3 * b2 - a2 * b3,
16041               xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
16042               xb = (b3 * c2 - b2 * c3) / ab,
16043               ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
16044               yb = (a2 * c3 - a3 * c2) / ab,
16045               A = xb * xb + yb * yb - 1,
16046               B = 2 * (r1 + xa * xb + ya * yb),
16047               C = xa * xa + ya * ya - r1 * r1,
16048               r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
16049           return {
16050             x: x1 + xa + xb * r,
16051             y: y1 + ya + yb * r,
16052             r: r
16053           };
16054         }
16055
16056         function place(b, a, c) {
16057           var dx = b.x - a.x, x, a2,
16058               dy = b.y - a.y, y, b2,
16059               d2 = dx * dx + dy * dy;
16060           if (d2) {
16061             a2 = a.r + c.r, a2 *= a2;
16062             b2 = b.r + c.r, b2 *= b2;
16063             if (a2 > b2) {
16064               x = (d2 + b2 - a2) / (2 * d2);
16065               y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
16066               c.x = b.x - x * dx - y * dy;
16067               c.y = b.y - x * dy + y * dx;
16068             } else {
16069               x = (d2 + a2 - b2) / (2 * d2);
16070               y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
16071               c.x = a.x + x * dx - y * dy;
16072               c.y = a.y + x * dy + y * dx;
16073             }
16074           } else {
16075             c.x = a.x + c.r;
16076             c.y = a.y;
16077           }
16078         }
16079
16080         function intersects(a, b) {
16081           var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16082           return dr > 0 && dr * dr > dx * dx + dy * dy;
16083         }
16084
16085         function score(node) {
16086           var a = node._,
16087               b = node.next._,
16088               ab = a.r + b.r,
16089               dx = (a.x * b.r + b.x * a.r) / ab,
16090               dy = (a.y * b.r + b.y * a.r) / ab;
16091           return dx * dx + dy * dy;
16092         }
16093
16094         function Node$1(circle) {
16095           this._ = circle;
16096           this.next = null;
16097           this.previous = null;
16098         }
16099
16100         function packEnclose(circles) {
16101           if (!(n = circles.length)) return 0;
16102
16103           var a, b, c, n, aa, ca, i, j, k, sj, sk;
16104
16105           // Place the first circle.
16106           a = circles[0], a.x = 0, a.y = 0;
16107           if (!(n > 1)) return a.r;
16108
16109           // Place the second circle.
16110           b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
16111           if (!(n > 2)) return a.r + b.r;
16112
16113           // Place the third circle.
16114           place(b, a, c = circles[2]);
16115
16116           // Initialize the front-chain using the first three circles a, b and c.
16117           a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
16118           a.next = c.previous = b;
16119           b.next = a.previous = c;
16120           c.next = b.previous = a;
16121
16122           // Attempt to place each remaining circle…
16123           pack: for (i = 3; i < n; ++i) {
16124             place(a._, b._, c = circles[i]), c = new Node$1(c);
16125
16126             // Find the closest intersecting circle on the front-chain, if any.
16127             // “Closeness” is determined by linear distance along the front-chain.
16128             // “Ahead” or “behind” is likewise determined by linear distance.
16129             j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
16130             do {
16131               if (sj <= sk) {
16132                 if (intersects(j._, c._)) {
16133                   b = j, a.next = b, b.previous = a, --i;
16134                   continue pack;
16135                 }
16136                 sj += j._.r, j = j.next;
16137               } else {
16138                 if (intersects(k._, c._)) {
16139                   a = k, a.next = b, b.previous = a, --i;
16140                   continue pack;
16141                 }
16142                 sk += k._.r, k = k.previous;
16143               }
16144             } while (j !== k.next);
16145
16146             // Success! Insert the new circle c between a and b.
16147             c.previous = a, c.next = b, a.next = b.previous = b = c;
16148
16149             // Compute the new closest circle pair to the centroid.
16150             aa = score(a);
16151             while ((c = c.next) !== b) {
16152               if ((ca = score(c)) < aa) {
16153                 a = c, aa = ca;
16154               }
16155             }
16156             b = a.next;
16157           }
16158
16159           // Compute the enclosing circle of the front chain.
16160           a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
16161
16162           // Translate the circles to put the enclosing circle around the origin.
16163           for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
16164
16165           return c.r;
16166         }
16167
16168         function siblings(circles) {
16169           packEnclose(circles);
16170           return circles;
16171         }
16172
16173         function optional(f) {
16174           return f == null ? null : required(f);
16175         }
16176
16177         function required(f) {
16178           if (typeof f !== "function") throw new Error;
16179           return f;
16180         }
16181
16182         function constantZero() {
16183           return 0;
16184         }
16185
16186         function constant$9(x) {
16187           return function() {
16188             return x;
16189           };
16190         }
16191
16192         function defaultRadius$1(d) {
16193           return Math.sqrt(d.value);
16194         }
16195
16196         function index$1() {
16197           var radius = null,
16198               dx = 1,
16199               dy = 1,
16200               padding = constantZero;
16201
16202           function pack(root) {
16203             root.x = dx / 2, root.y = dy / 2;
16204             if (radius) {
16205               root.eachBefore(radiusLeaf(radius))
16206                   .eachAfter(packChildren(padding, 0.5))
16207                   .eachBefore(translateChild(1));
16208             } else {
16209               root.eachBefore(radiusLeaf(defaultRadius$1))
16210                   .eachAfter(packChildren(constantZero, 1))
16211                   .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
16212                   .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
16213             }
16214             return root;
16215           }
16216
16217           pack.radius = function(x) {
16218             return arguments.length ? (radius = optional(x), pack) : radius;
16219           };
16220
16221           pack.size = function(x) {
16222             return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
16223           };
16224
16225           pack.padding = function(x) {
16226             return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding;
16227           };
16228
16229           return pack;
16230         }
16231
16232         function radiusLeaf(radius) {
16233           return function(node) {
16234             if (!node.children) {
16235               node.r = Math.max(0, +radius(node) || 0);
16236             }
16237           };
16238         }
16239
16240         function packChildren(padding, k) {
16241           return function(node) {
16242             if (children = node.children) {
16243               var children,
16244                   i,
16245                   n = children.length,
16246                   r = padding(node) * k || 0,
16247                   e;
16248
16249               if (r) for (i = 0; i < n; ++i) children[i].r += r;
16250               e = packEnclose(children);
16251               if (r) for (i = 0; i < n; ++i) children[i].r -= r;
16252               node.r = e + r;
16253             }
16254           };
16255         }
16256
16257         function translateChild(k) {
16258           return function(node) {
16259             var parent = node.parent;
16260             node.r *= k;
16261             if (parent) {
16262               node.x = parent.x + k * node.x;
16263               node.y = parent.y + k * node.y;
16264             }
16265           };
16266         }
16267
16268         function roundNode(node) {
16269           node.x0 = Math.round(node.x0);
16270           node.y0 = Math.round(node.y0);
16271           node.x1 = Math.round(node.x1);
16272           node.y1 = Math.round(node.y1);
16273         }
16274
16275         function treemapDice(parent, x0, y0, x1, y1) {
16276           var nodes = parent.children,
16277               node,
16278               i = -1,
16279               n = nodes.length,
16280               k = parent.value && (x1 - x0) / parent.value;
16281
16282           while (++i < n) {
16283             node = nodes[i], node.y0 = y0, node.y1 = y1;
16284             node.x0 = x0, node.x1 = x0 += node.value * k;
16285           }
16286         }
16287
16288         function partition() {
16289           var dx = 1,
16290               dy = 1,
16291               padding = 0,
16292               round = false;
16293
16294           function partition(root) {
16295             var n = root.height + 1;
16296             root.x0 =
16297             root.y0 = padding;
16298             root.x1 = dx;
16299             root.y1 = dy / n;
16300             root.eachBefore(positionNode(dy, n));
16301             if (round) root.eachBefore(roundNode);
16302             return root;
16303           }
16304
16305           function positionNode(dy, n) {
16306             return function(node) {
16307               if (node.children) {
16308                 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
16309               }
16310               var x0 = node.x0,
16311                   y0 = node.y0,
16312                   x1 = node.x1 - padding,
16313                   y1 = node.y1 - padding;
16314               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16315               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16316               node.x0 = x0;
16317               node.y0 = y0;
16318               node.x1 = x1;
16319               node.y1 = y1;
16320             };
16321           }
16322
16323           partition.round = function(x) {
16324             return arguments.length ? (round = !!x, partition) : round;
16325           };
16326
16327           partition.size = function(x) {
16328             return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
16329           };
16330
16331           partition.padding = function(x) {
16332             return arguments.length ? (padding = +x, partition) : padding;
16333           };
16334
16335           return partition;
16336         }
16337
16338         var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
16339             preroot = {depth: -1},
16340             ambiguous = {};
16341
16342         function defaultId(d) {
16343           return d.id;
16344         }
16345
16346         function defaultParentId(d) {
16347           return d.parentId;
16348         }
16349
16350         function stratify() {
16351           var id = defaultId,
16352               parentId = defaultParentId;
16353
16354           function stratify(data) {
16355             var d,
16356                 i,
16357                 n = data.length,
16358                 root,
16359                 parent,
16360                 node,
16361                 nodes = new Array(n),
16362                 nodeId,
16363                 nodeKey,
16364                 nodeByKey = {};
16365
16366             for (i = 0; i < n; ++i) {
16367               d = data[i], node = nodes[i] = new Node(d);
16368               if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
16369                 nodeKey = keyPrefix$1 + (node.id = nodeId);
16370                 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
16371               }
16372             }
16373
16374             for (i = 0; i < n; ++i) {
16375               node = nodes[i], nodeId = parentId(data[i], i, data);
16376               if (nodeId == null || !(nodeId += "")) {
16377                 if (root) throw new Error("multiple roots");
16378                 root = node;
16379               } else {
16380                 parent = nodeByKey[keyPrefix$1 + nodeId];
16381                 if (!parent) throw new Error("missing: " + nodeId);
16382                 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
16383                 if (parent.children) parent.children.push(node);
16384                 else parent.children = [node];
16385                 node.parent = parent;
16386               }
16387             }
16388
16389             if (!root) throw new Error("no root");
16390             root.parent = preroot;
16391             root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
16392             root.parent = null;
16393             if (n > 0) throw new Error("cycle");
16394
16395             return root;
16396           }
16397
16398           stratify.id = function(x) {
16399             return arguments.length ? (id = required(x), stratify) : id;
16400           };
16401
16402           stratify.parentId = function(x) {
16403             return arguments.length ? (parentId = required(x), stratify) : parentId;
16404           };
16405
16406           return stratify;
16407         }
16408
16409         function defaultSeparation$1(a, b) {
16410           return a.parent === b.parent ? 1 : 2;
16411         }
16412
16413         // function radialSeparation(a, b) {
16414         //   return (a.parent === b.parent ? 1 : 2) / a.depth;
16415         // }
16416
16417         // This function is used to traverse the left contour of a subtree (or
16418         // subforest). It returns the successor of v on this contour. This successor is
16419         // either given by the leftmost child of v or by the thread of v. The function
16420         // returns null if and only if v is on the highest level of its subtree.
16421         function nextLeft(v) {
16422           var children = v.children;
16423           return children ? children[0] : v.t;
16424         }
16425
16426         // This function works analogously to nextLeft.
16427         function nextRight(v) {
16428           var children = v.children;
16429           return children ? children[children.length - 1] : v.t;
16430         }
16431
16432         // Shifts the current subtree rooted at w+. This is done by increasing
16433         // prelim(w+) and mod(w+) by shift.
16434         function moveSubtree(wm, wp, shift) {
16435           var change = shift / (wp.i - wm.i);
16436           wp.c -= change;
16437           wp.s += shift;
16438           wm.c += change;
16439           wp.z += shift;
16440           wp.m += shift;
16441         }
16442
16443         // All other shifts, applied to the smaller subtrees between w- and w+, are
16444         // performed by this function. To prepare the shifts, we have to adjust
16445         // change(w+), shift(w+), and change(w-).
16446         function executeShifts(v) {
16447           var shift = 0,
16448               change = 0,
16449               children = v.children,
16450               i = children.length,
16451               w;
16452           while (--i >= 0) {
16453             w = children[i];
16454             w.z += shift;
16455             w.m += shift;
16456             shift += w.s + (change += w.c);
16457           }
16458         }
16459
16460         // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
16461         // returns the specified (default) ancestor.
16462         function nextAncestor(vim, v, ancestor) {
16463           return vim.a.parent === v.parent ? vim.a : ancestor;
16464         }
16465
16466         function TreeNode(node, i) {
16467           this._ = node;
16468           this.parent = null;
16469           this.children = null;
16470           this.A = null; // default ancestor
16471           this.a = this; // ancestor
16472           this.z = 0; // prelim
16473           this.m = 0; // mod
16474           this.c = 0; // change
16475           this.s = 0; // shift
16476           this.t = null; // thread
16477           this.i = i; // number
16478         }
16479
16480         TreeNode.prototype = Object.create(Node.prototype);
16481
16482         function treeRoot(root) {
16483           var tree = new TreeNode(root, 0),
16484               node,
16485               nodes = [tree],
16486               child,
16487               children,
16488               i,
16489               n;
16490
16491           while (node = nodes.pop()) {
16492             if (children = node._.children) {
16493               node.children = new Array(n = children.length);
16494               for (i = n - 1; i >= 0; --i) {
16495                 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
16496                 child.parent = node;
16497               }
16498             }
16499           }
16500
16501           (tree.parent = new TreeNode(null, 0)).children = [tree];
16502           return tree;
16503         }
16504
16505         // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
16506         function tree() {
16507           var separation = defaultSeparation$1,
16508               dx = 1,
16509               dy = 1,
16510               nodeSize = null;
16511
16512           function tree(root) {
16513             var t = treeRoot(root);
16514
16515             // Compute the layout using Buchheim et al.’s algorithm.
16516             t.eachAfter(firstWalk), t.parent.m = -t.z;
16517             t.eachBefore(secondWalk);
16518
16519             // If a fixed node size is specified, scale x and y.
16520             if (nodeSize) root.eachBefore(sizeNode);
16521
16522             // If a fixed tree size is specified, scale x and y based on the extent.
16523             // Compute the left-most, right-most, and depth-most nodes for extents.
16524             else {
16525               var left = root,
16526                   right = root,
16527                   bottom = root;
16528               root.eachBefore(function(node) {
16529                 if (node.x < left.x) left = node;
16530                 if (node.x > right.x) right = node;
16531                 if (node.depth > bottom.depth) bottom = node;
16532               });
16533               var s = left === right ? 1 : separation(left, right) / 2,
16534                   tx = s - left.x,
16535                   kx = dx / (right.x + s + tx),
16536                   ky = dy / (bottom.depth || 1);
16537               root.eachBefore(function(node) {
16538                 node.x = (node.x + tx) * kx;
16539                 node.y = node.depth * ky;
16540               });
16541             }
16542
16543             return root;
16544           }
16545
16546           // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
16547           // applied recursively to the children of v, as well as the function
16548           // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
16549           // node v is placed to the midpoint of its outermost children.
16550           function firstWalk(v) {
16551             var children = v.children,
16552                 siblings = v.parent.children,
16553                 w = v.i ? siblings[v.i - 1] : null;
16554             if (children) {
16555               executeShifts(v);
16556               var midpoint = (children[0].z + children[children.length - 1].z) / 2;
16557               if (w) {
16558                 v.z = w.z + separation(v._, w._);
16559                 v.m = v.z - midpoint;
16560               } else {
16561                 v.z = midpoint;
16562               }
16563             } else if (w) {
16564               v.z = w.z + separation(v._, w._);
16565             }
16566             v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
16567           }
16568
16569           // Computes all real x-coordinates by summing up the modifiers recursively.
16570           function secondWalk(v) {
16571             v._.x = v.z + v.parent.m;
16572             v.m += v.parent.m;
16573           }
16574
16575           // The core of the algorithm. Here, a new subtree is combined with the
16576           // previous subtrees. Threads are used to traverse the inside and outside
16577           // contours of the left and right subtree up to the highest common level. The
16578           // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
16579           // superscript o means outside and i means inside, the subscript - means left
16580           // subtree and + means right subtree. For summing up the modifiers along the
16581           // contour, we use respective variables si+, si-, so-, and so+. Whenever two
16582           // nodes of the inside contours conflict, we compute the left one of the
16583           // greatest uncommon ancestors using the function ANCESTOR and call MOVE
16584           // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
16585           // Finally, we add a new thread (if necessary).
16586           function apportion(v, w, ancestor) {
16587             if (w) {
16588               var vip = v,
16589                   vop = v,
16590                   vim = w,
16591                   vom = vip.parent.children[0],
16592                   sip = vip.m,
16593                   sop = vop.m,
16594                   sim = vim.m,
16595                   som = vom.m,
16596                   shift;
16597               while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
16598                 vom = nextLeft(vom);
16599                 vop = nextRight(vop);
16600                 vop.a = v;
16601                 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
16602                 if (shift > 0) {
16603                   moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
16604                   sip += shift;
16605                   sop += shift;
16606                 }
16607                 sim += vim.m;
16608                 sip += vip.m;
16609                 som += vom.m;
16610                 sop += vop.m;
16611               }
16612               if (vim && !nextRight(vop)) {
16613                 vop.t = vim;
16614                 vop.m += sim - sop;
16615               }
16616               if (vip && !nextLeft(vom)) {
16617                 vom.t = vip;
16618                 vom.m += sip - som;
16619                 ancestor = v;
16620               }
16621             }
16622             return ancestor;
16623           }
16624
16625           function sizeNode(node) {
16626             node.x *= dx;
16627             node.y = node.depth * dy;
16628           }
16629
16630           tree.separation = function(x) {
16631             return arguments.length ? (separation = x, tree) : separation;
16632           };
16633
16634           tree.size = function(x) {
16635             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
16636           };
16637
16638           tree.nodeSize = function(x) {
16639             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
16640           };
16641
16642           return tree;
16643         }
16644
16645         function treemapSlice(parent, x0, y0, x1, y1) {
16646           var nodes = parent.children,
16647               node,
16648               i = -1,
16649               n = nodes.length,
16650               k = parent.value && (y1 - y0) / parent.value;
16651
16652           while (++i < n) {
16653             node = nodes[i], node.x0 = x0, node.x1 = x1;
16654             node.y0 = y0, node.y1 = y0 += node.value * k;
16655           }
16656         }
16657
16658         var phi = (1 + Math.sqrt(5)) / 2;
16659
16660         function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
16661           var rows = [],
16662               nodes = parent.children,
16663               row,
16664               nodeValue,
16665               i0 = 0,
16666               i1 = 0,
16667               n = nodes.length,
16668               dx, dy,
16669               value = parent.value,
16670               sumValue,
16671               minValue,
16672               maxValue,
16673               newRatio,
16674               minRatio,
16675               alpha,
16676               beta;
16677
16678           while (i0 < n) {
16679             dx = x1 - x0, dy = y1 - y0;
16680
16681             // Find the next non-empty node.
16682             do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
16683             minValue = maxValue = sumValue;
16684             alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
16685             beta = sumValue * sumValue * alpha;
16686             minRatio = Math.max(maxValue / beta, beta / minValue);
16687
16688             // Keep adding nodes while the aspect ratio maintains or improves.
16689             for (; i1 < n; ++i1) {
16690               sumValue += nodeValue = nodes[i1].value;
16691               if (nodeValue < minValue) minValue = nodeValue;
16692               if (nodeValue > maxValue) maxValue = nodeValue;
16693               beta = sumValue * sumValue * alpha;
16694               newRatio = Math.max(maxValue / beta, beta / minValue);
16695               if (newRatio > minRatio) { sumValue -= nodeValue; break; }
16696               minRatio = newRatio;
16697             }
16698
16699             // Position and record the row orientation.
16700             rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
16701             if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
16702             else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
16703             value -= sumValue, i0 = i1;
16704           }
16705
16706           return rows;
16707         }
16708
16709         var squarify = (function custom(ratio) {
16710
16711           function squarify(parent, x0, y0, x1, y1) {
16712             squarifyRatio(ratio, parent, x0, y0, x1, y1);
16713           }
16714
16715           squarify.ratio = function(x) {
16716             return custom((x = +x) > 1 ? x : 1);
16717           };
16718
16719           return squarify;
16720         })(phi);
16721
16722         function index$2() {
16723           var tile = squarify,
16724               round = false,
16725               dx = 1,
16726               dy = 1,
16727               paddingStack = [0],
16728               paddingInner = constantZero,
16729               paddingTop = constantZero,
16730               paddingRight = constantZero,
16731               paddingBottom = constantZero,
16732               paddingLeft = constantZero;
16733
16734           function treemap(root) {
16735             root.x0 =
16736             root.y0 = 0;
16737             root.x1 = dx;
16738             root.y1 = dy;
16739             root.eachBefore(positionNode);
16740             paddingStack = [0];
16741             if (round) root.eachBefore(roundNode);
16742             return root;
16743           }
16744
16745           function positionNode(node) {
16746             var p = paddingStack[node.depth],
16747                 x0 = node.x0 + p,
16748                 y0 = node.y0 + p,
16749                 x1 = node.x1 - p,
16750                 y1 = node.y1 - p;
16751             if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16752             if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16753             node.x0 = x0;
16754             node.y0 = y0;
16755             node.x1 = x1;
16756             node.y1 = y1;
16757             if (node.children) {
16758               p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
16759               x0 += paddingLeft(node) - p;
16760               y0 += paddingTop(node) - p;
16761               x1 -= paddingRight(node) - p;
16762               y1 -= paddingBottom(node) - p;
16763               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16764               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16765               tile(node, x0, y0, x1, y1);
16766             }
16767           }
16768
16769           treemap.round = function(x) {
16770             return arguments.length ? (round = !!x, treemap) : round;
16771           };
16772
16773           treemap.size = function(x) {
16774             return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
16775           };
16776
16777           treemap.tile = function(x) {
16778             return arguments.length ? (tile = required(x), treemap) : tile;
16779           };
16780
16781           treemap.padding = function(x) {
16782             return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
16783           };
16784
16785           treemap.paddingInner = function(x) {
16786             return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner;
16787           };
16788
16789           treemap.paddingOuter = function(x) {
16790             return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
16791           };
16792
16793           treemap.paddingTop = function(x) {
16794             return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop;
16795           };
16796
16797           treemap.paddingRight = function(x) {
16798             return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight;
16799           };
16800
16801           treemap.paddingBottom = function(x) {
16802             return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom;
16803           };
16804
16805           treemap.paddingLeft = function(x) {
16806             return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft;
16807           };
16808
16809           return treemap;
16810         }
16811
16812         function binary(parent, x0, y0, x1, y1) {
16813           var nodes = parent.children,
16814               i, n = nodes.length,
16815               sum, sums = new Array(n + 1);
16816
16817           for (sums[0] = sum = i = 0; i < n; ++i) {
16818             sums[i + 1] = sum += nodes[i].value;
16819           }
16820
16821           partition(0, n, parent.value, x0, y0, x1, y1);
16822
16823           function partition(i, j, value, x0, y0, x1, y1) {
16824             if (i >= j - 1) {
16825               var node = nodes[i];
16826               node.x0 = x0, node.y0 = y0;
16827               node.x1 = x1, node.y1 = y1;
16828               return;
16829             }
16830
16831             var valueOffset = sums[i],
16832                 valueTarget = (value / 2) + valueOffset,
16833                 k = i + 1,
16834                 hi = j - 1;
16835
16836             while (k < hi) {
16837               var mid = k + hi >>> 1;
16838               if (sums[mid] < valueTarget) k = mid + 1;
16839               else hi = mid;
16840             }
16841
16842             if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
16843
16844             var valueLeft = sums[k] - valueOffset,
16845                 valueRight = value - valueLeft;
16846
16847             if ((x1 - x0) > (y1 - y0)) {
16848               var xk = (x0 * valueRight + x1 * valueLeft) / value;
16849               partition(i, k, valueLeft, x0, y0, xk, y1);
16850               partition(k, j, valueRight, xk, y0, x1, y1);
16851             } else {
16852               var yk = (y0 * valueRight + y1 * valueLeft) / value;
16853               partition(i, k, valueLeft, x0, y0, x1, yk);
16854               partition(k, j, valueRight, x0, yk, x1, y1);
16855             }
16856           }
16857         }
16858
16859         function sliceDice(parent, x0, y0, x1, y1) {
16860           (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
16861         }
16862
16863         var resquarify = (function custom(ratio) {
16864
16865           function resquarify(parent, x0, y0, x1, y1) {
16866             if ((rows = parent._squarify) && (rows.ratio === ratio)) {
16867               var rows,
16868                   row,
16869                   nodes,
16870                   i,
16871                   j = -1,
16872                   n,
16873                   m = rows.length,
16874                   value = parent.value;
16875
16876               while (++j < m) {
16877                 row = rows[j], nodes = row.children;
16878                 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
16879                 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
16880                 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
16881                 value -= row.value;
16882               }
16883             } else {
16884               parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
16885               rows.ratio = ratio;
16886             }
16887           }
16888
16889           resquarify.ratio = function(x) {
16890             return custom((x = +x) > 1 ? x : 1);
16891           };
16892
16893           return resquarify;
16894         })(phi);
16895
16896         function d3_polygonArea(polygon) {
16897           var i = -1,
16898               n = polygon.length,
16899               a,
16900               b = polygon[n - 1],
16901               area = 0;
16902
16903           while (++i < n) {
16904             a = b;
16905             b = polygon[i];
16906             area += a[1] * b[0] - a[0] * b[1];
16907           }
16908
16909           return area / 2;
16910         }
16911
16912         function d3_polygonCentroid(polygon) {
16913           var i = -1,
16914               n = polygon.length,
16915               x = 0,
16916               y = 0,
16917               a,
16918               b = polygon[n - 1],
16919               c,
16920               k = 0;
16921
16922           while (++i < n) {
16923             a = b;
16924             b = polygon[i];
16925             k += c = a[0] * b[1] - b[0] * a[1];
16926             x += (a[0] + b[0]) * c;
16927             y += (a[1] + b[1]) * c;
16928           }
16929
16930           return k *= 3, [x / k, y / k];
16931         }
16932
16933         // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
16934         // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
16935         // right, +y is up). Returns a positive value if ABC is counter-clockwise,
16936         // negative if clockwise, and zero if the points are collinear.
16937         function cross$1(a, b, c) {
16938           return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
16939         }
16940
16941         function lexicographicOrder(a, b) {
16942           return a[0] - b[0] || a[1] - b[1];
16943         }
16944
16945         // Computes the upper convex hull per the monotone chain algorithm.
16946         // Assumes points.length >= 3, is sorted by x, unique in y.
16947         // Returns an array of indices into points in left-to-right order.
16948         function computeUpperHullIndexes(points) {
16949           var n = points.length,
16950               indexes = [0, 1],
16951               size = 2;
16952
16953           for (var i = 2; i < n; ++i) {
16954             while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
16955             indexes[size++] = i;
16956           }
16957
16958           return indexes.slice(0, size); // remove popped points
16959         }
16960
16961         function d3_polygonHull(points) {
16962           if ((n = points.length) < 3) return null;
16963
16964           var i,
16965               n,
16966               sortedPoints = new Array(n),
16967               flippedPoints = new Array(n);
16968
16969           for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
16970           sortedPoints.sort(lexicographicOrder);
16971           for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
16972
16973           var upperIndexes = computeUpperHullIndexes(sortedPoints),
16974               lowerIndexes = computeUpperHullIndexes(flippedPoints);
16975
16976           // Construct the hull polygon, removing possible duplicate endpoints.
16977           var skipLeft = lowerIndexes[0] === upperIndexes[0],
16978               skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
16979               hull = [];
16980
16981           // Add upper hull in right-to-l order.
16982           // Then add lower hull in left-to-right order.
16983           for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
16984           for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
16985
16986           return hull;
16987         }
16988
16989         function contains$3(polygon, point) {
16990           var n = polygon.length,
16991               p = polygon[n - 1],
16992               x = point[0], y = point[1],
16993               x0 = p[0], y0 = p[1],
16994               x1, y1,
16995               inside = false;
16996
16997           for (var i = 0; i < n; ++i) {
16998             p = polygon[i], x1 = p[0], y1 = p[1];
16999             if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
17000             x0 = x1, y0 = y1;
17001           }
17002
17003           return inside;
17004         }
17005
17006         function length$1(polygon) {
17007           var i = -1,
17008               n = polygon.length,
17009               b = polygon[n - 1],
17010               xa,
17011               ya,
17012               xb = b[0],
17013               yb = b[1],
17014               perimeter = 0;
17015
17016           while (++i < n) {
17017             xa = xb;
17018             ya = yb;
17019             b = polygon[i];
17020             xb = b[0];
17021             yb = b[1];
17022             xa -= xb;
17023             ya -= yb;
17024             perimeter += Math.sqrt(xa * xa + ya * ya);
17025           }
17026
17027           return perimeter;
17028         }
17029
17030         function defaultSource$1() {
17031           return Math.random();
17032         }
17033
17034         var uniform = (function sourceRandomUniform(source) {
17035           function randomUniform(min, max) {
17036             min = min == null ? 0 : +min;
17037             max = max == null ? 1 : +max;
17038             if (arguments.length === 1) max = min, min = 0;
17039             else max -= min;
17040             return function() {
17041               return source() * max + min;
17042             };
17043           }
17044
17045           randomUniform.source = sourceRandomUniform;
17046
17047           return randomUniform;
17048         })(defaultSource$1);
17049
17050         var normal = (function sourceRandomNormal(source) {
17051           function randomNormal(mu, sigma) {
17052             var x, r;
17053             mu = mu == null ? 0 : +mu;
17054             sigma = sigma == null ? 1 : +sigma;
17055             return function() {
17056               var y;
17057
17058               // If available, use the second previously-generated uniform random.
17059               if (x != null) y = x, x = null;
17060
17061               // Otherwise, generate a new x and y.
17062               else do {
17063                 x = source() * 2 - 1;
17064                 y = source() * 2 - 1;
17065                 r = x * x + y * y;
17066               } while (!r || r > 1);
17067
17068               return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
17069             };
17070           }
17071
17072           randomNormal.source = sourceRandomNormal;
17073
17074           return randomNormal;
17075         })(defaultSource$1);
17076
17077         var logNormal = (function sourceRandomLogNormal(source) {
17078           function randomLogNormal() {
17079             var randomNormal = normal.source(source).apply(this, arguments);
17080             return function() {
17081               return Math.exp(randomNormal());
17082             };
17083           }
17084
17085           randomLogNormal.source = sourceRandomLogNormal;
17086
17087           return randomLogNormal;
17088         })(defaultSource$1);
17089
17090         var irwinHall = (function sourceRandomIrwinHall(source) {
17091           function randomIrwinHall(n) {
17092             return function() {
17093               for (var sum = 0, i = 0; i < n; ++i) sum += source();
17094               return sum;
17095             };
17096           }
17097
17098           randomIrwinHall.source = sourceRandomIrwinHall;
17099
17100           return randomIrwinHall;
17101         })(defaultSource$1);
17102
17103         var bates = (function sourceRandomBates(source) {
17104           function randomBates(n) {
17105             var randomIrwinHall = irwinHall.source(source)(n);
17106             return function() {
17107               return randomIrwinHall() / n;
17108             };
17109           }
17110
17111           randomBates.source = sourceRandomBates;
17112
17113           return randomBates;
17114         })(defaultSource$1);
17115
17116         var exponential$1 = (function sourceRandomExponential(source) {
17117           function randomExponential(lambda) {
17118             return function() {
17119               return -Math.log(1 - source()) / lambda;
17120             };
17121           }
17122
17123           randomExponential.source = sourceRandomExponential;
17124
17125           return randomExponential;
17126         })(defaultSource$1);
17127
17128         function initRange(domain, range) {
17129           switch (arguments.length) {
17130             case 0: break;
17131             case 1: this.range(domain); break;
17132             default: this.range(range).domain(domain); break;
17133           }
17134           return this;
17135         }
17136
17137         function initInterpolator(domain, interpolator) {
17138           switch (arguments.length) {
17139             case 0: break;
17140             case 1: this.interpolator(domain); break;
17141             default: this.interpolator(interpolator).domain(domain); break;
17142           }
17143           return this;
17144         }
17145
17146         var array$4 = Array.prototype;
17147
17148         var map$4 = array$4.map;
17149         var slice$9 = array$4.slice;
17150
17151         var implicit = {name: "implicit"};
17152
17153         function ordinal() {
17154           var index = map$3(),
17155               domain = [],
17156               range = [],
17157               unknown = implicit;
17158
17159           function scale(d) {
17160             var key = d + "", i = index.get(key);
17161             if (!i) {
17162               if (unknown !== implicit) return unknown;
17163               index.set(key, i = domain.push(d));
17164             }
17165             return range[(i - 1) % range.length];
17166           }
17167
17168           scale.domain = function(_) {
17169             if (!arguments.length) return domain.slice();
17170             domain = [], index = map$3();
17171             var i = -1, n = _.length, d, key;
17172             while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
17173             return scale;
17174           };
17175
17176           scale.range = function(_) {
17177             return arguments.length ? (range = slice$9.call(_), scale) : range.slice();
17178           };
17179
17180           scale.unknown = function(_) {
17181             return arguments.length ? (unknown = _, scale) : unknown;
17182           };
17183
17184           scale.copy = function() {
17185             return ordinal(domain, range).unknown(unknown);
17186           };
17187
17188           initRange.apply(scale, arguments);
17189
17190           return scale;
17191         }
17192
17193         function band() {
17194           var scale = ordinal().unknown(undefined),
17195               domain = scale.domain,
17196               ordinalRange = scale.range,
17197               range = [0, 1],
17198               step,
17199               bandwidth,
17200               round = false,
17201               paddingInner = 0,
17202               paddingOuter = 0,
17203               align = 0.5;
17204
17205           delete scale.unknown;
17206
17207           function rescale() {
17208             var n = domain().length,
17209                 reverse = range[1] < range[0],
17210                 start = range[reverse - 0],
17211                 stop = range[1 - reverse];
17212             step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
17213             if (round) step = Math.floor(step);
17214             start += (stop - start - step * (n - paddingInner)) * align;
17215             bandwidth = step * (1 - paddingInner);
17216             if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
17217             var values = d3_range(n).map(function(i) { return start + step * i; });
17218             return ordinalRange(reverse ? values.reverse() : values);
17219           }
17220
17221           scale.domain = function(_) {
17222             return arguments.length ? (domain(_), rescale()) : domain();
17223           };
17224
17225           scale.range = function(_) {
17226             return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
17227           };
17228
17229           scale.rangeRound = function(_) {
17230             return range = [+_[0], +_[1]], round = true, rescale();
17231           };
17232
17233           scale.bandwidth = function() {
17234             return bandwidth;
17235           };
17236
17237           scale.step = function() {
17238             return step;
17239           };
17240
17241           scale.round = function(_) {
17242             return arguments.length ? (round = !!_, rescale()) : round;
17243           };
17244
17245           scale.padding = function(_) {
17246             return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
17247           };
17248
17249           scale.paddingInner = function(_) {
17250             return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
17251           };
17252
17253           scale.paddingOuter = function(_) {
17254             return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
17255           };
17256
17257           scale.align = function(_) {
17258             return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
17259           };
17260
17261           scale.copy = function() {
17262             return band(domain(), range)
17263                 .round(round)
17264                 .paddingInner(paddingInner)
17265                 .paddingOuter(paddingOuter)
17266                 .align(align);
17267           };
17268
17269           return initRange.apply(rescale(), arguments);
17270         }
17271
17272         function pointish(scale) {
17273           var copy = scale.copy;
17274
17275           scale.padding = scale.paddingOuter;
17276           delete scale.paddingInner;
17277           delete scale.paddingOuter;
17278
17279           scale.copy = function() {
17280             return pointish(copy());
17281           };
17282
17283           return scale;
17284         }
17285
17286         function point$1() {
17287           return pointish(band.apply(null, arguments).paddingInner(1));
17288         }
17289
17290         function constant$a(x) {
17291           return function() {
17292             return x;
17293           };
17294         }
17295
17296         function number$2(x) {
17297           return +x;
17298         }
17299
17300         var unit = [0, 1];
17301
17302         function identity$5(x) {
17303           return x;
17304         }
17305
17306         function normalize(a, b) {
17307           return (b -= (a = +a))
17308               ? function(x) { return (x - a) / b; }
17309               : constant$a(isNaN(b) ? NaN : 0.5);
17310         }
17311
17312         function clamper(domain) {
17313           var a = domain[0], b = domain[domain.length - 1], t;
17314           if (a > b) t = a, a = b, b = t;
17315           return function(x) { return Math.max(a, Math.min(b, x)); };
17316         }
17317
17318         // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
17319         // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
17320         function bimap(domain, range, interpolate) {
17321           var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
17322           if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
17323           else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
17324           return function(x) { return r0(d0(x)); };
17325         }
17326
17327         function polymap(domain, range, interpolate) {
17328           var j = Math.min(domain.length, range.length) - 1,
17329               d = new Array(j),
17330               r = new Array(j),
17331               i = -1;
17332
17333           // Reverse descending domains.
17334           if (domain[j] < domain[0]) {
17335             domain = domain.slice().reverse();
17336             range = range.slice().reverse();
17337           }
17338
17339           while (++i < j) {
17340             d[i] = normalize(domain[i], domain[i + 1]);
17341             r[i] = interpolate(range[i], range[i + 1]);
17342           }
17343
17344           return function(x) {
17345             var i = bisectRight(domain, x, 1, j) - 1;
17346             return r[i](d[i](x));
17347           };
17348         }
17349
17350         function copy$1(source, target) {
17351           return target
17352               .domain(source.domain())
17353               .range(source.range())
17354               .interpolate(source.interpolate())
17355               .clamp(source.clamp())
17356               .unknown(source.unknown());
17357         }
17358
17359         function transformer$1() {
17360           var domain = unit,
17361               range = unit,
17362               interpolate = d3_interpolate,
17363               transform,
17364               untransform,
17365               unknown,
17366               clamp = identity$5,
17367               piecewise,
17368               output,
17369               input;
17370
17371           function rescale() {
17372             piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
17373             output = input = null;
17374             return scale;
17375           }
17376
17377           function scale(x) {
17378             return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
17379           }
17380
17381           scale.invert = function(y) {
17382             return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
17383           };
17384
17385           scale.domain = function(_) {
17386             return arguments.length ? (domain = map$4.call(_, number$2), clamp === identity$5 || (clamp = clamper(domain)), rescale()) : domain.slice();
17387           };
17388
17389           scale.range = function(_) {
17390             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17391           };
17392
17393           scale.rangeRound = function(_) {
17394             return range = slice$9.call(_), interpolate = interpolateRound, rescale();
17395           };
17396
17397           scale.clamp = function(_) {
17398             return arguments.length ? (clamp = _ ? clamper(domain) : identity$5, scale) : clamp !== identity$5;
17399           };
17400
17401           scale.interpolate = function(_) {
17402             return arguments.length ? (interpolate = _, rescale()) : interpolate;
17403           };
17404
17405           scale.unknown = function(_) {
17406             return arguments.length ? (unknown = _, scale) : unknown;
17407           };
17408
17409           return function(t, u) {
17410             transform = t, untransform = u;
17411             return rescale();
17412           };
17413         }
17414
17415         function continuous(transform, untransform) {
17416           return transformer$1()(transform, untransform);
17417         }
17418
17419         function tickFormat(start, stop, count, specifier) {
17420           var step = tickStep(start, stop, count),
17421               precision;
17422           specifier = formatSpecifier(specifier == null ? ",f" : specifier);
17423           switch (specifier.type) {
17424             case "s": {
17425               var value = Math.max(Math.abs(start), Math.abs(stop));
17426               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
17427               return formatPrefix(specifier, value);
17428             }
17429             case "":
17430             case "e":
17431             case "g":
17432             case "p":
17433             case "r": {
17434               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
17435               break;
17436             }
17437             case "f":
17438             case "%": {
17439               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
17440               break;
17441             }
17442           }
17443           return format(specifier);
17444         }
17445
17446         function linearish(scale) {
17447           var domain = scale.domain;
17448
17449           scale.ticks = function(count) {
17450             var d = domain();
17451             return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
17452           };
17453
17454           scale.tickFormat = function(count, specifier) {
17455             var d = domain();
17456             return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
17457           };
17458
17459           scale.nice = function(count) {
17460             if (count == null) count = 10;
17461
17462             var d = domain(),
17463                 i0 = 0,
17464                 i1 = d.length - 1,
17465                 start = d[i0],
17466                 stop = d[i1],
17467                 step;
17468
17469             if (stop < start) {
17470               step = start, start = stop, stop = step;
17471               step = i0, i0 = i1, i1 = step;
17472             }
17473
17474             step = tickIncrement(start, stop, count);
17475
17476             if (step > 0) {
17477               start = Math.floor(start / step) * step;
17478               stop = Math.ceil(stop / step) * step;
17479               step = tickIncrement(start, stop, count);
17480             } else if (step < 0) {
17481               start = Math.ceil(start * step) / step;
17482               stop = Math.floor(stop * step) / step;
17483               step = tickIncrement(start, stop, count);
17484             }
17485
17486             if (step > 0) {
17487               d[i0] = Math.floor(start / step) * step;
17488               d[i1] = Math.ceil(stop / step) * step;
17489               domain(d);
17490             } else if (step < 0) {
17491               d[i0] = Math.ceil(start * step) / step;
17492               d[i1] = Math.floor(stop * step) / step;
17493               domain(d);
17494             }
17495
17496             return scale;
17497           };
17498
17499           return scale;
17500         }
17501
17502         function linear$2() {
17503           var scale = continuous(identity$5, identity$5);
17504
17505           scale.copy = function() {
17506             return copy$1(scale, linear$2());
17507           };
17508
17509           initRange.apply(scale, arguments);
17510
17511           return linearish(scale);
17512         }
17513
17514         function identity$6(domain) {
17515           var unknown;
17516
17517           function scale(x) {
17518             return isNaN(x = +x) ? unknown : x;
17519           }
17520
17521           scale.invert = scale;
17522
17523           scale.domain = scale.range = function(_) {
17524             return arguments.length ? (domain = map$4.call(_, number$2), scale) : domain.slice();
17525           };
17526
17527           scale.unknown = function(_) {
17528             return arguments.length ? (unknown = _, scale) : unknown;
17529           };
17530
17531           scale.copy = function() {
17532             return identity$6(domain).unknown(unknown);
17533           };
17534
17535           domain = arguments.length ? map$4.call(domain, number$2) : [0, 1];
17536
17537           return linearish(scale);
17538         }
17539
17540         function nice(domain, interval) {
17541           domain = domain.slice();
17542
17543           var i0 = 0,
17544               i1 = domain.length - 1,
17545               x0 = domain[i0],
17546               x1 = domain[i1],
17547               t;
17548
17549           if (x1 < x0) {
17550             t = i0, i0 = i1, i1 = t;
17551             t = x0, x0 = x1, x1 = t;
17552           }
17553
17554           domain[i0] = interval.floor(x0);
17555           domain[i1] = interval.ceil(x1);
17556           return domain;
17557         }
17558
17559         function transformLog(x) {
17560           return Math.log(x);
17561         }
17562
17563         function transformExp(x) {
17564           return Math.exp(x);
17565         }
17566
17567         function transformLogn(x) {
17568           return -Math.log(-x);
17569         }
17570
17571         function transformExpn(x) {
17572           return -Math.exp(-x);
17573         }
17574
17575         function pow10(x) {
17576           return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
17577         }
17578
17579         function powp(base) {
17580           return base === 10 ? pow10
17581               : base === Math.E ? Math.exp
17582               : function(x) { return Math.pow(base, x); };
17583         }
17584
17585         function logp(base) {
17586           return base === Math.E ? Math.log
17587               : base === 10 && Math.log10
17588               || base === 2 && Math.log2
17589               || (base = Math.log(base), function(x) { return Math.log(x) / base; });
17590         }
17591
17592         function reflect(f) {
17593           return function(x) {
17594             return -f(-x);
17595           };
17596         }
17597
17598         function loggish(transform) {
17599           var scale = transform(transformLog, transformExp),
17600               domain = scale.domain,
17601               base = 10,
17602               logs,
17603               pows;
17604
17605           function rescale() {
17606             logs = logp(base), pows = powp(base);
17607             if (domain()[0] < 0) {
17608               logs = reflect(logs), pows = reflect(pows);
17609               transform(transformLogn, transformExpn);
17610             } else {
17611               transform(transformLog, transformExp);
17612             }
17613             return scale;
17614           }
17615
17616           scale.base = function(_) {
17617             return arguments.length ? (base = +_, rescale()) : base;
17618           };
17619
17620           scale.domain = function(_) {
17621             return arguments.length ? (domain(_), rescale()) : domain();
17622           };
17623
17624           scale.ticks = function(count) {
17625             var d = domain(),
17626                 u = d[0],
17627                 v = d[d.length - 1],
17628                 r;
17629
17630             if (r = v < u) i = u, u = v, v = i;
17631
17632             var i = logs(u),
17633                 j = logs(v),
17634                 p,
17635                 k,
17636                 t,
17637                 n = count == null ? 10 : +count,
17638                 z = [];
17639
17640             if (!(base % 1) && j - i < n) {
17641               i = Math.round(i) - 1, j = Math.round(j) + 1;
17642               if (u > 0) for (; i < j; ++i) {
17643                 for (k = 1, p = pows(i); k < base; ++k) {
17644                   t = p * k;
17645                   if (t < u) continue;
17646                   if (t > v) break;
17647                   z.push(t);
17648                 }
17649               } else for (; i < j; ++i) {
17650                 for (k = base - 1, p = pows(i); k >= 1; --k) {
17651                   t = p * k;
17652                   if (t < u) continue;
17653                   if (t > v) break;
17654                   z.push(t);
17655                 }
17656               }
17657             } else {
17658               z = ticks(i, j, Math.min(j - i, n)).map(pows);
17659             }
17660
17661             return r ? z.reverse() : z;
17662           };
17663
17664           scale.tickFormat = function(count, specifier) {
17665             if (specifier == null) specifier = base === 10 ? ".0e" : ",";
17666             if (typeof specifier !== "function") specifier = format(specifier);
17667             if (count === Infinity) return specifier;
17668             if (count == null) count = 10;
17669             var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
17670             return function(d) {
17671               var i = d / pows(Math.round(logs(d)));
17672               if (i * base < base - 0.5) i *= base;
17673               return i <= k ? specifier(d) : "";
17674             };
17675           };
17676
17677           scale.nice = function() {
17678             return domain(nice(domain(), {
17679               floor: function(x) { return pows(Math.floor(logs(x))); },
17680               ceil: function(x) { return pows(Math.ceil(logs(x))); }
17681             }));
17682           };
17683
17684           return scale;
17685         }
17686
17687         function log$1() {
17688           var scale = loggish(transformer$1()).domain([1, 10]);
17689
17690           scale.copy = function() {
17691             return copy$1(scale, log$1()).base(scale.base());
17692           };
17693
17694           initRange.apply(scale, arguments);
17695
17696           return scale;
17697         }
17698
17699         function transformSymlog(c) {
17700           return function(x) {
17701             return Math.sign(x) * Math.log1p(Math.abs(x / c));
17702           };
17703         }
17704
17705         function transformSymexp(c) {
17706           return function(x) {
17707             return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
17708           };
17709         }
17710
17711         function symlogish(transform) {
17712           var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
17713
17714           scale.constant = function(_) {
17715             return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
17716           };
17717
17718           return linearish(scale);
17719         }
17720
17721         function symlog() {
17722           var scale = symlogish(transformer$1());
17723
17724           scale.copy = function() {
17725             return copy$1(scale, symlog()).constant(scale.constant());
17726           };
17727
17728           return initRange.apply(scale, arguments);
17729         }
17730
17731         function transformPow(exponent) {
17732           return function(x) {
17733             return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
17734           };
17735         }
17736
17737         function transformSqrt(x) {
17738           return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
17739         }
17740
17741         function transformSquare(x) {
17742           return x < 0 ? -x * x : x * x;
17743         }
17744
17745         function powish(transform) {
17746           var scale = transform(identity$5, identity$5),
17747               exponent = 1;
17748
17749           function rescale() {
17750             return exponent === 1 ? transform(identity$5, identity$5)
17751                 : exponent === 0.5 ? transform(transformSqrt, transformSquare)
17752                 : transform(transformPow(exponent), transformPow(1 / exponent));
17753           }
17754
17755           scale.exponent = function(_) {
17756             return arguments.length ? (exponent = +_, rescale()) : exponent;
17757           };
17758
17759           return linearish(scale);
17760         }
17761
17762         function pow$1() {
17763           var scale = powish(transformer$1());
17764
17765           scale.copy = function() {
17766             return copy$1(scale, pow$1()).exponent(scale.exponent());
17767           };
17768
17769           initRange.apply(scale, arguments);
17770
17771           return scale;
17772         }
17773
17774         function sqrt$1() {
17775           return pow$1.apply(null, arguments).exponent(0.5);
17776         }
17777
17778         function quantile() {
17779           var domain = [],
17780               range = [],
17781               thresholds = [],
17782               unknown;
17783
17784           function rescale() {
17785             var i = 0, n = Math.max(1, range.length);
17786             thresholds = new Array(n - 1);
17787             while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
17788             return scale;
17789           }
17790
17791           function scale(x) {
17792             return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
17793           }
17794
17795           scale.invertExtent = function(y) {
17796             var i = range.indexOf(y);
17797             return i < 0 ? [NaN, NaN] : [
17798               i > 0 ? thresholds[i - 1] : domain[0],
17799               i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
17800             ];
17801           };
17802
17803           scale.domain = function(_) {
17804             if (!arguments.length) return domain.slice();
17805             domain = [];
17806             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
17807             domain.sort(d3_ascending);
17808             return rescale();
17809           };
17810
17811           scale.range = function(_) {
17812             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17813           };
17814
17815           scale.unknown = function(_) {
17816             return arguments.length ? (unknown = _, scale) : unknown;
17817           };
17818
17819           scale.quantiles = function() {
17820             return thresholds.slice();
17821           };
17822
17823           scale.copy = function() {
17824             return quantile()
17825                 .domain(domain)
17826                 .range(range)
17827                 .unknown(unknown);
17828           };
17829
17830           return initRange.apply(scale, arguments);
17831         }
17832
17833         function quantize() {
17834           var x0 = 0,
17835               x1 = 1,
17836               n = 1,
17837               domain = [0.5],
17838               range = [0, 1],
17839               unknown;
17840
17841           function scale(x) {
17842             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17843           }
17844
17845           function rescale() {
17846             var i = -1;
17847             domain = new Array(n);
17848             while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
17849             return scale;
17850           }
17851
17852           scale.domain = function(_) {
17853             return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
17854           };
17855
17856           scale.range = function(_) {
17857             return arguments.length ? (n = (range = slice$9.call(_)).length - 1, rescale()) : range.slice();
17858           };
17859
17860           scale.invertExtent = function(y) {
17861             var i = range.indexOf(y);
17862             return i < 0 ? [NaN, NaN]
17863                 : i < 1 ? [x0, domain[0]]
17864                 : i >= n ? [domain[n - 1], x1]
17865                 : [domain[i - 1], domain[i]];
17866           };
17867
17868           scale.unknown = function(_) {
17869             return arguments.length ? (unknown = _, scale) : scale;
17870           };
17871
17872           scale.thresholds = function() {
17873             return domain.slice();
17874           };
17875
17876           scale.copy = function() {
17877             return quantize()
17878                 .domain([x0, x1])
17879                 .range(range)
17880                 .unknown(unknown);
17881           };
17882
17883           return initRange.apply(linearish(scale), arguments);
17884         }
17885
17886         function threshold$1() {
17887           var domain = [0.5],
17888               range = [0, 1],
17889               unknown,
17890               n = 1;
17891
17892           function scale(x) {
17893             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17894           }
17895
17896           scale.domain = function(_) {
17897             return arguments.length ? (domain = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
17898           };
17899
17900           scale.range = function(_) {
17901             return arguments.length ? (range = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
17902           };
17903
17904           scale.invertExtent = function(y) {
17905             var i = range.indexOf(y);
17906             return [domain[i - 1], domain[i]];
17907           };
17908
17909           scale.unknown = function(_) {
17910             return arguments.length ? (unknown = _, scale) : unknown;
17911           };
17912
17913           scale.copy = function() {
17914             return threshold$1()
17915                 .domain(domain)
17916                 .range(range)
17917                 .unknown(unknown);
17918           };
17919
17920           return initRange.apply(scale, arguments);
17921         }
17922
17923         var t0$1 = new Date,
17924             t1$1 = new Date;
17925
17926         function newInterval(floori, offseti, count, field) {
17927
17928           function interval(date) {
17929             return floori(date = new Date(+date)), date;
17930           }
17931
17932           interval.floor = interval;
17933
17934           interval.ceil = function(date) {
17935             return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
17936           };
17937
17938           interval.round = function(date) {
17939             var d0 = interval(date),
17940                 d1 = interval.ceil(date);
17941             return date - d0 < d1 - date ? d0 : d1;
17942           };
17943
17944           interval.offset = function(date, step) {
17945             return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
17946           };
17947
17948           interval.range = function(start, stop, step) {
17949             var range = [], previous;
17950             start = interval.ceil(start);
17951             step = step == null ? 1 : Math.floor(step);
17952             if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
17953             do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
17954             while (previous < start && start < stop);
17955             return range;
17956           };
17957
17958           interval.filter = function(test) {
17959             return newInterval(function(date) {
17960               if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
17961             }, function(date, step) {
17962               if (date >= date) {
17963                 if (step < 0) while (++step <= 0) {
17964                   while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
17965                 } else while (--step >= 0) {
17966                   while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
17967                 }
17968               }
17969             });
17970           };
17971
17972           if (count) {
17973             interval.count = function(start, end) {
17974               t0$1.setTime(+start), t1$1.setTime(+end);
17975               floori(t0$1), floori(t1$1);
17976               return Math.floor(count(t0$1, t1$1));
17977             };
17978
17979             interval.every = function(step) {
17980               step = Math.floor(step);
17981               return !isFinite(step) || !(step > 0) ? null
17982                   : !(step > 1) ? interval
17983                   : interval.filter(field
17984                       ? function(d) { return field(d) % step === 0; }
17985                       : function(d) { return interval.count(0, d) % step === 0; });
17986             };
17987           }
17988
17989           return interval;
17990         }
17991
17992         var millisecond = newInterval(function() {
17993           // noop
17994         }, function(date, step) {
17995           date.setTime(+date + step);
17996         }, function(start, end) {
17997           return end - start;
17998         });
17999
18000         // An optimized implementation for this simple case.
18001         millisecond.every = function(k) {
18002           k = Math.floor(k);
18003           if (!isFinite(k) || !(k > 0)) return null;
18004           if (!(k > 1)) return millisecond;
18005           return newInterval(function(date) {
18006             date.setTime(Math.floor(date / k) * k);
18007           }, function(date, step) {
18008             date.setTime(+date + step * k);
18009           }, function(start, end) {
18010             return (end - start) / k;
18011           });
18012         };
18013         var milliseconds = millisecond.range;
18014
18015         var durationSecond = 1e3;
18016         var durationMinute = 6e4;
18017         var durationHour = 36e5;
18018         var durationDay = 864e5;
18019         var durationWeek = 6048e5;
18020
18021         var second = newInterval(function(date) {
18022           date.setTime(date - date.getMilliseconds());
18023         }, function(date, step) {
18024           date.setTime(+date + step * durationSecond);
18025         }, function(start, end) {
18026           return (end - start) / durationSecond;
18027         }, function(date) {
18028           return date.getUTCSeconds();
18029         });
18030         var seconds = second.range;
18031
18032         var minute = newInterval(function(date) {
18033           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
18034         }, function(date, step) {
18035           date.setTime(+date + step * durationMinute);
18036         }, function(start, end) {
18037           return (end - start) / durationMinute;
18038         }, function(date) {
18039           return date.getMinutes();
18040         });
18041         var minutes = minute.range;
18042
18043         var hour = newInterval(function(date) {
18044           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
18045         }, function(date, step) {
18046           date.setTime(+date + step * durationHour);
18047         }, function(start, end) {
18048           return (end - start) / durationHour;
18049         }, function(date) {
18050           return date.getHours();
18051         });
18052         var hours = hour.range;
18053
18054         var day = newInterval(function(date) {
18055           date.setHours(0, 0, 0, 0);
18056         }, function(date, step) {
18057           date.setDate(date.getDate() + step);
18058         }, function(start, end) {
18059           return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
18060         }, function(date) {
18061           return date.getDate() - 1;
18062         });
18063         var days = day.range;
18064
18065         function weekday(i) {
18066           return newInterval(function(date) {
18067             date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
18068             date.setHours(0, 0, 0, 0);
18069           }, function(date, step) {
18070             date.setDate(date.getDate() + step * 7);
18071           }, function(start, end) {
18072             return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
18073           });
18074         }
18075
18076         var sunday = weekday(0);
18077         var monday = weekday(1);
18078         var tuesday = weekday(2);
18079         var wednesday = weekday(3);
18080         var thursday = weekday(4);
18081         var friday = weekday(5);
18082         var saturday = weekday(6);
18083
18084         var sundays = sunday.range;
18085         var mondays = monday.range;
18086         var tuesdays = tuesday.range;
18087         var wednesdays = wednesday.range;
18088         var thursdays = thursday.range;
18089         var fridays = friday.range;
18090         var saturdays = saturday.range;
18091
18092         var month = newInterval(function(date) {
18093           date.setDate(1);
18094           date.setHours(0, 0, 0, 0);
18095         }, function(date, step) {
18096           date.setMonth(date.getMonth() + step);
18097         }, function(start, end) {
18098           return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
18099         }, function(date) {
18100           return date.getMonth();
18101         });
18102         var months = month.range;
18103
18104         var year = newInterval(function(date) {
18105           date.setMonth(0, 1);
18106           date.setHours(0, 0, 0, 0);
18107         }, function(date, step) {
18108           date.setFullYear(date.getFullYear() + step);
18109         }, function(start, end) {
18110           return end.getFullYear() - start.getFullYear();
18111         }, function(date) {
18112           return date.getFullYear();
18113         });
18114
18115         // An optimized implementation for this simple case.
18116         year.every = function(k) {
18117           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18118             date.setFullYear(Math.floor(date.getFullYear() / k) * k);
18119             date.setMonth(0, 1);
18120             date.setHours(0, 0, 0, 0);
18121           }, function(date, step) {
18122             date.setFullYear(date.getFullYear() + step * k);
18123           });
18124         };
18125         var years = year.range;
18126
18127         var utcMinute = newInterval(function(date) {
18128           date.setUTCSeconds(0, 0);
18129         }, function(date, step) {
18130           date.setTime(+date + step * durationMinute);
18131         }, function(start, end) {
18132           return (end - start) / durationMinute;
18133         }, function(date) {
18134           return date.getUTCMinutes();
18135         });
18136         var utcMinutes = utcMinute.range;
18137
18138         var utcHour = newInterval(function(date) {
18139           date.setUTCMinutes(0, 0, 0);
18140         }, function(date, step) {
18141           date.setTime(+date + step * durationHour);
18142         }, function(start, end) {
18143           return (end - start) / durationHour;
18144         }, function(date) {
18145           return date.getUTCHours();
18146         });
18147         var utcHours = utcHour.range;
18148
18149         var utcDay = newInterval(function(date) {
18150           date.setUTCHours(0, 0, 0, 0);
18151         }, function(date, step) {
18152           date.setUTCDate(date.getUTCDate() + step);
18153         }, function(start, end) {
18154           return (end - start) / durationDay;
18155         }, function(date) {
18156           return date.getUTCDate() - 1;
18157         });
18158         var utcDays = utcDay.range;
18159
18160         function utcWeekday(i) {
18161           return newInterval(function(date) {
18162             date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
18163             date.setUTCHours(0, 0, 0, 0);
18164           }, function(date, step) {
18165             date.setUTCDate(date.getUTCDate() + step * 7);
18166           }, function(start, end) {
18167             return (end - start) / durationWeek;
18168           });
18169         }
18170
18171         var utcSunday = utcWeekday(0);
18172         var utcMonday = utcWeekday(1);
18173         var utcTuesday = utcWeekday(2);
18174         var utcWednesday = utcWeekday(3);
18175         var utcThursday = utcWeekday(4);
18176         var utcFriday = utcWeekday(5);
18177         var utcSaturday = utcWeekday(6);
18178
18179         var utcSundays = utcSunday.range;
18180         var utcMondays = utcMonday.range;
18181         var utcTuesdays = utcTuesday.range;
18182         var utcWednesdays = utcWednesday.range;
18183         var utcThursdays = utcThursday.range;
18184         var utcFridays = utcFriday.range;
18185         var utcSaturdays = utcSaturday.range;
18186
18187         var utcMonth = newInterval(function(date) {
18188           date.setUTCDate(1);
18189           date.setUTCHours(0, 0, 0, 0);
18190         }, function(date, step) {
18191           date.setUTCMonth(date.getUTCMonth() + step);
18192         }, function(start, end) {
18193           return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
18194         }, function(date) {
18195           return date.getUTCMonth();
18196         });
18197         var utcMonths = utcMonth.range;
18198
18199         var utcYear = newInterval(function(date) {
18200           date.setUTCMonth(0, 1);
18201           date.setUTCHours(0, 0, 0, 0);
18202         }, function(date, step) {
18203           date.setUTCFullYear(date.getUTCFullYear() + step);
18204         }, function(start, end) {
18205           return end.getUTCFullYear() - start.getUTCFullYear();
18206         }, function(date) {
18207           return date.getUTCFullYear();
18208         });
18209
18210         // An optimized implementation for this simple case.
18211         utcYear.every = function(k) {
18212           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18213             date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
18214             date.setUTCMonth(0, 1);
18215             date.setUTCHours(0, 0, 0, 0);
18216           }, function(date, step) {
18217             date.setUTCFullYear(date.getUTCFullYear() + step * k);
18218           });
18219         };
18220         var utcYears = utcYear.range;
18221
18222         function localDate(d) {
18223           if (0 <= d.y && d.y < 100) {
18224             var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
18225             date.setFullYear(d.y);
18226             return date;
18227           }
18228           return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
18229         }
18230
18231         function utcDate(d) {
18232           if (0 <= d.y && d.y < 100) {
18233             var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
18234             date.setUTCFullYear(d.y);
18235             return date;
18236           }
18237           return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
18238         }
18239
18240         function newYear(y) {
18241           return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
18242         }
18243
18244         function formatLocale$1(locale) {
18245           var locale_dateTime = locale.dateTime,
18246               locale_date = locale.date,
18247               locale_time = locale.time,
18248               locale_periods = locale.periods,
18249               locale_weekdays = locale.days,
18250               locale_shortWeekdays = locale.shortDays,
18251               locale_months = locale.months,
18252               locale_shortMonths = locale.shortMonths;
18253
18254           var periodRe = formatRe(locale_periods),
18255               periodLookup = formatLookup(locale_periods),
18256               weekdayRe = formatRe(locale_weekdays),
18257               weekdayLookup = formatLookup(locale_weekdays),
18258               shortWeekdayRe = formatRe(locale_shortWeekdays),
18259               shortWeekdayLookup = formatLookup(locale_shortWeekdays),
18260               monthRe = formatRe(locale_months),
18261               monthLookup = formatLookup(locale_months),
18262               shortMonthRe = formatRe(locale_shortMonths),
18263               shortMonthLookup = formatLookup(locale_shortMonths);
18264
18265           var formats = {
18266             "a": formatShortWeekday,
18267             "A": formatWeekday,
18268             "b": formatShortMonth,
18269             "B": formatMonth,
18270             "c": null,
18271             "d": formatDayOfMonth,
18272             "e": formatDayOfMonth,
18273             "f": formatMicroseconds,
18274             "H": formatHour24,
18275             "I": formatHour12,
18276             "j": formatDayOfYear,
18277             "L": formatMilliseconds,
18278             "m": formatMonthNumber,
18279             "M": formatMinutes,
18280             "p": formatPeriod,
18281             "Q": formatUnixTimestamp,
18282             "s": formatUnixTimestampSeconds,
18283             "S": formatSeconds,
18284             "u": formatWeekdayNumberMonday,
18285             "U": formatWeekNumberSunday,
18286             "V": formatWeekNumberISO,
18287             "w": formatWeekdayNumberSunday,
18288             "W": formatWeekNumberMonday,
18289             "x": null,
18290             "X": null,
18291             "y": formatYear$1,
18292             "Y": formatFullYear,
18293             "Z": formatZone,
18294             "%": formatLiteralPercent
18295           };
18296
18297           var utcFormats = {
18298             "a": formatUTCShortWeekday,
18299             "A": formatUTCWeekday,
18300             "b": formatUTCShortMonth,
18301             "B": formatUTCMonth,
18302             "c": null,
18303             "d": formatUTCDayOfMonth,
18304             "e": formatUTCDayOfMonth,
18305             "f": formatUTCMicroseconds,
18306             "H": formatUTCHour24,
18307             "I": formatUTCHour12,
18308             "j": formatUTCDayOfYear,
18309             "L": formatUTCMilliseconds,
18310             "m": formatUTCMonthNumber,
18311             "M": formatUTCMinutes,
18312             "p": formatUTCPeriod,
18313             "Q": formatUnixTimestamp,
18314             "s": formatUnixTimestampSeconds,
18315             "S": formatUTCSeconds,
18316             "u": formatUTCWeekdayNumberMonday,
18317             "U": formatUTCWeekNumberSunday,
18318             "V": formatUTCWeekNumberISO,
18319             "w": formatUTCWeekdayNumberSunday,
18320             "W": formatUTCWeekNumberMonday,
18321             "x": null,
18322             "X": null,
18323             "y": formatUTCYear,
18324             "Y": formatUTCFullYear,
18325             "Z": formatUTCZone,
18326             "%": formatLiteralPercent
18327           };
18328
18329           var parses = {
18330             "a": parseShortWeekday,
18331             "A": parseWeekday,
18332             "b": parseShortMonth,
18333             "B": parseMonth,
18334             "c": parseLocaleDateTime,
18335             "d": parseDayOfMonth,
18336             "e": parseDayOfMonth,
18337             "f": parseMicroseconds,
18338             "H": parseHour24,
18339             "I": parseHour24,
18340             "j": parseDayOfYear,
18341             "L": parseMilliseconds,
18342             "m": parseMonthNumber,
18343             "M": parseMinutes,
18344             "p": parsePeriod,
18345             "Q": parseUnixTimestamp,
18346             "s": parseUnixTimestampSeconds,
18347             "S": parseSeconds,
18348             "u": parseWeekdayNumberMonday,
18349             "U": parseWeekNumberSunday,
18350             "V": parseWeekNumberISO,
18351             "w": parseWeekdayNumberSunday,
18352             "W": parseWeekNumberMonday,
18353             "x": parseLocaleDate,
18354             "X": parseLocaleTime,
18355             "y": parseYear,
18356             "Y": parseFullYear,
18357             "Z": parseZone,
18358             "%": parseLiteralPercent
18359           };
18360
18361           // These recursive directive definitions must be deferred.
18362           formats.x = newFormat(locale_date, formats);
18363           formats.X = newFormat(locale_time, formats);
18364           formats.c = newFormat(locale_dateTime, formats);
18365           utcFormats.x = newFormat(locale_date, utcFormats);
18366           utcFormats.X = newFormat(locale_time, utcFormats);
18367           utcFormats.c = newFormat(locale_dateTime, utcFormats);
18368
18369           function newFormat(specifier, formats) {
18370             return function(date) {
18371               var string = [],
18372                   i = -1,
18373                   j = 0,
18374                   n = specifier.length,
18375                   c,
18376                   pad,
18377                   format;
18378
18379               if (!(date instanceof Date)) date = new Date(+date);
18380
18381               while (++i < n) {
18382                 if (specifier.charCodeAt(i) === 37) {
18383                   string.push(specifier.slice(j, i));
18384                   if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
18385                   else pad = c === "e" ? " " : "0";
18386                   if (format = formats[c]) c = format(date, pad);
18387                   string.push(c);
18388                   j = i + 1;
18389                 }
18390               }
18391
18392               string.push(specifier.slice(j, i));
18393               return string.join("");
18394             };
18395           }
18396
18397           function newParse(specifier, newDate) {
18398             return function(string) {
18399               var d = newYear(1900),
18400                   i = parseSpecifier(d, specifier, string += "", 0),
18401                   week, day$1;
18402               if (i != string.length) return null;
18403
18404               // If a UNIX timestamp is specified, return it.
18405               if ("Q" in d) return new Date(d.Q);
18406
18407               // The am-pm flag is 0 for AM, and 1 for PM.
18408               if ("p" in d) d.H = d.H % 12 + d.p * 12;
18409
18410               // Convert day-of-week and week-of-year to day-of-year.
18411               if ("V" in d) {
18412                 if (d.V < 1 || d.V > 53) return null;
18413                 if (!("w" in d)) d.w = 1;
18414                 if ("Z" in d) {
18415                   week = utcDate(newYear(d.y)), day$1 = week.getUTCDay();
18416                   week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
18417                   week = utcDay.offset(week, (d.V - 1) * 7);
18418                   d.y = week.getUTCFullYear();
18419                   d.m = week.getUTCMonth();
18420                   d.d = week.getUTCDate() + (d.w + 6) % 7;
18421                 } else {
18422                   week = newDate(newYear(d.y)), day$1 = week.getDay();
18423                   week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week);
18424                   week = day.offset(week, (d.V - 1) * 7);
18425                   d.y = week.getFullYear();
18426                   d.m = week.getMonth();
18427                   d.d = week.getDate() + (d.w + 6) % 7;
18428                 }
18429               } else if ("W" in d || "U" in d) {
18430                 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
18431                 day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
18432                 d.m = 0;
18433                 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;
18434               }
18435
18436               // If a time zone is specified, all fields are interpreted as UTC and then
18437               // offset according to the specified time zone.
18438               if ("Z" in d) {
18439                 d.H += d.Z / 100 | 0;
18440                 d.M += d.Z % 100;
18441                 return utcDate(d);
18442               }
18443
18444               // Otherwise, all fields are in local time.
18445               return newDate(d);
18446             };
18447           }
18448
18449           function parseSpecifier(d, specifier, string, j) {
18450             var i = 0,
18451                 n = specifier.length,
18452                 m = string.length,
18453                 c,
18454                 parse;
18455
18456             while (i < n) {
18457               if (j >= m) return -1;
18458               c = specifier.charCodeAt(i++);
18459               if (c === 37) {
18460                 c = specifier.charAt(i++);
18461                 parse = parses[c in pads ? specifier.charAt(i++) : c];
18462                 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
18463               } else if (c != string.charCodeAt(j++)) {
18464                 return -1;
18465               }
18466             }
18467
18468             return j;
18469           }
18470
18471           function parsePeriod(d, string, i) {
18472             var n = periodRe.exec(string.slice(i));
18473             return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18474           }
18475
18476           function parseShortWeekday(d, string, i) {
18477             var n = shortWeekdayRe.exec(string.slice(i));
18478             return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18479           }
18480
18481           function parseWeekday(d, string, i) {
18482             var n = weekdayRe.exec(string.slice(i));
18483             return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18484           }
18485
18486           function parseShortMonth(d, string, i) {
18487             var n = shortMonthRe.exec(string.slice(i));
18488             return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18489           }
18490
18491           function parseMonth(d, string, i) {
18492             var n = monthRe.exec(string.slice(i));
18493             return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18494           }
18495
18496           function parseLocaleDateTime(d, string, i) {
18497             return parseSpecifier(d, locale_dateTime, string, i);
18498           }
18499
18500           function parseLocaleDate(d, string, i) {
18501             return parseSpecifier(d, locale_date, string, i);
18502           }
18503
18504           function parseLocaleTime(d, string, i) {
18505             return parseSpecifier(d, locale_time, string, i);
18506           }
18507
18508           function formatShortWeekday(d) {
18509             return locale_shortWeekdays[d.getDay()];
18510           }
18511
18512           function formatWeekday(d) {
18513             return locale_weekdays[d.getDay()];
18514           }
18515
18516           function formatShortMonth(d) {
18517             return locale_shortMonths[d.getMonth()];
18518           }
18519
18520           function formatMonth(d) {
18521             return locale_months[d.getMonth()];
18522           }
18523
18524           function formatPeriod(d) {
18525             return locale_periods[+(d.getHours() >= 12)];
18526           }
18527
18528           function formatUTCShortWeekday(d) {
18529             return locale_shortWeekdays[d.getUTCDay()];
18530           }
18531
18532           function formatUTCWeekday(d) {
18533             return locale_weekdays[d.getUTCDay()];
18534           }
18535
18536           function formatUTCShortMonth(d) {
18537             return locale_shortMonths[d.getUTCMonth()];
18538           }
18539
18540           function formatUTCMonth(d) {
18541             return locale_months[d.getUTCMonth()];
18542           }
18543
18544           function formatUTCPeriod(d) {
18545             return locale_periods[+(d.getUTCHours() >= 12)];
18546           }
18547
18548           return {
18549             format: function(specifier) {
18550               var f = newFormat(specifier += "", formats);
18551               f.toString = function() { return specifier; };
18552               return f;
18553             },
18554             parse: function(specifier) {
18555               var p = newParse(specifier += "", localDate);
18556               p.toString = function() { return specifier; };
18557               return p;
18558             },
18559             utcFormat: function(specifier) {
18560               var f = newFormat(specifier += "", utcFormats);
18561               f.toString = function() { return specifier; };
18562               return f;
18563             },
18564             utcParse: function(specifier) {
18565               var p = newParse(specifier, utcDate);
18566               p.toString = function() { return specifier; };
18567               return p;
18568             }
18569           };
18570         }
18571
18572         var pads = {"-": "", "_": " ", "0": "0"},
18573             numberRe = /^\s*\d+/, // note: ignores next directive
18574             percentRe = /^%/,
18575             requoteRe = /[\\^$*+?|[\]().{}]/g;
18576
18577         function pad$1(value, fill, width) {
18578           var sign = value < 0 ? "-" : "",
18579               string = (sign ? -value : value) + "",
18580               length = string.length;
18581           return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
18582         }
18583
18584         function requote(s) {
18585           return s.replace(requoteRe, "\\$&");
18586         }
18587
18588         function formatRe(names) {
18589           return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
18590         }
18591
18592         function formatLookup(names) {
18593           var map = {}, i = -1, n = names.length;
18594           while (++i < n) map[names[i].toLowerCase()] = i;
18595           return map;
18596         }
18597
18598         function parseWeekdayNumberSunday(d, string, i) {
18599           var n = numberRe.exec(string.slice(i, i + 1));
18600           return n ? (d.w = +n[0], i + n[0].length) : -1;
18601         }
18602
18603         function parseWeekdayNumberMonday(d, string, i) {
18604           var n = numberRe.exec(string.slice(i, i + 1));
18605           return n ? (d.u = +n[0], i + n[0].length) : -1;
18606         }
18607
18608         function parseWeekNumberSunday(d, string, i) {
18609           var n = numberRe.exec(string.slice(i, i + 2));
18610           return n ? (d.U = +n[0], i + n[0].length) : -1;
18611         }
18612
18613         function parseWeekNumberISO(d, string, i) {
18614           var n = numberRe.exec(string.slice(i, i + 2));
18615           return n ? (d.V = +n[0], i + n[0].length) : -1;
18616         }
18617
18618         function parseWeekNumberMonday(d, string, i) {
18619           var n = numberRe.exec(string.slice(i, i + 2));
18620           return n ? (d.W = +n[0], i + n[0].length) : -1;
18621         }
18622
18623         function parseFullYear(d, string, i) {
18624           var n = numberRe.exec(string.slice(i, i + 4));
18625           return n ? (d.y = +n[0], i + n[0].length) : -1;
18626         }
18627
18628         function parseYear(d, string, i) {
18629           var n = numberRe.exec(string.slice(i, i + 2));
18630           return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
18631         }
18632
18633         function parseZone(d, string, i) {
18634           var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
18635           return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
18636         }
18637
18638         function parseMonthNumber(d, string, i) {
18639           var n = numberRe.exec(string.slice(i, i + 2));
18640           return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
18641         }
18642
18643         function parseDayOfMonth(d, string, i) {
18644           var n = numberRe.exec(string.slice(i, i + 2));
18645           return n ? (d.d = +n[0], i + n[0].length) : -1;
18646         }
18647
18648         function parseDayOfYear(d, string, i) {
18649           var n = numberRe.exec(string.slice(i, i + 3));
18650           return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
18651         }
18652
18653         function parseHour24(d, string, i) {
18654           var n = numberRe.exec(string.slice(i, i + 2));
18655           return n ? (d.H = +n[0], i + n[0].length) : -1;
18656         }
18657
18658         function parseMinutes(d, string, i) {
18659           var n = numberRe.exec(string.slice(i, i + 2));
18660           return n ? (d.M = +n[0], i + n[0].length) : -1;
18661         }
18662
18663         function parseSeconds(d, string, i) {
18664           var n = numberRe.exec(string.slice(i, i + 2));
18665           return n ? (d.S = +n[0], i + n[0].length) : -1;
18666         }
18667
18668         function parseMilliseconds(d, string, i) {
18669           var n = numberRe.exec(string.slice(i, i + 3));
18670           return n ? (d.L = +n[0], i + n[0].length) : -1;
18671         }
18672
18673         function parseMicroseconds(d, string, i) {
18674           var n = numberRe.exec(string.slice(i, i + 6));
18675           return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
18676         }
18677
18678         function parseLiteralPercent(d, string, i) {
18679           var n = percentRe.exec(string.slice(i, i + 1));
18680           return n ? i + n[0].length : -1;
18681         }
18682
18683         function parseUnixTimestamp(d, string, i) {
18684           var n = numberRe.exec(string.slice(i));
18685           return n ? (d.Q = +n[0], i + n[0].length) : -1;
18686         }
18687
18688         function parseUnixTimestampSeconds(d, string, i) {
18689           var n = numberRe.exec(string.slice(i));
18690           return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
18691         }
18692
18693         function formatDayOfMonth(d, p) {
18694           return pad$1(d.getDate(), p, 2);
18695         }
18696
18697         function formatHour24(d, p) {
18698           return pad$1(d.getHours(), p, 2);
18699         }
18700
18701         function formatHour12(d, p) {
18702           return pad$1(d.getHours() % 12 || 12, p, 2);
18703         }
18704
18705         function formatDayOfYear(d, p) {
18706           return pad$1(1 + day.count(year(d), d), p, 3);
18707         }
18708
18709         function formatMilliseconds(d, p) {
18710           return pad$1(d.getMilliseconds(), p, 3);
18711         }
18712
18713         function formatMicroseconds(d, p) {
18714           return formatMilliseconds(d, p) + "000";
18715         }
18716
18717         function formatMonthNumber(d, p) {
18718           return pad$1(d.getMonth() + 1, p, 2);
18719         }
18720
18721         function formatMinutes(d, p) {
18722           return pad$1(d.getMinutes(), p, 2);
18723         }
18724
18725         function formatSeconds(d, p) {
18726           return pad$1(d.getSeconds(), p, 2);
18727         }
18728
18729         function formatWeekdayNumberMonday(d) {
18730           var day = d.getDay();
18731           return day === 0 ? 7 : day;
18732         }
18733
18734         function formatWeekNumberSunday(d, p) {
18735           return pad$1(sunday.count(year(d), d), p, 2);
18736         }
18737
18738         function formatWeekNumberISO(d, p) {
18739           var day = d.getDay();
18740           d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
18741           return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
18742         }
18743
18744         function formatWeekdayNumberSunday(d) {
18745           return d.getDay();
18746         }
18747
18748         function formatWeekNumberMonday(d, p) {
18749           return pad$1(monday.count(year(d), d), p, 2);
18750         }
18751
18752         function formatYear$1(d, p) {
18753           return pad$1(d.getFullYear() % 100, p, 2);
18754         }
18755
18756         function formatFullYear(d, p) {
18757           return pad$1(d.getFullYear() % 10000, p, 4);
18758         }
18759
18760         function formatZone(d) {
18761           var z = d.getTimezoneOffset();
18762           return (z > 0 ? "-" : (z *= -1, "+"))
18763               + pad$1(z / 60 | 0, "0", 2)
18764               + pad$1(z % 60, "0", 2);
18765         }
18766
18767         function formatUTCDayOfMonth(d, p) {
18768           return pad$1(d.getUTCDate(), p, 2);
18769         }
18770
18771         function formatUTCHour24(d, p) {
18772           return pad$1(d.getUTCHours(), p, 2);
18773         }
18774
18775         function formatUTCHour12(d, p) {
18776           return pad$1(d.getUTCHours() % 12 || 12, p, 2);
18777         }
18778
18779         function formatUTCDayOfYear(d, p) {
18780           return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
18781         }
18782
18783         function formatUTCMilliseconds(d, p) {
18784           return pad$1(d.getUTCMilliseconds(), p, 3);
18785         }
18786
18787         function formatUTCMicroseconds(d, p) {
18788           return formatUTCMilliseconds(d, p) + "000";
18789         }
18790
18791         function formatUTCMonthNumber(d, p) {
18792           return pad$1(d.getUTCMonth() + 1, p, 2);
18793         }
18794
18795         function formatUTCMinutes(d, p) {
18796           return pad$1(d.getUTCMinutes(), p, 2);
18797         }
18798
18799         function formatUTCSeconds(d, p) {
18800           return pad$1(d.getUTCSeconds(), p, 2);
18801         }
18802
18803         function formatUTCWeekdayNumberMonday(d) {
18804           var dow = d.getUTCDay();
18805           return dow === 0 ? 7 : dow;
18806         }
18807
18808         function formatUTCWeekNumberSunday(d, p) {
18809           return pad$1(utcSunday.count(utcYear(d), d), p, 2);
18810         }
18811
18812         function formatUTCWeekNumberISO(d, p) {
18813           var day = d.getUTCDay();
18814           d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
18815           return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
18816         }
18817
18818         function formatUTCWeekdayNumberSunday(d) {
18819           return d.getUTCDay();
18820         }
18821
18822         function formatUTCWeekNumberMonday(d, p) {
18823           return pad$1(utcMonday.count(utcYear(d), d), p, 2);
18824         }
18825
18826         function formatUTCYear(d, p) {
18827           return pad$1(d.getUTCFullYear() % 100, p, 2);
18828         }
18829
18830         function formatUTCFullYear(d, p) {
18831           return pad$1(d.getUTCFullYear() % 10000, p, 4);
18832         }
18833
18834         function formatUTCZone() {
18835           return "+0000";
18836         }
18837
18838         function formatLiteralPercent() {
18839           return "%";
18840         }
18841
18842         function formatUnixTimestamp(d) {
18843           return +d;
18844         }
18845
18846         function formatUnixTimestampSeconds(d) {
18847           return Math.floor(+d / 1000);
18848         }
18849
18850         var locale$1;
18851         var timeFormat;
18852         var timeParse;
18853         var utcFormat;
18854         var utcParse;
18855
18856         defaultLocale$1({
18857           dateTime: "%x, %X",
18858           date: "%-m/%-d/%Y",
18859           time: "%-I:%M:%S %p",
18860           periods: ["AM", "PM"],
18861           days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
18862           shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
18863           months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
18864           shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
18865         });
18866
18867         function defaultLocale$1(definition) {
18868           locale$1 = formatLocale$1(definition);
18869           timeFormat = locale$1.format;
18870           timeParse = locale$1.parse;
18871           utcFormat = locale$1.utcFormat;
18872           utcParse = locale$1.utcParse;
18873           return locale$1;
18874         }
18875
18876         var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
18877
18878         function formatIsoNative(date) {
18879           return date.toISOString();
18880         }
18881
18882         var formatIso = Date.prototype.toISOString
18883             ? formatIsoNative
18884             : utcFormat(isoSpecifier);
18885
18886         function parseIsoNative(string) {
18887           var date = new Date(string);
18888           return isNaN(date) ? null : date;
18889         }
18890
18891         var parseIso = +new Date("2000-01-01T00:00:00.000Z")
18892             ? parseIsoNative
18893             : utcParse(isoSpecifier);
18894
18895         var durationSecond$1 = 1000,
18896             durationMinute$1 = durationSecond$1 * 60,
18897             durationHour$1 = durationMinute$1 * 60,
18898             durationDay$1 = durationHour$1 * 24,
18899             durationWeek$1 = durationDay$1 * 7,
18900             durationMonth = durationDay$1 * 30,
18901             durationYear = durationDay$1 * 365;
18902
18903         function date$1(t) {
18904           return new Date(t);
18905         }
18906
18907         function number$3(t) {
18908           return t instanceof Date ? +t : +new Date(+t);
18909         }
18910
18911         function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
18912           var scale = continuous(identity$5, identity$5),
18913               invert = scale.invert,
18914               domain = scale.domain;
18915
18916           var formatMillisecond = format(".%L"),
18917               formatSecond = format(":%S"),
18918               formatMinute = format("%I:%M"),
18919               formatHour = format("%I %p"),
18920               formatDay = format("%a %d"),
18921               formatWeek = format("%b %d"),
18922               formatMonth = format("%B"),
18923               formatYear = format("%Y");
18924
18925           var tickIntervals = [
18926             [second,  1,      durationSecond$1],
18927             [second,  5,  5 * durationSecond$1],
18928             [second, 15, 15 * durationSecond$1],
18929             [second, 30, 30 * durationSecond$1],
18930             [minute,  1,      durationMinute$1],
18931             [minute,  5,  5 * durationMinute$1],
18932             [minute, 15, 15 * durationMinute$1],
18933             [minute, 30, 30 * durationMinute$1],
18934             [  hour,  1,      durationHour$1  ],
18935             [  hour,  3,  3 * durationHour$1  ],
18936             [  hour,  6,  6 * durationHour$1  ],
18937             [  hour, 12, 12 * durationHour$1  ],
18938             [   day,  1,      durationDay$1   ],
18939             [   day,  2,  2 * durationDay$1   ],
18940             [  week,  1,      durationWeek$1  ],
18941             [ month,  1,      durationMonth ],
18942             [ month,  3,  3 * durationMonth ],
18943             [  year,  1,      durationYear  ]
18944           ];
18945
18946           function tickFormat(date) {
18947             return (second(date) < date ? formatMillisecond
18948                 : minute(date) < date ? formatSecond
18949                 : hour(date) < date ? formatMinute
18950                 : day(date) < date ? formatHour
18951                 : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
18952                 : year(date) < date ? formatMonth
18953                 : formatYear)(date);
18954           }
18955
18956           function tickInterval(interval, start, stop, step) {
18957             if (interval == null) interval = 10;
18958
18959             // If a desired tick count is specified, pick a reasonable tick interval
18960             // based on the extent of the domain and a rough estimate of tick size.
18961             // Otherwise, assume interval is already a time interval and use it.
18962             if (typeof interval === "number") {
18963               var target = Math.abs(stop - start) / interval,
18964                   i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
18965               if (i === tickIntervals.length) {
18966                 step = tickStep(start / durationYear, stop / durationYear, interval);
18967                 interval = year;
18968               } else if (i) {
18969                 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
18970                 step = i[1];
18971                 interval = i[0];
18972               } else {
18973                 step = Math.max(tickStep(start, stop, interval), 1);
18974                 interval = millisecond;
18975               }
18976             }
18977
18978             return step == null ? interval : interval.every(step);
18979           }
18980
18981           scale.invert = function(y) {
18982             return new Date(invert(y));
18983           };
18984
18985           scale.domain = function(_) {
18986             return arguments.length ? domain(map$4.call(_, number$3)) : domain().map(date$1);
18987           };
18988
18989           scale.ticks = function(interval, step) {
18990             var d = domain(),
18991                 t0 = d[0],
18992                 t1 = d[d.length - 1],
18993                 r = t1 < t0,
18994                 t;
18995             if (r) t = t0, t0 = t1, t1 = t;
18996             t = tickInterval(interval, t0, t1, step);
18997             t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
18998             return r ? t.reverse() : t;
18999           };
19000
19001           scale.tickFormat = function(count, specifier) {
19002             return specifier == null ? tickFormat : format(specifier);
19003           };
19004
19005           scale.nice = function(interval, step) {
19006             var d = domain();
19007             return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
19008                 ? domain(nice(d, interval))
19009                 : scale;
19010           };
19011
19012           scale.copy = function() {
19013             return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
19014           };
19015
19016           return scale;
19017         }
19018
19019         function time() {
19020           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);
19021         }
19022
19023         function utcTime() {
19024           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);
19025         }
19026
19027         function transformer$2() {
19028           var x0 = 0,
19029               x1 = 1,
19030               t0,
19031               t1,
19032               k10,
19033               transform,
19034               interpolator = identity$5,
19035               clamp = false,
19036               unknown;
19037
19038           function scale(x) {
19039             return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
19040           }
19041
19042           scale.domain = function(_) {
19043             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
19044           };
19045
19046           scale.clamp = function(_) {
19047             return arguments.length ? (clamp = !!_, scale) : clamp;
19048           };
19049
19050           scale.interpolator = function(_) {
19051             return arguments.length ? (interpolator = _, scale) : interpolator;
19052           };
19053
19054           scale.unknown = function(_) {
19055             return arguments.length ? (unknown = _, scale) : unknown;
19056           };
19057
19058           return function(t) {
19059             transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
19060             return scale;
19061           };
19062         }
19063
19064         function copy$2(source, target) {
19065           return target
19066               .domain(source.domain())
19067               .interpolator(source.interpolator())
19068               .clamp(source.clamp())
19069               .unknown(source.unknown());
19070         }
19071
19072         function sequential() {
19073           var scale = linearish(transformer$2()(identity$5));
19074
19075           scale.copy = function() {
19076             return copy$2(scale, sequential());
19077           };
19078
19079           return initInterpolator.apply(scale, arguments);
19080         }
19081
19082         function sequentialLog() {
19083           var scale = loggish(transformer$2()).domain([1, 10]);
19084
19085           scale.copy = function() {
19086             return copy$2(scale, sequentialLog()).base(scale.base());
19087           };
19088
19089           return initInterpolator.apply(scale, arguments);
19090         }
19091
19092         function sequentialSymlog() {
19093           var scale = symlogish(transformer$2());
19094
19095           scale.copy = function() {
19096             return copy$2(scale, sequentialSymlog()).constant(scale.constant());
19097           };
19098
19099           return initInterpolator.apply(scale, arguments);
19100         }
19101
19102         function sequentialPow() {
19103           var scale = powish(transformer$2());
19104
19105           scale.copy = function() {
19106             return copy$2(scale, sequentialPow()).exponent(scale.exponent());
19107           };
19108
19109           return initInterpolator.apply(scale, arguments);
19110         }
19111
19112         function sequentialSqrt() {
19113           return sequentialPow.apply(null, arguments).exponent(0.5);
19114         }
19115
19116         function sequentialQuantile() {
19117           var domain = [],
19118               interpolator = identity$5;
19119
19120           function scale(x) {
19121             if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1));
19122           }
19123
19124           scale.domain = function(_) {
19125             if (!arguments.length) return domain.slice();
19126             domain = [];
19127             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
19128             domain.sort(d3_ascending);
19129             return scale;
19130           };
19131
19132           scale.interpolator = function(_) {
19133             return arguments.length ? (interpolator = _, scale) : interpolator;
19134           };
19135
19136           scale.copy = function() {
19137             return sequentialQuantile(interpolator).domain(domain);
19138           };
19139
19140           return initInterpolator.apply(scale, arguments);
19141         }
19142
19143         function transformer$3() {
19144           var x0 = 0,
19145               x1 = 0.5,
19146               x2 = 1,
19147               t0,
19148               t1,
19149               t2,
19150               k10,
19151               k21,
19152               interpolator = identity$5,
19153               transform,
19154               clamp = false,
19155               unknown;
19156
19157           function scale(x) {
19158             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));
19159           }
19160
19161           scale.domain = function(_) {
19162             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];
19163           };
19164
19165           scale.clamp = function(_) {
19166             return arguments.length ? (clamp = !!_, scale) : clamp;
19167           };
19168
19169           scale.interpolator = function(_) {
19170             return arguments.length ? (interpolator = _, scale) : interpolator;
19171           };
19172
19173           scale.unknown = function(_) {
19174             return arguments.length ? (unknown = _, scale) : unknown;
19175           };
19176
19177           return function(t) {
19178             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);
19179             return scale;
19180           };
19181         }
19182
19183         function diverging() {
19184           var scale = linearish(transformer$3()(identity$5));
19185
19186           scale.copy = function() {
19187             return copy$2(scale, diverging());
19188           };
19189
19190           return initInterpolator.apply(scale, arguments);
19191         }
19192
19193         function divergingLog() {
19194           var scale = loggish(transformer$3()).domain([0.1, 1, 10]);
19195
19196           scale.copy = function() {
19197             return copy$2(scale, divergingLog()).base(scale.base());
19198           };
19199
19200           return initInterpolator.apply(scale, arguments);
19201         }
19202
19203         function divergingSymlog() {
19204           var scale = symlogish(transformer$3());
19205
19206           scale.copy = function() {
19207             return copy$2(scale, divergingSymlog()).constant(scale.constant());
19208           };
19209
19210           return initInterpolator.apply(scale, arguments);
19211         }
19212
19213         function divergingPow() {
19214           var scale = powish(transformer$3());
19215
19216           scale.copy = function() {
19217             return copy$2(scale, divergingPow()).exponent(scale.exponent());
19218           };
19219
19220           return initInterpolator.apply(scale, arguments);
19221         }
19222
19223         function divergingSqrt() {
19224           return divergingPow.apply(null, arguments).exponent(0.5);
19225         }
19226
19227         function colors(specifier) {
19228           var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
19229           while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
19230           return colors;
19231         }
19232
19233         var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
19234
19235         var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
19236
19237         var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
19238
19239         var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
19240
19241         var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
19242
19243         var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
19244
19245         var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
19246
19247         var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
19248
19249         var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
19250
19251         function ramp(scheme) {
19252           return rgbBasis(scheme[scheme.length - 1]);
19253         }
19254
19255         var scheme = new Array(3).concat(
19256           "d8b365f5f5f55ab4ac",
19257           "a6611adfc27d80cdc1018571",
19258           "a6611adfc27df5f5f580cdc1018571",
19259           "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
19260           "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
19261           "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
19262           "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
19263           "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
19264           "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
19265         ).map(colors);
19266
19267         var BrBG = ramp(scheme);
19268
19269         var scheme$1 = new Array(3).concat(
19270           "af8dc3f7f7f77fbf7b",
19271           "7b3294c2a5cfa6dba0008837",
19272           "7b3294c2a5cff7f7f7a6dba0008837",
19273           "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
19274           "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
19275           "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
19276           "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
19277           "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
19278           "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
19279         ).map(colors);
19280
19281         var PRGn = ramp(scheme$1);
19282
19283         var scheme$2 = new Array(3).concat(
19284           "e9a3c9f7f7f7a1d76a",
19285           "d01c8bf1b6dab8e1864dac26",
19286           "d01c8bf1b6daf7f7f7b8e1864dac26",
19287           "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
19288           "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
19289           "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
19290           "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
19291           "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
19292           "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
19293         ).map(colors);
19294
19295         var PiYG = ramp(scheme$2);
19296
19297         var scheme$3 = new Array(3).concat(
19298           "998ec3f7f7f7f1a340",
19299           "5e3c99b2abd2fdb863e66101",
19300           "5e3c99b2abd2f7f7f7fdb863e66101",
19301           "542788998ec3d8daebfee0b6f1a340b35806",
19302           "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
19303           "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
19304           "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
19305           "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
19306           "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
19307         ).map(colors);
19308
19309         var PuOr = ramp(scheme$3);
19310
19311         var scheme$4 = new Array(3).concat(
19312           "ef8a62f7f7f767a9cf",
19313           "ca0020f4a58292c5de0571b0",
19314           "ca0020f4a582f7f7f792c5de0571b0",
19315           "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
19316           "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
19317           "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
19318           "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
19319           "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
19320           "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
19321         ).map(colors);
19322
19323         var RdBu = ramp(scheme$4);
19324
19325         var scheme$5 = new Array(3).concat(
19326           "ef8a62ffffff999999",
19327           "ca0020f4a582bababa404040",
19328           "ca0020f4a582ffffffbababa404040",
19329           "b2182bef8a62fddbc7e0e0e09999994d4d4d",
19330           "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
19331           "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
19332           "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
19333           "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
19334           "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
19335         ).map(colors);
19336
19337         var RdGy = ramp(scheme$5);
19338
19339         var scheme$6 = new Array(3).concat(
19340           "fc8d59ffffbf91bfdb",
19341           "d7191cfdae61abd9e92c7bb6",
19342           "d7191cfdae61ffffbfabd9e92c7bb6",
19343           "d73027fc8d59fee090e0f3f891bfdb4575b4",
19344           "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
19345           "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
19346           "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
19347           "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
19348           "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
19349         ).map(colors);
19350
19351         var RdYlBu = ramp(scheme$6);
19352
19353         var scheme$7 = new Array(3).concat(
19354           "fc8d59ffffbf91cf60",
19355           "d7191cfdae61a6d96a1a9641",
19356           "d7191cfdae61ffffbfa6d96a1a9641",
19357           "d73027fc8d59fee08bd9ef8b91cf601a9850",
19358           "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
19359           "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
19360           "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
19361           "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
19362           "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
19363         ).map(colors);
19364
19365         var RdYlGn = ramp(scheme$7);
19366
19367         var scheme$8 = new Array(3).concat(
19368           "fc8d59ffffbf99d594",
19369           "d7191cfdae61abdda42b83ba",
19370           "d7191cfdae61ffffbfabdda42b83ba",
19371           "d53e4ffc8d59fee08be6f59899d5943288bd",
19372           "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
19373           "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
19374           "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
19375           "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
19376           "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
19377         ).map(colors);
19378
19379         var Spectral = ramp(scheme$8);
19380
19381         var scheme$9 = new Array(3).concat(
19382           "e5f5f999d8c92ca25f",
19383           "edf8fbb2e2e266c2a4238b45",
19384           "edf8fbb2e2e266c2a42ca25f006d2c",
19385           "edf8fbccece699d8c966c2a42ca25f006d2c",
19386           "edf8fbccece699d8c966c2a441ae76238b45005824",
19387           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
19388           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
19389         ).map(colors);
19390
19391         var BuGn = ramp(scheme$9);
19392
19393         var scheme$a = new Array(3).concat(
19394           "e0ecf49ebcda8856a7",
19395           "edf8fbb3cde38c96c688419d",
19396           "edf8fbb3cde38c96c68856a7810f7c",
19397           "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
19398           "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
19399           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
19400           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
19401         ).map(colors);
19402
19403         var BuPu = ramp(scheme$a);
19404
19405         var scheme$b = new Array(3).concat(
19406           "e0f3dba8ddb543a2ca",
19407           "f0f9e8bae4bc7bccc42b8cbe",
19408           "f0f9e8bae4bc7bccc443a2ca0868ac",
19409           "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
19410           "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19411           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19412           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
19413         ).map(colors);
19414
19415         var GnBu = ramp(scheme$b);
19416
19417         var scheme$c = new Array(3).concat(
19418           "fee8c8fdbb84e34a33",
19419           "fef0d9fdcc8afc8d59d7301f",
19420           "fef0d9fdcc8afc8d59e34a33b30000",
19421           "fef0d9fdd49efdbb84fc8d59e34a33b30000",
19422           "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
19423           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
19424           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
19425         ).map(colors);
19426
19427         var OrRd = ramp(scheme$c);
19428
19429         var scheme$d = new Array(3).concat(
19430           "ece2f0a6bddb1c9099",
19431           "f6eff7bdc9e167a9cf02818a",
19432           "f6eff7bdc9e167a9cf1c9099016c59",
19433           "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
19434           "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
19435           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
19436           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
19437         ).map(colors);
19438
19439         var PuBuGn = ramp(scheme$d);
19440
19441         var scheme$e = new Array(3).concat(
19442           "ece7f2a6bddb2b8cbe",
19443           "f1eef6bdc9e174a9cf0570b0",
19444           "f1eef6bdc9e174a9cf2b8cbe045a8d",
19445           "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
19446           "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19447           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19448           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
19449         ).map(colors);
19450
19451         var PuBu = ramp(scheme$e);
19452
19453         var scheme$f = new Array(3).concat(
19454           "e7e1efc994c7dd1c77",
19455           "f1eef6d7b5d8df65b0ce1256",
19456           "f1eef6d7b5d8df65b0dd1c77980043",
19457           "f1eef6d4b9dac994c7df65b0dd1c77980043",
19458           "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
19459           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
19460           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
19461         ).map(colors);
19462
19463         var PuRd = ramp(scheme$f);
19464
19465         var scheme$g = new Array(3).concat(
19466           "fde0ddfa9fb5c51b8a",
19467           "feebe2fbb4b9f768a1ae017e",
19468           "feebe2fbb4b9f768a1c51b8a7a0177",
19469           "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
19470           "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19471           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19472           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
19473         ).map(colors);
19474
19475         var RdPu = ramp(scheme$g);
19476
19477         var scheme$h = new Array(3).concat(
19478           "edf8b17fcdbb2c7fb8",
19479           "ffffcca1dab441b6c4225ea8",
19480           "ffffcca1dab441b6c42c7fb8253494",
19481           "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
19482           "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19483           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19484           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
19485         ).map(colors);
19486
19487         var YlGnBu = ramp(scheme$h);
19488
19489         var scheme$i = new Array(3).concat(
19490           "f7fcb9addd8e31a354",
19491           "ffffccc2e69978c679238443",
19492           "ffffccc2e69978c67931a354006837",
19493           "ffffccd9f0a3addd8e78c67931a354006837",
19494           "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
19495           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
19496           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
19497         ).map(colors);
19498
19499         var YlGn = ramp(scheme$i);
19500
19501         var scheme$j = new Array(3).concat(
19502           "fff7bcfec44fd95f0e",
19503           "ffffd4fed98efe9929cc4c02",
19504           "ffffd4fed98efe9929d95f0e993404",
19505           "ffffd4fee391fec44ffe9929d95f0e993404",
19506           "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
19507           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
19508           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
19509         ).map(colors);
19510
19511         var YlOrBr = ramp(scheme$j);
19512
19513         var scheme$k = new Array(3).concat(
19514           "ffeda0feb24cf03b20",
19515           "ffffb2fecc5cfd8d3ce31a1c",
19516           "ffffb2fecc5cfd8d3cf03b20bd0026",
19517           "ffffb2fed976feb24cfd8d3cf03b20bd0026",
19518           "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19519           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19520           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
19521         ).map(colors);
19522
19523         var YlOrRd = ramp(scheme$k);
19524
19525         var scheme$l = new Array(3).concat(
19526           "deebf79ecae13182bd",
19527           "eff3ffbdd7e76baed62171b5",
19528           "eff3ffbdd7e76baed63182bd08519c",
19529           "eff3ffc6dbef9ecae16baed63182bd08519c",
19530           "eff3ffc6dbef9ecae16baed64292c62171b5084594",
19531           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
19532           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
19533         ).map(colors);
19534
19535         var Blues = ramp(scheme$l);
19536
19537         var scheme$m = new Array(3).concat(
19538           "e5f5e0a1d99b31a354",
19539           "edf8e9bae4b374c476238b45",
19540           "edf8e9bae4b374c47631a354006d2c",
19541           "edf8e9c7e9c0a1d99b74c47631a354006d2c",
19542           "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
19543           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
19544           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
19545         ).map(colors);
19546
19547         var Greens = ramp(scheme$m);
19548
19549         var scheme$n = new Array(3).concat(
19550           "f0f0f0bdbdbd636363",
19551           "f7f7f7cccccc969696525252",
19552           "f7f7f7cccccc969696636363252525",
19553           "f7f7f7d9d9d9bdbdbd969696636363252525",
19554           "f7f7f7d9d9d9bdbdbd969696737373525252252525",
19555           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
19556           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
19557         ).map(colors);
19558
19559         var Greys = ramp(scheme$n);
19560
19561         var scheme$o = new Array(3).concat(
19562           "efedf5bcbddc756bb1",
19563           "f2f0f7cbc9e29e9ac86a51a3",
19564           "f2f0f7cbc9e29e9ac8756bb154278f",
19565           "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
19566           "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
19567           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
19568           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
19569         ).map(colors);
19570
19571         var Purples = ramp(scheme$o);
19572
19573         var scheme$p = new Array(3).concat(
19574           "fee0d2fc9272de2d26",
19575           "fee5d9fcae91fb6a4acb181d",
19576           "fee5d9fcae91fb6a4ade2d26a50f15",
19577           "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
19578           "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19579           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19580           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
19581         ).map(colors);
19582
19583         var Reds = ramp(scheme$p);
19584
19585         var scheme$q = new Array(3).concat(
19586           "fee6cefdae6be6550d",
19587           "feeddefdbe85fd8d3cd94701",
19588           "feeddefdbe85fd8d3ce6550da63603",
19589           "feeddefdd0a2fdae6bfd8d3ce6550da63603",
19590           "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19591           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19592           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
19593         ).map(colors);
19594
19595         var Oranges = ramp(scheme$q);
19596
19597         var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
19598
19599         var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19600
19601         var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19602
19603         var c = cubehelix();
19604
19605         function rainbow(t) {
19606           if (t < 0 || t > 1) t -= Math.floor(t);
19607           var ts = Math.abs(t - 0.5);
19608           c.h = 360 * t - 100;
19609           c.s = 1.5 - 1.5 * ts;
19610           c.l = 0.8 - 0.9 * ts;
19611           return c + "";
19612         }
19613
19614         var c$1 = rgb(),
19615             pi_1_3 = Math.PI / 3,
19616             pi_2_3 = Math.PI * 2 / 3;
19617
19618         function sinebow(t) {
19619           var x;
19620           t = (0.5 - t) * Math.PI;
19621           c$1.r = 255 * (x = Math.sin(t)) * x;
19622           c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
19623           c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
19624           return c$1 + "";
19625         }
19626
19627         function ramp$1(range) {
19628           var n = range.length;
19629           return function(t) {
19630             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
19631           };
19632         }
19633
19634         var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
19635
19636         var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
19637
19638         var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
19639
19640         var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
19641
19642         function constant$b(x) {
19643           return function constant() {
19644             return x;
19645           };
19646         }
19647
19648         var abs$3 = Math.abs;
19649         var atan2$1 = Math.atan2;
19650         var cos$2 = Math.cos;
19651         var max$4 = Math.max;
19652         var min$1 = Math.min;
19653         var sin$2 = Math.sin;
19654         var sqrt$2 = Math.sqrt;
19655
19656         var epsilon$3 = 1e-12;
19657         var pi$4 = Math.PI;
19658         var halfPi$3 = pi$4 / 2;
19659         var tau$4 = 2 * pi$4;
19660
19661         function acos$1(x) {
19662           return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
19663         }
19664
19665         function asin$1(x) {
19666           return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
19667         }
19668
19669         function arcInnerRadius(d) {
19670           return d.innerRadius;
19671         }
19672
19673         function arcOuterRadius(d) {
19674           return d.outerRadius;
19675         }
19676
19677         function arcStartAngle(d) {
19678           return d.startAngle;
19679         }
19680
19681         function arcEndAngle(d) {
19682           return d.endAngle;
19683         }
19684
19685         function arcPadAngle(d) {
19686           return d && d.padAngle; // Note: optional!
19687         }
19688
19689         function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
19690           var x10 = x1 - x0, y10 = y1 - y0,
19691               x32 = x3 - x2, y32 = y3 - y2,
19692               t = y32 * x10 - x32 * y10;
19693           if (t * t < epsilon$3) return;
19694           t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
19695           return [x0 + t * x10, y0 + t * y10];
19696         }
19697
19698         // Compute perpendicular offset line of length rc.
19699         // http://mathworld.wolfram.com/Circle-LineIntersection.html
19700         function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
19701           var x01 = x0 - x1,
19702               y01 = y0 - y1,
19703               lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
19704               ox = lo * y01,
19705               oy = -lo * x01,
19706               x11 = x0 + ox,
19707               y11 = y0 + oy,
19708               x10 = x1 + ox,
19709               y10 = y1 + oy,
19710               x00 = (x11 + x10) / 2,
19711               y00 = (y11 + y10) / 2,
19712               dx = x10 - x11,
19713               dy = y10 - y11,
19714               d2 = dx * dx + dy * dy,
19715               r = r1 - rc,
19716               D = x11 * y10 - x10 * y11,
19717               d = (dy < 0 ? -1 : 1) * sqrt$2(max$4(0, r * r * d2 - D * D)),
19718               cx0 = (D * dy - dx * d) / d2,
19719               cy0 = (-D * dx - dy * d) / d2,
19720               cx1 = (D * dy + dx * d) / d2,
19721               cy1 = (-D * dx + dy * d) / d2,
19722               dx0 = cx0 - x00,
19723               dy0 = cy0 - y00,
19724               dx1 = cx1 - x00,
19725               dy1 = cy1 - y00;
19726
19727           // Pick the closer of the two intersection points.
19728           // TODO Is there a faster way to determine which intersection to use?
19729           if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
19730
19731           return {
19732             cx: cx0,
19733             cy: cy0,
19734             x01: -ox,
19735             y01: -oy,
19736             x11: cx0 * (r1 / r - 1),
19737             y11: cy0 * (r1 / r - 1)
19738           };
19739         }
19740
19741         function arc() {
19742           var innerRadius = arcInnerRadius,
19743               outerRadius = arcOuterRadius,
19744               cornerRadius = constant$b(0),
19745               padRadius = null,
19746               startAngle = arcStartAngle,
19747               endAngle = arcEndAngle,
19748               padAngle = arcPadAngle,
19749               context = null;
19750
19751           function arc() {
19752             var buffer,
19753                 r,
19754                 r0 = +innerRadius.apply(this, arguments),
19755                 r1 = +outerRadius.apply(this, arguments),
19756                 a0 = startAngle.apply(this, arguments) - halfPi$3,
19757                 a1 = endAngle.apply(this, arguments) - halfPi$3,
19758                 da = abs$3(a1 - a0),
19759                 cw = a1 > a0;
19760
19761             if (!context) context = buffer = path();
19762
19763             // Ensure that the outer radius is always larger than the inner radius.
19764             if (r1 < r0) r = r1, r1 = r0, r0 = r;
19765
19766             // Is it a point?
19767             if (!(r1 > epsilon$3)) context.moveTo(0, 0);
19768
19769             // Or is it a circle or annulus?
19770             else if (da > tau$4 - epsilon$3) {
19771               context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
19772               context.arc(0, 0, r1, a0, a1, !cw);
19773               if (r0 > epsilon$3) {
19774                 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
19775                 context.arc(0, 0, r0, a1, a0, cw);
19776               }
19777             }
19778
19779             // Or is it a circular or annular sector?
19780             else {
19781               var a01 = a0,
19782                   a11 = a1,
19783                   a00 = a0,
19784                   a10 = a1,
19785                   da0 = da,
19786                   da1 = da,
19787                   ap = padAngle.apply(this, arguments) / 2,
19788                   rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
19789                   rc = min$1(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
19790                   rc0 = rc,
19791                   rc1 = rc,
19792                   t0,
19793                   t1;
19794
19795               // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
19796               if (rp > epsilon$3) {
19797                 var p0 = asin$1(rp / r0 * sin$2(ap)),
19798                     p1 = asin$1(rp / r1 * sin$2(ap));
19799                 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
19800                 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
19801                 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
19802                 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
19803               }
19804
19805               var x01 = r1 * cos$2(a01),
19806                   y01 = r1 * sin$2(a01),
19807                   x10 = r0 * cos$2(a10),
19808                   y10 = r0 * sin$2(a10);
19809
19810               // Apply rounded corners?
19811               if (rc > epsilon$3) {
19812                 var x11 = r1 * cos$2(a11),
19813                     y11 = r1 * sin$2(a11),
19814                     x00 = r0 * cos$2(a00),
19815                     y00 = r0 * sin$2(a00),
19816                     oc;
19817
19818                 // Restrict the corner radius according to the sector angle.
19819                 if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
19820                   var ax = x01 - oc[0],
19821                       ay = y01 - oc[1],
19822                       bx = x11 - oc[0],
19823                       by = y11 - oc[1],
19824                       kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
19825                       lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
19826                   rc0 = min$1(rc, (r0 - lc) / (kc - 1));
19827                   rc1 = min$1(rc, (r1 - lc) / (kc + 1));
19828                 }
19829               }
19830
19831               // Is the sector collapsed to a line?
19832               if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
19833
19834               // Does the sector’s outer ring have rounded corners?
19835               else if (rc1 > epsilon$3) {
19836                 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
19837                 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
19838
19839                 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
19840
19841                 // Have the corners merged?
19842                 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19843
19844                 // Otherwise, draw the two corners and the ring.
19845                 else {
19846                   context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19847                   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);
19848                   context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19849                 }
19850               }
19851
19852               // Or is the outer ring just a circular arc?
19853               else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
19854
19855               // Is there no inner ring, and it’s a circular sector?
19856               // Or perhaps it’s an annular sector collapsed due to padding?
19857               if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
19858
19859               // Does the sector’s inner ring (or point) have rounded corners?
19860               else if (rc0 > epsilon$3) {
19861                 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
19862                 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
19863
19864                 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
19865
19866                 // Have the corners merged?
19867                 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19868
19869                 // Otherwise, draw the two corners and the ring.
19870                 else {
19871                   context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19872                   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);
19873                   context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19874                 }
19875               }
19876
19877               // Or is the inner ring just a circular arc?
19878               else context.arc(0, 0, r0, a10, a00, cw);
19879             }
19880
19881             context.closePath();
19882
19883             if (buffer) return context = null, buffer + "" || null;
19884           }
19885
19886           arc.centroid = function() {
19887             var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
19888                 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
19889             return [cos$2(a) * r, sin$2(a) * r];
19890           };
19891
19892           arc.innerRadius = function(_) {
19893             return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius;
19894           };
19895
19896           arc.outerRadius = function(_) {
19897             return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius;
19898           };
19899
19900           arc.cornerRadius = function(_) {
19901             return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius;
19902           };
19903
19904           arc.padRadius = function(_) {
19905             return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius;
19906           };
19907
19908           arc.startAngle = function(_) {
19909             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle;
19910           };
19911
19912           arc.endAngle = function(_) {
19913             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle;
19914           };
19915
19916           arc.padAngle = function(_) {
19917             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle;
19918           };
19919
19920           arc.context = function(_) {
19921             return arguments.length ? ((context = _ == null ? null : _), arc) : context;
19922           };
19923
19924           return arc;
19925         }
19926
19927         function Linear(context) {
19928           this._context = context;
19929         }
19930
19931         Linear.prototype = {
19932           areaStart: function() {
19933             this._line = 0;
19934           },
19935           areaEnd: function() {
19936             this._line = NaN;
19937           },
19938           lineStart: function() {
19939             this._point = 0;
19940           },
19941           lineEnd: function() {
19942             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
19943             this._line = 1 - this._line;
19944           },
19945           point: function(x, y) {
19946             x = +x, y = +y;
19947             switch (this._point) {
19948               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
19949               case 1: this._point = 2; // proceed
19950               default: this._context.lineTo(x, y); break;
19951             }
19952           }
19953         };
19954
19955         function curveLinear(context) {
19956           return new Linear(context);
19957         }
19958
19959         function x$3(p) {
19960           return p[0];
19961         }
19962
19963         function y$3(p) {
19964           return p[1];
19965         }
19966
19967         function line() {
19968           var x = x$3,
19969               y = y$3,
19970               defined = constant$b(true),
19971               context = null,
19972               curve = curveLinear,
19973               output = null;
19974
19975           function line(data) {
19976             var i,
19977                 n = data.length,
19978                 d,
19979                 defined0 = false,
19980                 buffer;
19981
19982             if (context == null) output = curve(buffer = path());
19983
19984             for (i = 0; i <= n; ++i) {
19985               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
19986                 if (defined0 = !defined0) output.lineStart();
19987                 else output.lineEnd();
19988               }
19989               if (defined0) output.point(+x(d, i, data), +y(d, i, data));
19990             }
19991
19992             if (buffer) return output = null, buffer + "" || null;
19993           }
19994
19995           line.x = function(_) {
19996             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x;
19997           };
19998
19999           line.y = function(_) {
20000             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y;
20001           };
20002
20003           line.defined = function(_) {
20004             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined;
20005           };
20006
20007           line.curve = function(_) {
20008             return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
20009           };
20010
20011           line.context = function(_) {
20012             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
20013           };
20014
20015           return line;
20016         }
20017
20018         function area$1() {
20019           var x0 = x$3,
20020               x1 = null,
20021               y0 = constant$b(0),
20022               y1 = y$3,
20023               defined = constant$b(true),
20024               context = null,
20025               curve = curveLinear,
20026               output = null;
20027
20028           function area(data) {
20029             var i,
20030                 j,
20031                 k,
20032                 n = data.length,
20033                 d,
20034                 defined0 = false,
20035                 buffer,
20036                 x0z = new Array(n),
20037                 y0z = new Array(n);
20038
20039             if (context == null) output = curve(buffer = path());
20040
20041             for (i = 0; i <= n; ++i) {
20042               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20043                 if (defined0 = !defined0) {
20044                   j = i;
20045                   output.areaStart();
20046                   output.lineStart();
20047                 } else {
20048                   output.lineEnd();
20049                   output.lineStart();
20050                   for (k = i - 1; k >= j; --k) {
20051                     output.point(x0z[k], y0z[k]);
20052                   }
20053                   output.lineEnd();
20054                   output.areaEnd();
20055                 }
20056               }
20057               if (defined0) {
20058                 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
20059                 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
20060               }
20061             }
20062
20063             if (buffer) return output = null, buffer + "" || null;
20064           }
20065
20066           function arealine() {
20067             return line().defined(defined).curve(curve).context(context);
20068           }
20069
20070           area.x = function(_) {
20071             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0;
20072           };
20073
20074           area.x0 = function(_) {
20075             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0;
20076           };
20077
20078           area.x1 = function(_) {
20079             return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1;
20080           };
20081
20082           area.y = function(_) {
20083             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0;
20084           };
20085
20086           area.y0 = function(_) {
20087             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0;
20088           };
20089
20090           area.y1 = function(_) {
20091             return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1;
20092           };
20093
20094           area.lineX0 =
20095           area.lineY0 = function() {
20096             return arealine().x(x0).y(y0);
20097           };
20098
20099           area.lineY1 = function() {
20100             return arealine().x(x0).y(y1);
20101           };
20102
20103           area.lineX1 = function() {
20104             return arealine().x(x1).y(y0);
20105           };
20106
20107           area.defined = function(_) {
20108             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined;
20109           };
20110
20111           area.curve = function(_) {
20112             return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
20113           };
20114
20115           area.context = function(_) {
20116             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
20117           };
20118
20119           return area;
20120         }
20121
20122         function descending(a, b) {
20123           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
20124         }
20125
20126         function identity$7(d) {
20127           return d;
20128         }
20129
20130         function pie() {
20131           var value = identity$7,
20132               sortValues = descending,
20133               sort = null,
20134               startAngle = constant$b(0),
20135               endAngle = constant$b(tau$4),
20136               padAngle = constant$b(0);
20137
20138           function pie(data) {
20139             var i,
20140                 n = data.length,
20141                 j,
20142                 k,
20143                 sum = 0,
20144                 index = new Array(n),
20145                 arcs = new Array(n),
20146                 a0 = +startAngle.apply(this, arguments),
20147                 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
20148                 a1,
20149                 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
20150                 pa = p * (da < 0 ? -1 : 1),
20151                 v;
20152
20153             for (i = 0; i < n; ++i) {
20154               if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
20155                 sum += v;
20156               }
20157             }
20158
20159             // Optionally sort the arcs by previously-computed values or by data.
20160             if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
20161             else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
20162
20163             // Compute the arcs! They are stored in the original data's order.
20164             for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
20165               j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
20166                 data: data[j],
20167                 index: i,
20168                 value: v,
20169                 startAngle: a0,
20170                 endAngle: a1,
20171                 padAngle: p
20172               };
20173             }
20174
20175             return arcs;
20176           }
20177
20178           pie.value = function(_) {
20179             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value;
20180           };
20181
20182           pie.sortValues = function(_) {
20183             return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
20184           };
20185
20186           pie.sort = function(_) {
20187             return arguments.length ? (sort = _, sortValues = null, pie) : sort;
20188           };
20189
20190           pie.startAngle = function(_) {
20191             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle;
20192           };
20193
20194           pie.endAngle = function(_) {
20195             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle;
20196           };
20197
20198           pie.padAngle = function(_) {
20199             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle;
20200           };
20201
20202           return pie;
20203         }
20204
20205         var curveRadialLinear = curveRadial(curveLinear);
20206
20207         function Radial(curve) {
20208           this._curve = curve;
20209         }
20210
20211         Radial.prototype = {
20212           areaStart: function() {
20213             this._curve.areaStart();
20214           },
20215           areaEnd: function() {
20216             this._curve.areaEnd();
20217           },
20218           lineStart: function() {
20219             this._curve.lineStart();
20220           },
20221           lineEnd: function() {
20222             this._curve.lineEnd();
20223           },
20224           point: function(a, r) {
20225             this._curve.point(r * Math.sin(a), r * -Math.cos(a));
20226           }
20227         };
20228
20229         function curveRadial(curve) {
20230
20231           function radial(context) {
20232             return new Radial(curve(context));
20233           }
20234
20235           radial._curve = curve;
20236
20237           return radial;
20238         }
20239
20240         function lineRadial(l) {
20241           var c = l.curve;
20242
20243           l.angle = l.x, delete l.x;
20244           l.radius = l.y, delete l.y;
20245
20246           l.curve = function(_) {
20247             return arguments.length ? c(curveRadial(_)) : c()._curve;
20248           };
20249
20250           return l;
20251         }
20252
20253         function lineRadial$1() {
20254           return lineRadial(line().curve(curveRadialLinear));
20255         }
20256
20257         function areaRadial() {
20258           var a = area$1().curve(curveRadialLinear),
20259               c = a.curve,
20260               x0 = a.lineX0,
20261               x1 = a.lineX1,
20262               y0 = a.lineY0,
20263               y1 = a.lineY1;
20264
20265           a.angle = a.x, delete a.x;
20266           a.startAngle = a.x0, delete a.x0;
20267           a.endAngle = a.x1, delete a.x1;
20268           a.radius = a.y, delete a.y;
20269           a.innerRadius = a.y0, delete a.y0;
20270           a.outerRadius = a.y1, delete a.y1;
20271           a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
20272           a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
20273           a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
20274           a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
20275
20276           a.curve = function(_) {
20277             return arguments.length ? c(curveRadial(_)) : c()._curve;
20278           };
20279
20280           return a;
20281         }
20282
20283         function pointRadial(x, y) {
20284           return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
20285         }
20286
20287         var slice$a = Array.prototype.slice;
20288
20289         function linkSource(d) {
20290           return d.source;
20291         }
20292
20293         function linkTarget(d) {
20294           return d.target;
20295         }
20296
20297         function link$2(curve) {
20298           var source = linkSource,
20299               target = linkTarget,
20300               x = x$3,
20301               y = y$3,
20302               context = null;
20303
20304           function link() {
20305             var buffer, argv = slice$a.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
20306             if (!context) context = buffer = path();
20307             curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
20308             if (buffer) return context = null, buffer + "" || null;
20309           }
20310
20311           link.source = function(_) {
20312             return arguments.length ? (source = _, link) : source;
20313           };
20314
20315           link.target = function(_) {
20316             return arguments.length ? (target = _, link) : target;
20317           };
20318
20319           link.x = function(_) {
20320             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x;
20321           };
20322
20323           link.y = function(_) {
20324             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y;
20325           };
20326
20327           link.context = function(_) {
20328             return arguments.length ? ((context = _ == null ? null : _), link) : context;
20329           };
20330
20331           return link;
20332         }
20333
20334         function curveHorizontal(context, x0, y0, x1, y1) {
20335           context.moveTo(x0, y0);
20336           context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
20337         }
20338
20339         function curveVertical(context, x0, y0, x1, y1) {
20340           context.moveTo(x0, y0);
20341           context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
20342         }
20343
20344         function curveRadial$1(context, x0, y0, x1, y1) {
20345           var p0 = pointRadial(x0, y0),
20346               p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
20347               p2 = pointRadial(x1, y0),
20348               p3 = pointRadial(x1, y1);
20349           context.moveTo(p0[0], p0[1]);
20350           context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
20351         }
20352
20353         function linkHorizontal() {
20354           return link$2(curveHorizontal);
20355         }
20356
20357         function linkVertical() {
20358           return link$2(curveVertical);
20359         }
20360
20361         function linkRadial() {
20362           var l = link$2(curveRadial$1);
20363           l.angle = l.x, delete l.x;
20364           l.radius = l.y, delete l.y;
20365           return l;
20366         }
20367
20368         var circle$2 = {
20369           draw: function(context, size) {
20370             var r = Math.sqrt(size / pi$4);
20371             context.moveTo(r, 0);
20372             context.arc(0, 0, r, 0, tau$4);
20373           }
20374         };
20375
20376         var cross$2 = {
20377           draw: function(context, size) {
20378             var r = Math.sqrt(size / 5) / 2;
20379             context.moveTo(-3 * r, -r);
20380             context.lineTo(-r, -r);
20381             context.lineTo(-r, -3 * r);
20382             context.lineTo(r, -3 * r);
20383             context.lineTo(r, -r);
20384             context.lineTo(3 * r, -r);
20385             context.lineTo(3 * r, r);
20386             context.lineTo(r, r);
20387             context.lineTo(r, 3 * r);
20388             context.lineTo(-r, 3 * r);
20389             context.lineTo(-r, r);
20390             context.lineTo(-3 * r, r);
20391             context.closePath();
20392           }
20393         };
20394
20395         var tan30 = Math.sqrt(1 / 3),
20396             tan30_2 = tan30 * 2;
20397
20398         var diamond = {
20399           draw: function(context, size) {
20400             var y = Math.sqrt(size / tan30_2),
20401                 x = y * tan30;
20402             context.moveTo(0, -y);
20403             context.lineTo(x, 0);
20404             context.lineTo(0, y);
20405             context.lineTo(-x, 0);
20406             context.closePath();
20407           }
20408         };
20409
20410         var ka = 0.89081309152928522810,
20411             kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
20412             kx = Math.sin(tau$4 / 10) * kr,
20413             ky = -Math.cos(tau$4 / 10) * kr;
20414
20415         var star = {
20416           draw: function(context, size) {
20417             var r = Math.sqrt(size * ka),
20418                 x = kx * r,
20419                 y = ky * r;
20420             context.moveTo(0, -r);
20421             context.lineTo(x, y);
20422             for (var i = 1; i < 5; ++i) {
20423               var a = tau$4 * i / 5,
20424                   c = Math.cos(a),
20425                   s = Math.sin(a);
20426               context.lineTo(s * r, -c * r);
20427               context.lineTo(c * x - s * y, s * x + c * y);
20428             }
20429             context.closePath();
20430           }
20431         };
20432
20433         var square = {
20434           draw: function(context, size) {
20435             var w = Math.sqrt(size),
20436                 x = -w / 2;
20437             context.rect(x, x, w, w);
20438           }
20439         };
20440
20441         var sqrt3 = Math.sqrt(3);
20442
20443         var triangle = {
20444           draw: function(context, size) {
20445             var y = -Math.sqrt(size / (sqrt3 * 3));
20446             context.moveTo(0, y * 2);
20447             context.lineTo(-sqrt3 * y, -y);
20448             context.lineTo(sqrt3 * y, -y);
20449             context.closePath();
20450           }
20451         };
20452
20453         var c$2 = -0.5,
20454             s = Math.sqrt(3) / 2,
20455             k = 1 / Math.sqrt(12),
20456             a = (k / 2 + 1) * 3;
20457
20458         var wye = {
20459           draw: function(context, size) {
20460             var r = Math.sqrt(size / a),
20461                 x0 = r / 2,
20462                 y0 = r * k,
20463                 x1 = x0,
20464                 y1 = r * k + r,
20465                 x2 = -x1,
20466                 y2 = y1;
20467             context.moveTo(x0, y0);
20468             context.lineTo(x1, y1);
20469             context.lineTo(x2, y2);
20470             context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0);
20471             context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1);
20472             context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2);
20473             context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0);
20474             context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1);
20475             context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2);
20476             context.closePath();
20477           }
20478         };
20479
20480         var symbols = [
20481           circle$2,
20482           cross$2,
20483           diamond,
20484           square,
20485           star,
20486           triangle,
20487           wye
20488         ];
20489
20490         function symbol() {
20491           var type = constant$b(circle$2),
20492               size = constant$b(64),
20493               context = null;
20494
20495           function symbol() {
20496             var buffer;
20497             if (!context) context = buffer = path();
20498             type.apply(this, arguments).draw(context, +size.apply(this, arguments));
20499             if (buffer) return context = null, buffer + "" || null;
20500           }
20501
20502           symbol.type = function(_) {
20503             return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type;
20504           };
20505
20506           symbol.size = function(_) {
20507             return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size;
20508           };
20509
20510           symbol.context = function(_) {
20511             return arguments.length ? (context = _ == null ? null : _, symbol) : context;
20512           };
20513
20514           return symbol;
20515         }
20516
20517         function noop$5() {}
20518
20519         function point$2(that, x, y) {
20520           that._context.bezierCurveTo(
20521             (2 * that._x0 + that._x1) / 3,
20522             (2 * that._y0 + that._y1) / 3,
20523             (that._x0 + 2 * that._x1) / 3,
20524             (that._y0 + 2 * that._y1) / 3,
20525             (that._x0 + 4 * that._x1 + x) / 6,
20526             (that._y0 + 4 * that._y1 + y) / 6
20527           );
20528         }
20529
20530         function Basis(context) {
20531           this._context = context;
20532         }
20533
20534         Basis.prototype = {
20535           areaStart: function() {
20536             this._line = 0;
20537           },
20538           areaEnd: function() {
20539             this._line = NaN;
20540           },
20541           lineStart: function() {
20542             this._x0 = this._x1 =
20543             this._y0 = this._y1 = NaN;
20544             this._point = 0;
20545           },
20546           lineEnd: function() {
20547             switch (this._point) {
20548               case 3: point$2(this, this._x1, this._y1); // proceed
20549               case 2: this._context.lineTo(this._x1, this._y1); break;
20550             }
20551             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20552             this._line = 1 - this._line;
20553           },
20554           point: function(x, y) {
20555             x = +x, y = +y;
20556             switch (this._point) {
20557               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20558               case 1: this._point = 2; break;
20559               case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
20560               default: point$2(this, x, y); break;
20561             }
20562             this._x0 = this._x1, this._x1 = x;
20563             this._y0 = this._y1, this._y1 = y;
20564           }
20565         };
20566
20567         function basis$2(context) {
20568           return new Basis(context);
20569         }
20570
20571         function BasisClosed(context) {
20572           this._context = context;
20573         }
20574
20575         BasisClosed.prototype = {
20576           areaStart: noop$5,
20577           areaEnd: noop$5,
20578           lineStart: function() {
20579             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
20580             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
20581             this._point = 0;
20582           },
20583           lineEnd: function() {
20584             switch (this._point) {
20585               case 1: {
20586                 this._context.moveTo(this._x2, this._y2);
20587                 this._context.closePath();
20588                 break;
20589               }
20590               case 2: {
20591                 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
20592                 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
20593                 this._context.closePath();
20594                 break;
20595               }
20596               case 3: {
20597                 this.point(this._x2, this._y2);
20598                 this.point(this._x3, this._y3);
20599                 this.point(this._x4, this._y4);
20600                 break;
20601               }
20602             }
20603           },
20604           point: function(x, y) {
20605             x = +x, y = +y;
20606             switch (this._point) {
20607               case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
20608               case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
20609               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;
20610               default: point$2(this, x, y); break;
20611             }
20612             this._x0 = this._x1, this._x1 = x;
20613             this._y0 = this._y1, this._y1 = y;
20614           }
20615         };
20616
20617         function basisClosed$1(context) {
20618           return new BasisClosed(context);
20619         }
20620
20621         function BasisOpen(context) {
20622           this._context = context;
20623         }
20624
20625         BasisOpen.prototype = {
20626           areaStart: function() {
20627             this._line = 0;
20628           },
20629           areaEnd: function() {
20630             this._line = NaN;
20631           },
20632           lineStart: function() {
20633             this._x0 = this._x1 =
20634             this._y0 = this._y1 = NaN;
20635             this._point = 0;
20636           },
20637           lineEnd: function() {
20638             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20639             this._line = 1 - this._line;
20640           },
20641           point: function(x, y) {
20642             x = +x, y = +y;
20643             switch (this._point) {
20644               case 0: this._point = 1; break;
20645               case 1: this._point = 2; break;
20646               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;
20647               case 3: this._point = 4; // proceed
20648               default: point$2(this, x, y); break;
20649             }
20650             this._x0 = this._x1, this._x1 = x;
20651             this._y0 = this._y1, this._y1 = y;
20652           }
20653         };
20654
20655         function basisOpen(context) {
20656           return new BasisOpen(context);
20657         }
20658
20659         function Bundle(context, beta) {
20660           this._basis = new Basis(context);
20661           this._beta = beta;
20662         }
20663
20664         Bundle.prototype = {
20665           lineStart: function() {
20666             this._x = [];
20667             this._y = [];
20668             this._basis.lineStart();
20669           },
20670           lineEnd: function() {
20671             var x = this._x,
20672                 y = this._y,
20673                 j = x.length - 1;
20674
20675             if (j > 0) {
20676               var x0 = x[0],
20677                   y0 = y[0],
20678                   dx = x[j] - x0,
20679                   dy = y[j] - y0,
20680                   i = -1,
20681                   t;
20682
20683               while (++i <= j) {
20684                 t = i / j;
20685                 this._basis.point(
20686                   this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
20687                   this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
20688                 );
20689               }
20690             }
20691
20692             this._x = this._y = null;
20693             this._basis.lineEnd();
20694           },
20695           point: function(x, y) {
20696             this._x.push(+x);
20697             this._y.push(+y);
20698           }
20699         };
20700
20701         var bundle = (function custom(beta) {
20702
20703           function bundle(context) {
20704             return beta === 1 ? new Basis(context) : new Bundle(context, beta);
20705           }
20706
20707           bundle.beta = function(beta) {
20708             return custom(+beta);
20709           };
20710
20711           return bundle;
20712         })(0.85);
20713
20714         function point$3(that, x, y) {
20715           that._context.bezierCurveTo(
20716             that._x1 + that._k * (that._x2 - that._x0),
20717             that._y1 + that._k * (that._y2 - that._y0),
20718             that._x2 + that._k * (that._x1 - x),
20719             that._y2 + that._k * (that._y1 - y),
20720             that._x2,
20721             that._y2
20722           );
20723         }
20724
20725         function Cardinal(context, tension) {
20726           this._context = context;
20727           this._k = (1 - tension) / 6;
20728         }
20729
20730         Cardinal.prototype = {
20731           areaStart: function() {
20732             this._line = 0;
20733           },
20734           areaEnd: function() {
20735             this._line = NaN;
20736           },
20737           lineStart: function() {
20738             this._x0 = this._x1 = this._x2 =
20739             this._y0 = this._y1 = this._y2 = NaN;
20740             this._point = 0;
20741           },
20742           lineEnd: function() {
20743             switch (this._point) {
20744               case 2: this._context.lineTo(this._x2, this._y2); break;
20745               case 3: point$3(this, this._x1, this._y1); break;
20746             }
20747             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20748             this._line = 1 - this._line;
20749           },
20750           point: function(x, y) {
20751             x = +x, y = +y;
20752             switch (this._point) {
20753               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20754               case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
20755               case 2: this._point = 3; // proceed
20756               default: point$3(this, x, y); break;
20757             }
20758             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20759             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20760           }
20761         };
20762
20763         var cardinal = (function custom(tension) {
20764
20765           function cardinal(context) {
20766             return new Cardinal(context, tension);
20767           }
20768
20769           cardinal.tension = function(tension) {
20770             return custom(+tension);
20771           };
20772
20773           return cardinal;
20774         })(0);
20775
20776         function CardinalClosed(context, tension) {
20777           this._context = context;
20778           this._k = (1 - tension) / 6;
20779         }
20780
20781         CardinalClosed.prototype = {
20782           areaStart: noop$5,
20783           areaEnd: noop$5,
20784           lineStart: function() {
20785             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20786             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20787             this._point = 0;
20788           },
20789           lineEnd: function() {
20790             switch (this._point) {
20791               case 1: {
20792                 this._context.moveTo(this._x3, this._y3);
20793                 this._context.closePath();
20794                 break;
20795               }
20796               case 2: {
20797                 this._context.lineTo(this._x3, this._y3);
20798                 this._context.closePath();
20799                 break;
20800               }
20801               case 3: {
20802                 this.point(this._x3, this._y3);
20803                 this.point(this._x4, this._y4);
20804                 this.point(this._x5, this._y5);
20805                 break;
20806               }
20807             }
20808           },
20809           point: function(x, y) {
20810             x = +x, y = +y;
20811             switch (this._point) {
20812               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
20813               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
20814               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
20815               default: point$3(this, x, y); break;
20816             }
20817             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20818             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20819           }
20820         };
20821
20822         var cardinalClosed = (function custom(tension) {
20823
20824           function cardinal(context) {
20825             return new CardinalClosed(context, tension);
20826           }
20827
20828           cardinal.tension = function(tension) {
20829             return custom(+tension);
20830           };
20831
20832           return cardinal;
20833         })(0);
20834
20835         function CardinalOpen(context, tension) {
20836           this._context = context;
20837           this._k = (1 - tension) / 6;
20838         }
20839
20840         CardinalOpen.prototype = {
20841           areaStart: function() {
20842             this._line = 0;
20843           },
20844           areaEnd: function() {
20845             this._line = NaN;
20846           },
20847           lineStart: function() {
20848             this._x0 = this._x1 = this._x2 =
20849             this._y0 = this._y1 = this._y2 = NaN;
20850             this._point = 0;
20851           },
20852           lineEnd: function() {
20853             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20854             this._line = 1 - this._line;
20855           },
20856           point: function(x, y) {
20857             x = +x, y = +y;
20858             switch (this._point) {
20859               case 0: this._point = 1; break;
20860               case 1: this._point = 2; break;
20861               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
20862               case 3: this._point = 4; // proceed
20863               default: point$3(this, x, y); break;
20864             }
20865             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20866             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20867           }
20868         };
20869
20870         var cardinalOpen = (function custom(tension) {
20871
20872           function cardinal(context) {
20873             return new CardinalOpen(context, tension);
20874           }
20875
20876           cardinal.tension = function(tension) {
20877             return custom(+tension);
20878           };
20879
20880           return cardinal;
20881         })(0);
20882
20883         function point$4(that, x, y) {
20884           var x1 = that._x1,
20885               y1 = that._y1,
20886               x2 = that._x2,
20887               y2 = that._y2;
20888
20889           if (that._l01_a > epsilon$3) {
20890             var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
20891                 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
20892             x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
20893             y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
20894           }
20895
20896           if (that._l23_a > epsilon$3) {
20897             var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
20898                 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
20899             x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
20900             y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
20901           }
20902
20903           that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
20904         }
20905
20906         function CatmullRom(context, alpha) {
20907           this._context = context;
20908           this._alpha = alpha;
20909         }
20910
20911         CatmullRom.prototype = {
20912           areaStart: function() {
20913             this._line = 0;
20914           },
20915           areaEnd: function() {
20916             this._line = NaN;
20917           },
20918           lineStart: function() {
20919             this._x0 = this._x1 = this._x2 =
20920             this._y0 = this._y1 = this._y2 = NaN;
20921             this._l01_a = this._l12_a = this._l23_a =
20922             this._l01_2a = this._l12_2a = this._l23_2a =
20923             this._point = 0;
20924           },
20925           lineEnd: function() {
20926             switch (this._point) {
20927               case 2: this._context.lineTo(this._x2, this._y2); break;
20928               case 3: this.point(this._x2, this._y2); break;
20929             }
20930             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20931             this._line = 1 - this._line;
20932           },
20933           point: function(x, y) {
20934             x = +x, y = +y;
20935
20936             if (this._point) {
20937               var x23 = this._x2 - x,
20938                   y23 = this._y2 - y;
20939               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
20940             }
20941
20942             switch (this._point) {
20943               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20944               case 1: this._point = 2; break;
20945               case 2: this._point = 3; // proceed
20946               default: point$4(this, x, y); break;
20947             }
20948
20949             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
20950             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
20951             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20952             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20953           }
20954         };
20955
20956         var catmullRom = (function custom(alpha) {
20957
20958           function catmullRom(context) {
20959             return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
20960           }
20961
20962           catmullRom.alpha = function(alpha) {
20963             return custom(+alpha);
20964           };
20965
20966           return catmullRom;
20967         })(0.5);
20968
20969         function CatmullRomClosed(context, alpha) {
20970           this._context = context;
20971           this._alpha = alpha;
20972         }
20973
20974         CatmullRomClosed.prototype = {
20975           areaStart: noop$5,
20976           areaEnd: noop$5,
20977           lineStart: function() {
20978             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20979             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20980             this._l01_a = this._l12_a = this._l23_a =
20981             this._l01_2a = this._l12_2a = this._l23_2a =
20982             this._point = 0;
20983           },
20984           lineEnd: function() {
20985             switch (this._point) {
20986               case 1: {
20987                 this._context.moveTo(this._x3, this._y3);
20988                 this._context.closePath();
20989                 break;
20990               }
20991               case 2: {
20992                 this._context.lineTo(this._x3, this._y3);
20993                 this._context.closePath();
20994                 break;
20995               }
20996               case 3: {
20997                 this.point(this._x3, this._y3);
20998                 this.point(this._x4, this._y4);
20999                 this.point(this._x5, this._y5);
21000                 break;
21001               }
21002             }
21003           },
21004           point: function(x, y) {
21005             x = +x, y = +y;
21006
21007             if (this._point) {
21008               var x23 = this._x2 - x,
21009                   y23 = this._y2 - y;
21010               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21011             }
21012
21013             switch (this._point) {
21014               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
21015               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
21016               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
21017               default: point$4(this, x, y); break;
21018             }
21019
21020             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21021             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21022             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21023             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21024           }
21025         };
21026
21027         var catmullRomClosed = (function custom(alpha) {
21028
21029           function catmullRom(context) {
21030             return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
21031           }
21032
21033           catmullRom.alpha = function(alpha) {
21034             return custom(+alpha);
21035           };
21036
21037           return catmullRom;
21038         })(0.5);
21039
21040         function CatmullRomOpen(context, alpha) {
21041           this._context = context;
21042           this._alpha = alpha;
21043         }
21044
21045         CatmullRomOpen.prototype = {
21046           areaStart: function() {
21047             this._line = 0;
21048           },
21049           areaEnd: function() {
21050             this._line = NaN;
21051           },
21052           lineStart: function() {
21053             this._x0 = this._x1 = this._x2 =
21054             this._y0 = this._y1 = this._y2 = NaN;
21055             this._l01_a = this._l12_a = this._l23_a =
21056             this._l01_2a = this._l12_2a = this._l23_2a =
21057             this._point = 0;
21058           },
21059           lineEnd: function() {
21060             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21061             this._line = 1 - this._line;
21062           },
21063           point: function(x, y) {
21064             x = +x, y = +y;
21065
21066             if (this._point) {
21067               var x23 = this._x2 - x,
21068                   y23 = this._y2 - y;
21069               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21070             }
21071
21072             switch (this._point) {
21073               case 0: this._point = 1; break;
21074               case 1: this._point = 2; break;
21075               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21076               case 3: this._point = 4; // proceed
21077               default: point$4(this, x, y); break;
21078             }
21079
21080             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21081             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21082             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21083             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21084           }
21085         };
21086
21087         var catmullRomOpen = (function custom(alpha) {
21088
21089           function catmullRom(context) {
21090             return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
21091           }
21092
21093           catmullRom.alpha = function(alpha) {
21094             return custom(+alpha);
21095           };
21096
21097           return catmullRom;
21098         })(0.5);
21099
21100         function LinearClosed(context) {
21101           this._context = context;
21102         }
21103
21104         LinearClosed.prototype = {
21105           areaStart: noop$5,
21106           areaEnd: noop$5,
21107           lineStart: function() {
21108             this._point = 0;
21109           },
21110           lineEnd: function() {
21111             if (this._point) this._context.closePath();
21112           },
21113           point: function(x, y) {
21114             x = +x, y = +y;
21115             if (this._point) this._context.lineTo(x, y);
21116             else this._point = 1, this._context.moveTo(x, y);
21117           }
21118         };
21119
21120         function linearClosed(context) {
21121           return new LinearClosed(context);
21122         }
21123
21124         function sign$3(x) {
21125           return x < 0 ? -1 : 1;
21126         }
21127
21128         // Calculate the slopes of the tangents (Hermite-type interpolation) based on
21129         // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
21130         // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
21131         // NOV(II), P. 443, 1990.
21132         function slope3(that, x2, y2) {
21133           var h0 = that._x1 - that._x0,
21134               h1 = x2 - that._x1,
21135               s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
21136               s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
21137               p = (s0 * h1 + s1 * h0) / (h0 + h1);
21138           return (sign$3(s0) + sign$3(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
21139         }
21140
21141         // Calculate a one-sided slope.
21142         function slope2(that, t) {
21143           var h = that._x1 - that._x0;
21144           return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
21145         }
21146
21147         // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
21148         // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
21149         // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
21150         function point$5(that, t0, t1) {
21151           var x0 = that._x0,
21152               y0 = that._y0,
21153               x1 = that._x1,
21154               y1 = that._y1,
21155               dx = (x1 - x0) / 3;
21156           that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
21157         }
21158
21159         function MonotoneX(context) {
21160           this._context = context;
21161         }
21162
21163         MonotoneX.prototype = {
21164           areaStart: function() {
21165             this._line = 0;
21166           },
21167           areaEnd: function() {
21168             this._line = NaN;
21169           },
21170           lineStart: function() {
21171             this._x0 = this._x1 =
21172             this._y0 = this._y1 =
21173             this._t0 = NaN;
21174             this._point = 0;
21175           },
21176           lineEnd: function() {
21177             switch (this._point) {
21178               case 2: this._context.lineTo(this._x1, this._y1); break;
21179               case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
21180             }
21181             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21182             this._line = 1 - this._line;
21183           },
21184           point: function(x, y) {
21185             var t1 = NaN;
21186
21187             x = +x, y = +y;
21188             if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
21189             switch (this._point) {
21190               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21191               case 1: this._point = 2; break;
21192               case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
21193               default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
21194             }
21195
21196             this._x0 = this._x1, this._x1 = x;
21197             this._y0 = this._y1, this._y1 = y;
21198             this._t0 = t1;
21199           }
21200         };
21201
21202         function MonotoneY(context) {
21203           this._context = new ReflectContext(context);
21204         }
21205
21206         (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
21207           MonotoneX.prototype.point.call(this, y, x);
21208         };
21209
21210         function ReflectContext(context) {
21211           this._context = context;
21212         }
21213
21214         ReflectContext.prototype = {
21215           moveTo: function(x, y) { this._context.moveTo(y, x); },
21216           closePath: function() { this._context.closePath(); },
21217           lineTo: function(x, y) { this._context.lineTo(y, x); },
21218           bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
21219         };
21220
21221         function monotoneX(context) {
21222           return new MonotoneX(context);
21223         }
21224
21225         function monotoneY(context) {
21226           return new MonotoneY(context);
21227         }
21228
21229         function Natural(context) {
21230           this._context = context;
21231         }
21232
21233         Natural.prototype = {
21234           areaStart: function() {
21235             this._line = 0;
21236           },
21237           areaEnd: function() {
21238             this._line = NaN;
21239           },
21240           lineStart: function() {
21241             this._x = [];
21242             this._y = [];
21243           },
21244           lineEnd: function() {
21245             var x = this._x,
21246                 y = this._y,
21247                 n = x.length;
21248
21249             if (n) {
21250               this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
21251               if (n === 2) {
21252                 this._context.lineTo(x[1], y[1]);
21253               } else {
21254                 var px = controlPoints(x),
21255                     py = controlPoints(y);
21256                 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
21257                   this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
21258                 }
21259               }
21260             }
21261
21262             if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
21263             this._line = 1 - this._line;
21264             this._x = this._y = null;
21265           },
21266           point: function(x, y) {
21267             this._x.push(+x);
21268             this._y.push(+y);
21269           }
21270         };
21271
21272         // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
21273         function controlPoints(x) {
21274           var i,
21275               n = x.length - 1,
21276               m,
21277               a = new Array(n),
21278               b = new Array(n),
21279               r = new Array(n);
21280           a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
21281           for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
21282           a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
21283           for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
21284           a[n - 1] = r[n - 1] / b[n - 1];
21285           for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
21286           b[n - 1] = (x[n] + a[n - 1]) / 2;
21287           for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
21288           return [a, b];
21289         }
21290
21291         function natural(context) {
21292           return new Natural(context);
21293         }
21294
21295         function Step(context, t) {
21296           this._context = context;
21297           this._t = t;
21298         }
21299
21300         Step.prototype = {
21301           areaStart: function() {
21302             this._line = 0;
21303           },
21304           areaEnd: function() {
21305             this._line = NaN;
21306           },
21307           lineStart: function() {
21308             this._x = this._y = NaN;
21309             this._point = 0;
21310           },
21311           lineEnd: function() {
21312             if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
21313             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21314             if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
21315           },
21316           point: function(x, y) {
21317             x = +x, y = +y;
21318             switch (this._point) {
21319               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21320               case 1: this._point = 2; // proceed
21321               default: {
21322                 if (this._t <= 0) {
21323                   this._context.lineTo(this._x, y);
21324                   this._context.lineTo(x, y);
21325                 } else {
21326                   var x1 = this._x * (1 - this._t) + x * this._t;
21327                   this._context.lineTo(x1, this._y);
21328                   this._context.lineTo(x1, y);
21329                 }
21330                 break;
21331               }
21332             }
21333             this._x = x, this._y = y;
21334           }
21335         };
21336
21337         function step(context) {
21338           return new Step(context, 0.5);
21339         }
21340
21341         function stepBefore(context) {
21342           return new Step(context, 0);
21343         }
21344
21345         function stepAfter(context) {
21346           return new Step(context, 1);
21347         }
21348
21349         function none$1(series, order) {
21350           if (!((n = series.length) > 1)) return;
21351           for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
21352             s0 = s1, s1 = series[order[i]];
21353             for (j = 0; j < m; ++j) {
21354               s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
21355             }
21356           }
21357         }
21358
21359         function none$2(series) {
21360           var n = series.length, o = new Array(n);
21361           while (--n >= 0) o[n] = n;
21362           return o;
21363         }
21364
21365         function stackValue(d, key) {
21366           return d[key];
21367         }
21368
21369         function stack() {
21370           var keys = constant$b([]),
21371               order = none$2,
21372               offset = none$1,
21373               value = stackValue;
21374
21375           function stack(data) {
21376             var kz = keys.apply(this, arguments),
21377                 i,
21378                 m = data.length,
21379                 n = kz.length,
21380                 sz = new Array(n),
21381                 oz;
21382
21383             for (i = 0; i < n; ++i) {
21384               for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
21385                 si[j] = sij = [0, +value(data[j], ki, j, data)];
21386                 sij.data = data[j];
21387               }
21388               si.key = ki;
21389             }
21390
21391             for (i = 0, oz = order(sz); i < n; ++i) {
21392               sz[oz[i]].index = i;
21393             }
21394
21395             offset(sz, oz);
21396             return sz;
21397           }
21398
21399           stack.keys = function(_) {
21400             return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : keys;
21401           };
21402
21403           stack.value = function(_) {
21404             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value;
21405           };
21406
21407           stack.order = function(_) {
21408             return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : order;
21409           };
21410
21411           stack.offset = function(_) {
21412             return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
21413           };
21414
21415           return stack;
21416         }
21417
21418         function expand(series, order) {
21419           if (!((n = series.length) > 0)) return;
21420           for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
21421             for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
21422             if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
21423           }
21424           none$1(series, order);
21425         }
21426
21427         function diverging$1(series, order) {
21428           if (!((n = series.length) > 0)) return;
21429           for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
21430             for (yp = yn = 0, i = 0; i < n; ++i) {
21431               if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
21432                 d[0] = yp, d[1] = yp += dy;
21433               } else if (dy < 0) {
21434                 d[1] = yn, d[0] = yn += dy;
21435               } else {
21436                 d[0] = yp;
21437               }
21438             }
21439           }
21440         }
21441
21442         function silhouette(series, order) {
21443           if (!((n = series.length) > 0)) return;
21444           for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
21445             for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
21446             s0[j][1] += s0[j][0] = -y / 2;
21447           }
21448           none$1(series, order);
21449         }
21450
21451         function wiggle(series, order) {
21452           if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
21453           for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
21454             for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
21455               var si = series[order[i]],
21456                   sij0 = si[j][1] || 0,
21457                   sij1 = si[j - 1][1] || 0,
21458                   s3 = (sij0 - sij1) / 2;
21459               for (var k = 0; k < i; ++k) {
21460                 var sk = series[order[k]],
21461                     skj0 = sk[j][1] || 0,
21462                     skj1 = sk[j - 1][1] || 0;
21463                 s3 += skj0 - skj1;
21464               }
21465               s1 += sij0, s2 += s3 * sij0;
21466             }
21467             s0[j - 1][1] += s0[j - 1][0] = y;
21468             if (s1) y -= s2 / s1;
21469           }
21470           s0[j - 1][1] += s0[j - 1][0] = y;
21471           none$1(series, order);
21472         }
21473
21474         function appearance(series) {
21475           var peaks = series.map(peak);
21476           return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
21477         }
21478
21479         function peak(series) {
21480           var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
21481           while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
21482           return j;
21483         }
21484
21485         function ascending$2(series) {
21486           var sums = series.map(sum$2);
21487           return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
21488         }
21489
21490         function sum$2(series) {
21491           var s = 0, i = -1, n = series.length, v;
21492           while (++i < n) if (v = +series[i][1]) s += v;
21493           return s;
21494         }
21495
21496         function descending$1(series) {
21497           return ascending$2(series).reverse();
21498         }
21499
21500         function insideOut(series) {
21501           var n = series.length,
21502               i,
21503               j,
21504               sums = series.map(sum$2),
21505               order = appearance(series),
21506               top = 0,
21507               bottom = 0,
21508               tops = [],
21509               bottoms = [];
21510
21511           for (i = 0; i < n; ++i) {
21512             j = order[i];
21513             if (top < bottom) {
21514               top += sums[j];
21515               tops.push(j);
21516             } else {
21517               bottom += sums[j];
21518               bottoms.push(j);
21519             }
21520           }
21521
21522           return bottoms.reverse().concat(tops);
21523         }
21524
21525         function reverse(series) {
21526           return none$2(series).reverse();
21527         }
21528
21529         function constant$c(x) {
21530           return function() {
21531             return x;
21532           };
21533         }
21534
21535         function x$4(d) {
21536           return d[0];
21537         }
21538
21539         function y$4(d) {
21540           return d[1];
21541         }
21542
21543         function RedBlackTree() {
21544           this._ = null; // root node
21545         }
21546
21547         function RedBlackNode(node) {
21548           node.U = // parent node
21549           node.C = // color - true for red, false for black
21550           node.L = // left node
21551           node.R = // right node
21552           node.P = // previous node
21553           node.N = null; // next node
21554         }
21555
21556         RedBlackTree.prototype = {
21557           constructor: RedBlackTree,
21558
21559           insert: function(after, node) {
21560             var parent, grandpa, uncle;
21561
21562             if (after) {
21563               node.P = after;
21564               node.N = after.N;
21565               if (after.N) after.N.P = node;
21566               after.N = node;
21567               if (after.R) {
21568                 after = after.R;
21569                 while (after.L) after = after.L;
21570                 after.L = node;
21571               } else {
21572                 after.R = node;
21573               }
21574               parent = after;
21575             } else if (this._) {
21576               after = RedBlackFirst(this._);
21577               node.P = null;
21578               node.N = after;
21579               after.P = after.L = node;
21580               parent = after;
21581             } else {
21582               node.P = node.N = null;
21583               this._ = node;
21584               parent = null;
21585             }
21586             node.L = node.R = null;
21587             node.U = parent;
21588             node.C = true;
21589
21590             after = node;
21591             while (parent && parent.C) {
21592               grandpa = parent.U;
21593               if (parent === grandpa.L) {
21594                 uncle = grandpa.R;
21595                 if (uncle && uncle.C) {
21596                   parent.C = uncle.C = false;
21597                   grandpa.C = true;
21598                   after = grandpa;
21599                 } else {
21600                   if (after === parent.R) {
21601                     RedBlackRotateLeft(this, parent);
21602                     after = parent;
21603                     parent = after.U;
21604                   }
21605                   parent.C = false;
21606                   grandpa.C = true;
21607                   RedBlackRotateRight(this, grandpa);
21608                 }
21609               } else {
21610                 uncle = grandpa.L;
21611                 if (uncle && uncle.C) {
21612                   parent.C = uncle.C = false;
21613                   grandpa.C = true;
21614                   after = grandpa;
21615                 } else {
21616                   if (after === parent.L) {
21617                     RedBlackRotateRight(this, parent);
21618                     after = parent;
21619                     parent = after.U;
21620                   }
21621                   parent.C = false;
21622                   grandpa.C = true;
21623                   RedBlackRotateLeft(this, grandpa);
21624                 }
21625               }
21626               parent = after.U;
21627             }
21628             this._.C = false;
21629           },
21630
21631           remove: function(node) {
21632             if (node.N) node.N.P = node.P;
21633             if (node.P) node.P.N = node.N;
21634             node.N = node.P = null;
21635
21636             var parent = node.U,
21637                 sibling,
21638                 left = node.L,
21639                 right = node.R,
21640                 next,
21641                 red;
21642
21643             if (!left) next = right;
21644             else if (!right) next = left;
21645             else next = RedBlackFirst(right);
21646
21647             if (parent) {
21648               if (parent.L === node) parent.L = next;
21649               else parent.R = next;
21650             } else {
21651               this._ = next;
21652             }
21653
21654             if (left && right) {
21655               red = next.C;
21656               next.C = node.C;
21657               next.L = left;
21658               left.U = next;
21659               if (next !== right) {
21660                 parent = next.U;
21661                 next.U = node.U;
21662                 node = next.R;
21663                 parent.L = node;
21664                 next.R = right;
21665                 right.U = next;
21666               } else {
21667                 next.U = parent;
21668                 parent = next;
21669                 node = next.R;
21670               }
21671             } else {
21672               red = node.C;
21673               node = next;
21674             }
21675
21676             if (node) node.U = parent;
21677             if (red) return;
21678             if (node && node.C) { node.C = false; return; }
21679
21680             do {
21681               if (node === this._) break;
21682               if (node === parent.L) {
21683                 sibling = parent.R;
21684                 if (sibling.C) {
21685                   sibling.C = false;
21686                   parent.C = true;
21687                   RedBlackRotateLeft(this, parent);
21688                   sibling = parent.R;
21689                 }
21690                 if ((sibling.L && sibling.L.C)
21691                     || (sibling.R && sibling.R.C)) {
21692                   if (!sibling.R || !sibling.R.C) {
21693                     sibling.L.C = false;
21694                     sibling.C = true;
21695                     RedBlackRotateRight(this, sibling);
21696                     sibling = parent.R;
21697                   }
21698                   sibling.C = parent.C;
21699                   parent.C = sibling.R.C = false;
21700                   RedBlackRotateLeft(this, parent);
21701                   node = this._;
21702                   break;
21703                 }
21704               } else {
21705                 sibling = parent.L;
21706                 if (sibling.C) {
21707                   sibling.C = false;
21708                   parent.C = true;
21709                   RedBlackRotateRight(this, parent);
21710                   sibling = parent.L;
21711                 }
21712                 if ((sibling.L && sibling.L.C)
21713                   || (sibling.R && sibling.R.C)) {
21714                   if (!sibling.L || !sibling.L.C) {
21715                     sibling.R.C = false;
21716                     sibling.C = true;
21717                     RedBlackRotateLeft(this, sibling);
21718                     sibling = parent.L;
21719                   }
21720                   sibling.C = parent.C;
21721                   parent.C = sibling.L.C = false;
21722                   RedBlackRotateRight(this, parent);
21723                   node = this._;
21724                   break;
21725                 }
21726               }
21727               sibling.C = true;
21728               node = parent;
21729               parent = parent.U;
21730             } while (!node.C);
21731
21732             if (node) node.C = false;
21733           }
21734         };
21735
21736         function RedBlackRotateLeft(tree, node) {
21737           var p = node,
21738               q = node.R,
21739               parent = p.U;
21740
21741           if (parent) {
21742             if (parent.L === p) parent.L = q;
21743             else parent.R = q;
21744           } else {
21745             tree._ = q;
21746           }
21747
21748           q.U = parent;
21749           p.U = q;
21750           p.R = q.L;
21751           if (p.R) p.R.U = p;
21752           q.L = p;
21753         }
21754
21755         function RedBlackRotateRight(tree, node) {
21756           var p = node,
21757               q = node.L,
21758               parent = p.U;
21759
21760           if (parent) {
21761             if (parent.L === p) parent.L = q;
21762             else parent.R = q;
21763           } else {
21764             tree._ = q;
21765           }
21766
21767           q.U = parent;
21768           p.U = q;
21769           p.L = q.R;
21770           if (p.L) p.L.U = p;
21771           q.R = p;
21772         }
21773
21774         function RedBlackFirst(node) {
21775           while (node.L) node = node.L;
21776           return node;
21777         }
21778
21779         function createEdge(left, right, v0, v1) {
21780           var edge = [null, null],
21781               index = edges.push(edge) - 1;
21782           edge.left = left;
21783           edge.right = right;
21784           if (v0) setEdgeEnd(edge, left, right, v0);
21785           if (v1) setEdgeEnd(edge, right, left, v1);
21786           cells[left.index].halfedges.push(index);
21787           cells[right.index].halfedges.push(index);
21788           return edge;
21789         }
21790
21791         function createBorderEdge(left, v0, v1) {
21792           var edge = [v0, v1];
21793           edge.left = left;
21794           return edge;
21795         }
21796
21797         function setEdgeEnd(edge, left, right, vertex) {
21798           if (!edge[0] && !edge[1]) {
21799             edge[0] = vertex;
21800             edge.left = left;
21801             edge.right = right;
21802           } else if (edge.left === right) {
21803             edge[1] = vertex;
21804           } else {
21805             edge[0] = vertex;
21806           }
21807         }
21808
21809         // Liang–Barsky line clipping.
21810         function clipEdge(edge, x0, y0, x1, y1) {
21811           var a = edge[0],
21812               b = edge[1],
21813               ax = a[0],
21814               ay = a[1],
21815               bx = b[0],
21816               by = b[1],
21817               t0 = 0,
21818               t1 = 1,
21819               dx = bx - ax,
21820               dy = by - ay,
21821               r;
21822
21823           r = x0 - ax;
21824           if (!dx && r > 0) return;
21825           r /= dx;
21826           if (dx < 0) {
21827             if (r < t0) return;
21828             if (r < t1) t1 = r;
21829           } else if (dx > 0) {
21830             if (r > t1) return;
21831             if (r > t0) t0 = r;
21832           }
21833
21834           r = x1 - ax;
21835           if (!dx && r < 0) return;
21836           r /= dx;
21837           if (dx < 0) {
21838             if (r > t1) return;
21839             if (r > t0) t0 = r;
21840           } else if (dx > 0) {
21841             if (r < t0) return;
21842             if (r < t1) t1 = r;
21843           }
21844
21845           r = y0 - ay;
21846           if (!dy && r > 0) return;
21847           r /= dy;
21848           if (dy < 0) {
21849             if (r < t0) return;
21850             if (r < t1) t1 = r;
21851           } else if (dy > 0) {
21852             if (r > t1) return;
21853             if (r > t0) t0 = r;
21854           }
21855
21856           r = y1 - ay;
21857           if (!dy && r < 0) return;
21858           r /= dy;
21859           if (dy < 0) {
21860             if (r > t1) return;
21861             if (r > t0) t0 = r;
21862           } else if (dy > 0) {
21863             if (r < t0) return;
21864             if (r < t1) t1 = r;
21865           }
21866
21867           if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
21868
21869           if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
21870           if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
21871           return true;
21872         }
21873
21874         function connectEdge(edge, x0, y0, x1, y1) {
21875           var v1 = edge[1];
21876           if (v1) return true;
21877
21878           var v0 = edge[0],
21879               left = edge.left,
21880               right = edge.right,
21881               lx = left[0],
21882               ly = left[1],
21883               rx = right[0],
21884               ry = right[1],
21885               fx = (lx + rx) / 2,
21886               fy = (ly + ry) / 2,
21887               fm,
21888               fb;
21889
21890           if (ry === ly) {
21891             if (fx < x0 || fx >= x1) return;
21892             if (lx > rx) {
21893               if (!v0) v0 = [fx, y0];
21894               else if (v0[1] >= y1) return;
21895               v1 = [fx, y1];
21896             } else {
21897               if (!v0) v0 = [fx, y1];
21898               else if (v0[1] < y0) return;
21899               v1 = [fx, y0];
21900             }
21901           } else {
21902             fm = (lx - rx) / (ry - ly);
21903             fb = fy - fm * fx;
21904             if (fm < -1 || fm > 1) {
21905               if (lx > rx) {
21906                 if (!v0) v0 = [(y0 - fb) / fm, y0];
21907                 else if (v0[1] >= y1) return;
21908                 v1 = [(y1 - fb) / fm, y1];
21909               } else {
21910                 if (!v0) v0 = [(y1 - fb) / fm, y1];
21911                 else if (v0[1] < y0) return;
21912                 v1 = [(y0 - fb) / fm, y0];
21913               }
21914             } else {
21915               if (ly < ry) {
21916                 if (!v0) v0 = [x0, fm * x0 + fb];
21917                 else if (v0[0] >= x1) return;
21918                 v1 = [x1, fm * x1 + fb];
21919               } else {
21920                 if (!v0) v0 = [x1, fm * x1 + fb];
21921                 else if (v0[0] < x0) return;
21922                 v1 = [x0, fm * x0 + fb];
21923               }
21924             }
21925           }
21926
21927           edge[0] = v0;
21928           edge[1] = v1;
21929           return true;
21930         }
21931
21932         function clipEdges(x0, y0, x1, y1) {
21933           var i = edges.length,
21934               edge;
21935
21936           while (i--) {
21937             if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
21938                 || !clipEdge(edge, x0, y0, x1, y1)
21939                 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
21940                     || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
21941               delete edges[i];
21942             }
21943           }
21944         }
21945
21946         function createCell(site) {
21947           return cells[site.index] = {
21948             site: site,
21949             halfedges: []
21950           };
21951         }
21952
21953         function cellHalfedgeAngle(cell, edge) {
21954           var site = cell.site,
21955               va = edge.left,
21956               vb = edge.right;
21957           if (site === vb) vb = va, va = site;
21958           if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
21959           if (site === va) va = edge[1], vb = edge[0];
21960           else va = edge[0], vb = edge[1];
21961           return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
21962         }
21963
21964         function cellHalfedgeStart(cell, edge) {
21965           return edge[+(edge.left !== cell.site)];
21966         }
21967
21968         function cellHalfedgeEnd(cell, edge) {
21969           return edge[+(edge.left === cell.site)];
21970         }
21971
21972         function sortCellHalfedges() {
21973           for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
21974             if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
21975               var index = new Array(m),
21976                   array = new Array(m);
21977               for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
21978               index.sort(function(i, j) { return array[j] - array[i]; });
21979               for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
21980               for (j = 0; j < m; ++j) halfedges[j] = array[j];
21981             }
21982           }
21983         }
21984
21985         function clipCells(x0, y0, x1, y1) {
21986           var nCells = cells.length,
21987               iCell,
21988               cell,
21989               site,
21990               iHalfedge,
21991               halfedges,
21992               nHalfedges,
21993               start,
21994               startX,
21995               startY,
21996               end,
21997               endX,
21998               endY,
21999               cover = true;
22000
22001           for (iCell = 0; iCell < nCells; ++iCell) {
22002             if (cell = cells[iCell]) {
22003               site = cell.site;
22004               halfedges = cell.halfedges;
22005               iHalfedge = halfedges.length;
22006
22007               // Remove any dangling clipped edges.
22008               while (iHalfedge--) {
22009                 if (!edges[halfedges[iHalfedge]]) {
22010                   halfedges.splice(iHalfedge, 1);
22011                 }
22012               }
22013
22014               // Insert any border edges as necessary.
22015               iHalfedge = 0, nHalfedges = halfedges.length;
22016               while (iHalfedge < nHalfedges) {
22017                 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
22018                 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
22019                 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
22020                   halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
22021                       Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
22022                       : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
22023                       : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
22024                       : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
22025                       : null)) - 1);
22026                   ++nHalfedges;
22027                 }
22028               }
22029
22030               if (nHalfedges) cover = false;
22031             }
22032           }
22033
22034           // If there weren’t any edges, have the closest site cover the extent.
22035           // It doesn’t matter which corner of the extent we measure!
22036           if (cover) {
22037             var dx, dy, d2, dc = Infinity;
22038
22039             for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
22040               if (cell = cells[iCell]) {
22041                 site = cell.site;
22042                 dx = site[0] - x0;
22043                 dy = site[1] - y0;
22044                 d2 = dx * dx + dy * dy;
22045                 if (d2 < dc) dc = d2, cover = cell;
22046               }
22047             }
22048
22049             if (cover) {
22050               var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
22051               cover.halfedges.push(
22052                 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
22053                 edges.push(createBorderEdge(site, v01, v11)) - 1,
22054                 edges.push(createBorderEdge(site, v11, v10)) - 1,
22055                 edges.push(createBorderEdge(site, v10, v00)) - 1
22056               );
22057             }
22058           }
22059
22060           // Lastly delete any cells with no edges; these were entirely clipped.
22061           for (iCell = 0; iCell < nCells; ++iCell) {
22062             if (cell = cells[iCell]) {
22063               if (!cell.halfedges.length) {
22064                 delete cells[iCell];
22065               }
22066             }
22067           }
22068         }
22069
22070         var circlePool = [];
22071
22072         var firstCircle;
22073
22074         function Circle() {
22075           RedBlackNode(this);
22076           this.x =
22077           this.y =
22078           this.arc =
22079           this.site =
22080           this.cy = null;
22081         }
22082
22083         function attachCircle(arc) {
22084           var lArc = arc.P,
22085               rArc = arc.N;
22086
22087           if (!lArc || !rArc) return;
22088
22089           var lSite = lArc.site,
22090               cSite = arc.site,
22091               rSite = rArc.site;
22092
22093           if (lSite === rSite) return;
22094
22095           var bx = cSite[0],
22096               by = cSite[1],
22097               ax = lSite[0] - bx,
22098               ay = lSite[1] - by,
22099               cx = rSite[0] - bx,
22100               cy = rSite[1] - by;
22101
22102           var d = 2 * (ax * cy - ay * cx);
22103           if (d >= -epsilon2$2) return;
22104
22105           var ha = ax * ax + ay * ay,
22106               hc = cx * cx + cy * cy,
22107               x = (cy * ha - ay * hc) / d,
22108               y = (ax * hc - cx * ha) / d;
22109
22110           var circle = circlePool.pop() || new Circle;
22111           circle.arc = arc;
22112           circle.site = cSite;
22113           circle.x = x + bx;
22114           circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
22115
22116           arc.circle = circle;
22117
22118           var before = null,
22119               node = circles._;
22120
22121           while (node) {
22122             if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
22123               if (node.L) node = node.L;
22124               else { before = node.P; break; }
22125             } else {
22126               if (node.R) node = node.R;
22127               else { before = node; break; }
22128             }
22129           }
22130
22131           circles.insert(before, circle);
22132           if (!before) firstCircle = circle;
22133         }
22134
22135         function detachCircle(arc) {
22136           var circle = arc.circle;
22137           if (circle) {
22138             if (!circle.P) firstCircle = circle.N;
22139             circles.remove(circle);
22140             circlePool.push(circle);
22141             RedBlackNode(circle);
22142             arc.circle = null;
22143           }
22144         }
22145
22146         var beachPool = [];
22147
22148         function Beach() {
22149           RedBlackNode(this);
22150           this.edge =
22151           this.site =
22152           this.circle = null;
22153         }
22154
22155         function createBeach(site) {
22156           var beach = beachPool.pop() || new Beach;
22157           beach.site = site;
22158           return beach;
22159         }
22160
22161         function detachBeach(beach) {
22162           detachCircle(beach);
22163           beaches.remove(beach);
22164           beachPool.push(beach);
22165           RedBlackNode(beach);
22166         }
22167
22168         function removeBeach(beach) {
22169           var circle = beach.circle,
22170               x = circle.x,
22171               y = circle.cy,
22172               vertex = [x, y],
22173               previous = beach.P,
22174               next = beach.N,
22175               disappearing = [beach];
22176
22177           detachBeach(beach);
22178
22179           var lArc = previous;
22180           while (lArc.circle
22181               && Math.abs(x - lArc.circle.x) < epsilon$4
22182               && Math.abs(y - lArc.circle.cy) < epsilon$4) {
22183             previous = lArc.P;
22184             disappearing.unshift(lArc);
22185             detachBeach(lArc);
22186             lArc = previous;
22187           }
22188
22189           disappearing.unshift(lArc);
22190           detachCircle(lArc);
22191
22192           var rArc = next;
22193           while (rArc.circle
22194               && Math.abs(x - rArc.circle.x) < epsilon$4
22195               && Math.abs(y - rArc.circle.cy) < epsilon$4) {
22196             next = rArc.N;
22197             disappearing.push(rArc);
22198             detachBeach(rArc);
22199             rArc = next;
22200           }
22201
22202           disappearing.push(rArc);
22203           detachCircle(rArc);
22204
22205           var nArcs = disappearing.length,
22206               iArc;
22207           for (iArc = 1; iArc < nArcs; ++iArc) {
22208             rArc = disappearing[iArc];
22209             lArc = disappearing[iArc - 1];
22210             setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
22211           }
22212
22213           lArc = disappearing[0];
22214           rArc = disappearing[nArcs - 1];
22215           rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
22216
22217           attachCircle(lArc);
22218           attachCircle(rArc);
22219         }
22220
22221         function addBeach(site) {
22222           var x = site[0],
22223               directrix = site[1],
22224               lArc,
22225               rArc,
22226               dxl,
22227               dxr,
22228               node = beaches._;
22229
22230           while (node) {
22231             dxl = leftBreakPoint(node, directrix) - x;
22232             if (dxl > epsilon$4) node = node.L; else {
22233               dxr = x - rightBreakPoint(node, directrix);
22234               if (dxr > epsilon$4) {
22235                 if (!node.R) {
22236                   lArc = node;
22237                   break;
22238                 }
22239                 node = node.R;
22240               } else {
22241                 if (dxl > -epsilon$4) {
22242                   lArc = node.P;
22243                   rArc = node;
22244                 } else if (dxr > -epsilon$4) {
22245                   lArc = node;
22246                   rArc = node.N;
22247                 } else {
22248                   lArc = rArc = node;
22249                 }
22250                 break;
22251               }
22252             }
22253           }
22254
22255           createCell(site);
22256           var newArc = createBeach(site);
22257           beaches.insert(lArc, newArc);
22258
22259           if (!lArc && !rArc) return;
22260
22261           if (lArc === rArc) {
22262             detachCircle(lArc);
22263             rArc = createBeach(lArc.site);
22264             beaches.insert(newArc, rArc);
22265             newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
22266             attachCircle(lArc);
22267             attachCircle(rArc);
22268             return;
22269           }
22270
22271           if (!rArc) { // && lArc
22272             newArc.edge = createEdge(lArc.site, newArc.site);
22273             return;
22274           }
22275
22276           // else lArc !== rArc
22277           detachCircle(lArc);
22278           detachCircle(rArc);
22279
22280           var lSite = lArc.site,
22281               ax = lSite[0],
22282               ay = lSite[1],
22283               bx = site[0] - ax,
22284               by = site[1] - ay,
22285               rSite = rArc.site,
22286               cx = rSite[0] - ax,
22287               cy = rSite[1] - ay,
22288               d = 2 * (bx * cy - by * cx),
22289               hb = bx * bx + by * by,
22290               hc = cx * cx + cy * cy,
22291               vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
22292
22293           setEdgeEnd(rArc.edge, lSite, rSite, vertex);
22294           newArc.edge = createEdge(lSite, site, null, vertex);
22295           rArc.edge = createEdge(site, rSite, null, vertex);
22296           attachCircle(lArc);
22297           attachCircle(rArc);
22298         }
22299
22300         function leftBreakPoint(arc, directrix) {
22301           var site = arc.site,
22302               rfocx = site[0],
22303               rfocy = site[1],
22304               pby2 = rfocy - directrix;
22305
22306           if (!pby2) return rfocx;
22307
22308           var lArc = arc.P;
22309           if (!lArc) return -Infinity;
22310
22311           site = lArc.site;
22312           var lfocx = site[0],
22313               lfocy = site[1],
22314               plby2 = lfocy - directrix;
22315
22316           if (!plby2) return lfocx;
22317
22318           var hl = lfocx - rfocx,
22319               aby2 = 1 / pby2 - 1 / plby2,
22320               b = hl / plby2;
22321
22322           if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
22323
22324           return (rfocx + lfocx) / 2;
22325         }
22326
22327         function rightBreakPoint(arc, directrix) {
22328           var rArc = arc.N;
22329           if (rArc) return leftBreakPoint(rArc, directrix);
22330           var site = arc.site;
22331           return site[1] === directrix ? site[0] : Infinity;
22332         }
22333
22334         var epsilon$4 = 1e-6;
22335         var epsilon2$2 = 1e-12;
22336         var beaches;
22337         var cells;
22338         var circles;
22339         var edges;
22340
22341         function triangleArea(a, b, c) {
22342           return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
22343         }
22344
22345         function lexicographic(a, b) {
22346           return b[1] - a[1]
22347               || b[0] - a[0];
22348         }
22349
22350         function Diagram(sites, extent) {
22351           var site = sites.sort(lexicographic).pop(),
22352               x,
22353               y,
22354               circle;
22355
22356           edges = [];
22357           cells = new Array(sites.length);
22358           beaches = new RedBlackTree;
22359           circles = new RedBlackTree;
22360
22361           while (true) {
22362             circle = firstCircle;
22363             if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
22364               if (site[0] !== x || site[1] !== y) {
22365                 addBeach(site);
22366                 x = site[0], y = site[1];
22367               }
22368               site = sites.pop();
22369             } else if (circle) {
22370               removeBeach(circle.arc);
22371             } else {
22372               break;
22373             }
22374           }
22375
22376           sortCellHalfedges();
22377
22378           if (extent) {
22379             var x0 = +extent[0][0],
22380                 y0 = +extent[0][1],
22381                 x1 = +extent[1][0],
22382                 y1 = +extent[1][1];
22383             clipEdges(x0, y0, x1, y1);
22384             clipCells(x0, y0, x1, y1);
22385           }
22386
22387           this.edges = edges;
22388           this.cells = cells;
22389
22390           beaches =
22391           circles =
22392           edges =
22393           cells = null;
22394         }
22395
22396         Diagram.prototype = {
22397           constructor: Diagram,
22398
22399           polygons: function() {
22400             var edges = this.edges;
22401
22402             return this.cells.map(function(cell) {
22403               var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
22404               polygon.data = cell.site.data;
22405               return polygon;
22406             });
22407           },
22408
22409           triangles: function() {
22410             var triangles = [],
22411                 edges = this.edges;
22412
22413             this.cells.forEach(function(cell, i) {
22414               if (!(m = (halfedges = cell.halfedges).length)) return;
22415               var site = cell.site,
22416                   halfedges,
22417                   j = -1,
22418                   m,
22419                   s0,
22420                   e1 = edges[halfedges[m - 1]],
22421                   s1 = e1.left === site ? e1.right : e1.left;
22422
22423               while (++j < m) {
22424                 s0 = s1;
22425                 e1 = edges[halfedges[j]];
22426                 s1 = e1.left === site ? e1.right : e1.left;
22427                 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
22428                   triangles.push([site.data, s0.data, s1.data]);
22429                 }
22430               }
22431             });
22432
22433             return triangles;
22434           },
22435
22436           links: function() {
22437             return this.edges.filter(function(edge) {
22438               return edge.right;
22439             }).map(function(edge) {
22440               return {
22441                 source: edge.left.data,
22442                 target: edge.right.data
22443               };
22444             });
22445           },
22446
22447           find: function(x, y, radius) {
22448             var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
22449
22450             // Use the previously-found cell, or start with an arbitrary one.
22451             while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
22452             var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
22453
22454             // Traverse the half-edges to find a closer cell, if any.
22455             do {
22456               cell = that.cells[i0 = i1], i1 = null;
22457               cell.halfedges.forEach(function(e) {
22458                 var edge = that.edges[e], v = edge.left;
22459                 if ((v === cell.site || !v) && !(v = edge.right)) return;
22460                 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
22461                 if (v2 < d2) d2 = v2, i1 = v.index;
22462               });
22463             } while (i1 !== null);
22464
22465             that._found = i0;
22466
22467             return radius == null || d2 <= radius * radius ? cell.site : null;
22468           }
22469         };
22470
22471         function voronoi() {
22472           var x = x$4,
22473               y = y$4,
22474               extent = null;
22475
22476           function voronoi(data) {
22477             return new Diagram(data.map(function(d, i) {
22478               var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
22479               s.index = i;
22480               s.data = d;
22481               return s;
22482             }), extent);
22483           }
22484
22485           voronoi.polygons = function(data) {
22486             return voronoi(data).polygons();
22487           };
22488
22489           voronoi.links = function(data) {
22490             return voronoi(data).links();
22491           };
22492
22493           voronoi.triangles = function(data) {
22494             return voronoi(data).triangles();
22495           };
22496
22497           voronoi.x = function(_) {
22498             return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x;
22499           };
22500
22501           voronoi.y = function(_) {
22502             return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y;
22503           };
22504
22505           voronoi.extent = function(_) {
22506             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]]];
22507           };
22508
22509           voronoi.size = function(_) {
22510             return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
22511           };
22512
22513           return voronoi;
22514         }
22515
22516         function constant$d(x) {
22517           return function() {
22518             return x;
22519           };
22520         }
22521
22522         function ZoomEvent(target, type, transform) {
22523           this.target = target;
22524           this.type = type;
22525           this.transform = transform;
22526         }
22527
22528         function Transform(k, x, y) {
22529           this.k = k;
22530           this.x = x;
22531           this.y = y;
22532         }
22533
22534         Transform.prototype = {
22535           constructor: Transform,
22536           scale: function(k) {
22537             return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22538           },
22539           translate: function(x, y) {
22540             return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22541           },
22542           apply: function(point) {
22543             return [point[0] * this.k + this.x, point[1] * this.k + this.y];
22544           },
22545           applyX: function(x) {
22546             return x * this.k + this.x;
22547           },
22548           applyY: function(y) {
22549             return y * this.k + this.y;
22550           },
22551           invert: function(location) {
22552             return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22553           },
22554           invertX: function(x) {
22555             return (x - this.x) / this.k;
22556           },
22557           invertY: function(y) {
22558             return (y - this.y) / this.k;
22559           },
22560           rescaleX: function(x) {
22561             return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22562           },
22563           rescaleY: function(y) {
22564             return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22565           },
22566           toString: function() {
22567             return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22568           }
22569         };
22570
22571         var identity$8 = new Transform(1, 0, 0);
22572
22573         transform.prototype = Transform.prototype;
22574
22575         function transform(node) {
22576           return node.__zoom || identity$8;
22577         }
22578
22579         function nopropagation$2() {
22580           event.stopImmediatePropagation();
22581         }
22582
22583         function noevent$2() {
22584           event.preventDefault();
22585           event.stopImmediatePropagation();
22586         }
22587
22588         // Ignore right-click, since that should open the context menu.
22589         function defaultFilter$2() {
22590           return !event.button;
22591         }
22592
22593         function defaultExtent$1() {
22594           var e = this, w, h;
22595           if (e instanceof SVGElement) {
22596             e = e.ownerSVGElement || e;
22597             w = e.width.baseVal.value;
22598             h = e.height.baseVal.value;
22599           } else {
22600             w = e.clientWidth;
22601             h = e.clientHeight;
22602           }
22603           return [[0, 0], [w, h]];
22604         }
22605
22606         function defaultTransform() {
22607           return this.__zoom || identity$8;
22608         }
22609
22610         function defaultWheelDelta() {
22611           return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
22612         }
22613
22614         function defaultTouchable$1() {
22615           return "ontouchstart" in this;
22616         }
22617
22618         function defaultConstrain(transform, extent, translateExtent) {
22619           var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
22620               dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
22621               dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
22622               dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
22623           return transform.translate(
22624             dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22625             dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22626           );
22627         }
22628
22629         function d3_zoom() {
22630           var filter = defaultFilter$2,
22631               extent = defaultExtent$1,
22632               constrain = defaultConstrain,
22633               wheelDelta = defaultWheelDelta,
22634               touchable = defaultTouchable$1,
22635               scaleExtent = [0, Infinity],
22636               translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
22637               duration = 250,
22638               interpolate = interpolateZoom,
22639               gestures = [],
22640               listeners = dispatch("start", "zoom", "end"),
22641               touchstarting,
22642               touchending,
22643               touchDelay = 500,
22644               wheelDelay = 150,
22645               clickDistance2 = 0;
22646
22647           function zoom(selection) {
22648             selection
22649                 .property("__zoom", defaultTransform)
22650                 .on("wheel.zoom", wheeled)
22651                 .on("mousedown.zoom", mousedowned)
22652                 .on("dblclick.zoom", dblclicked)
22653               .filter(touchable)
22654                 .on("touchstart.zoom", touchstarted)
22655                 .on("touchmove.zoom", touchmoved)
22656                 .on("touchend.zoom touchcancel.zoom", touchended)
22657                 .style("touch-action", "none")
22658                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22659           }
22660
22661           zoom.transform = function(collection, transform) {
22662             var selection = collection.selection ? collection.selection() : collection;
22663             selection.property("__zoom", defaultTransform);
22664             if (collection !== selection) {
22665               schedule(collection, transform);
22666             } else {
22667               selection.interrupt().each(function() {
22668                 gesture(this, arguments)
22669                     .start()
22670                     .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
22671                     .end();
22672               });
22673             }
22674           };
22675
22676           zoom.scaleBy = function(selection, k) {
22677             zoom.scaleTo(selection, function() {
22678               var k0 = this.__zoom.k,
22679                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22680               return k0 * k1;
22681             });
22682           };
22683
22684           zoom.scaleTo = function(selection, k) {
22685             zoom.transform(selection, function() {
22686               var e = extent.apply(this, arguments),
22687                   t0 = this.__zoom,
22688                   p0 = centroid(e),
22689                   p1 = t0.invert(p0),
22690                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22691               return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
22692             });
22693           };
22694
22695           zoom.translateBy = function(selection, x, y) {
22696             zoom.transform(selection, function() {
22697               return constrain(this.__zoom.translate(
22698                 typeof x === "function" ? x.apply(this, arguments) : x,
22699                 typeof y === "function" ? y.apply(this, arguments) : y
22700               ), extent.apply(this, arguments), translateExtent);
22701             });
22702           };
22703
22704           zoom.translateTo = function(selection, x, y) {
22705             zoom.transform(selection, function() {
22706               var e = extent.apply(this, arguments),
22707                   t = this.__zoom,
22708                   p = centroid(e);
22709               return constrain(identity$8.translate(p[0], p[1]).scale(t.k).translate(
22710                 typeof x === "function" ? -x.apply(this, arguments) : -x,
22711                 typeof y === "function" ? -y.apply(this, arguments) : -y
22712               ), e, translateExtent);
22713             });
22714           };
22715
22716           function scale(transform, k) {
22717             k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22718             return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
22719           }
22720
22721           function translate(transform, p0, p1) {
22722             var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
22723             return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
22724           }
22725
22726           function centroid(extent) {
22727             return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
22728           }
22729
22730           function schedule(transition, transform, center) {
22731             transition
22732                 .on("start.zoom", function() { gesture(this, arguments).start(); })
22733                 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
22734                 .tween("zoom", function() {
22735                   var that = this,
22736                       args = arguments,
22737                       g = gesture(that, args),
22738                       e = extent.apply(that, args),
22739                       p = center || centroid(e),
22740                       w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
22741                       a = that.__zoom,
22742                       b = typeof transform === "function" ? transform.apply(that, args) : transform,
22743                       i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22744                   return function(t) {
22745                     if (t === 1) t = b; // Avoid rounding error on end.
22746                     else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
22747                     g.zoom(null, t);
22748                   };
22749                 });
22750           }
22751
22752           function gesture(that, args) {
22753             for (var i = 0, n = gestures.length, g; i < n; ++i) {
22754               if ((g = gestures[i]).that === that) {
22755                 return g;
22756               }
22757             }
22758             return new Gesture(that, args);
22759           }
22760
22761           function Gesture(that, args) {
22762             this.that = that;
22763             this.args = args;
22764             this.index = -1;
22765             this.active = 0;
22766             this.extent = extent.apply(that, args);
22767           }
22768
22769           Gesture.prototype = {
22770             start: function() {
22771               if (++this.active === 1) {
22772                 this.index = gestures.push(this) - 1;
22773                 this.emit("start");
22774               }
22775               return this;
22776             },
22777             zoom: function(key, transform) {
22778               if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
22779               if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
22780               if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
22781               this.that.__zoom = transform;
22782               this.emit("zoom");
22783               return this;
22784             },
22785             end: function() {
22786               if (--this.active === 0) {
22787                 gestures.splice(this.index, 1);
22788                 this.index = -1;
22789                 this.emit("end");
22790               }
22791               return this;
22792             },
22793             emit: function(type) {
22794               customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
22795             }
22796           };
22797
22798           function wheeled() {
22799             if (!filter.apply(this, arguments)) return;
22800             var g = gesture(this, arguments),
22801                 t = this.__zoom,
22802                 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
22803                 p = d3_mouse(this);
22804
22805             // If the mouse is in the same location as before, reuse it.
22806             // If there were recent wheel events, reset the wheel idle timeout.
22807             if (g.wheel) {
22808               if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22809                 g.mouse[1] = t.invert(g.mouse[0] = p);
22810               }
22811               clearTimeout(g.wheel);
22812             }
22813
22814             // If this wheel event won’t trigger a transform change, ignore it.
22815             else if (t.k === k) return;
22816
22817             // Otherwise, capture the mouse point and location at the start.
22818             else {
22819               g.mouse = [p, t.invert(p)];
22820               interrupt(this);
22821               g.start();
22822             }
22823
22824             noevent$2();
22825             g.wheel = setTimeout(wheelidled, wheelDelay);
22826             g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22827
22828             function wheelidled() {
22829               g.wheel = null;
22830               g.end();
22831             }
22832           }
22833
22834           function mousedowned() {
22835             if (touchending || !filter.apply(this, arguments)) return;
22836             var g = gesture(this, arguments),
22837                 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
22838                 p = d3_mouse(this),
22839                 x0 = event.clientX,
22840                 y0 = event.clientY;
22841
22842             dragDisable(event.view);
22843             nopropagation$2();
22844             g.mouse = [p, this.__zoom.invert(p)];
22845             interrupt(this);
22846             g.start();
22847
22848             function mousemoved() {
22849               noevent$2();
22850               if (!g.moved) {
22851                 var dx = event.clientX - x0, dy = event.clientY - y0;
22852                 g.moved = dx * dx + dy * dy > clickDistance2;
22853               }
22854               g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
22855             }
22856
22857             function mouseupped() {
22858               v.on("mousemove.zoom mouseup.zoom", null);
22859               yesdrag(event.view, g.moved);
22860               noevent$2();
22861               g.end();
22862             }
22863           }
22864
22865           function dblclicked() {
22866             if (!filter.apply(this, arguments)) return;
22867             var t0 = this.__zoom,
22868                 p0 = d3_mouse(this),
22869                 p1 = t0.invert(p0),
22870                 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
22871                 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
22872
22873             noevent$2();
22874             if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
22875             else d3_select(this).call(zoom.transform, t1);
22876           }
22877
22878           function touchstarted() {
22879             if (!filter.apply(this, arguments)) return;
22880             var g = gesture(this, arguments),
22881                 touches = event.changedTouches,
22882                 started,
22883                 n = touches.length, i, t, p;
22884
22885             nopropagation$2();
22886             for (i = 0; i < n; ++i) {
22887               t = touches[i], p = touch(this, touches, t.identifier);
22888               p = [p, this.__zoom.invert(p), t.identifier];
22889               if (!g.touch0) g.touch0 = p, started = true;
22890               else if (!g.touch1) g.touch1 = p;
22891             }
22892
22893             // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
22894             if (touchstarting) {
22895               touchstarting = clearTimeout(touchstarting);
22896               if (!g.touch1) {
22897                 g.end();
22898                 p = d3_select(this).on("dblclick.zoom");
22899                 if (p) p.apply(this, arguments);
22900                 return;
22901               }
22902             }
22903
22904             if (started) {
22905               touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
22906               interrupt(this);
22907               g.start();
22908             }
22909           }
22910
22911           function touchmoved() {
22912             var g = gesture(this, arguments),
22913                 touches = event.changedTouches,
22914                 n = touches.length, i, t, p, l;
22915
22916             noevent$2();
22917             if (touchstarting) touchstarting = clearTimeout(touchstarting);
22918             for (i = 0; i < n; ++i) {
22919               t = touches[i], p = touch(this, touches, t.identifier);
22920               if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
22921               else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
22922             }
22923             t = g.that.__zoom;
22924             if (g.touch1) {
22925               var p0 = g.touch0[0], l0 = g.touch0[1],
22926                   p1 = g.touch1[0], l1 = g.touch1[1],
22927                   dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
22928                   dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
22929               t = scale(t, Math.sqrt(dp / dl));
22930               p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
22931               l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22932             }
22933             else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
22934             else return;
22935             g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22936           }
22937
22938           function touchended() {
22939             var g = gesture(this, arguments),
22940                 touches = event.changedTouches,
22941                 n = touches.length, i, t;
22942
22943             nopropagation$2();
22944             if (touchending) clearTimeout(touchending);
22945             touchending = setTimeout(function() { touchending = null; }, touchDelay);
22946             for (i = 0; i < n; ++i) {
22947               t = touches[i];
22948               if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
22949               else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
22950             }
22951             if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
22952             if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22953             else g.end();
22954           }
22955
22956           zoom.wheelDelta = function(_) {
22957             return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta;
22958           };
22959
22960           zoom.filter = function(_) {
22961             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter;
22962           };
22963
22964           zoom.touchable = function(_) {
22965             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable;
22966           };
22967
22968           zoom.extent = function(_) {
22969             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22970           };
22971
22972           zoom.scaleExtent = function(_) {
22973             return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22974           };
22975
22976           zoom.translateExtent = function(_) {
22977             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]]];
22978           };
22979
22980           zoom.constrain = function(_) {
22981             return arguments.length ? (constrain = _, zoom) : constrain;
22982           };
22983
22984           zoom.duration = function(_) {
22985             return arguments.length ? (duration = +_, zoom) : duration;
22986           };
22987
22988           zoom.interpolate = function(_) {
22989             return arguments.length ? (interpolate = _, zoom) : interpolate;
22990           };
22991
22992           zoom.on = function() {
22993             var value = listeners.on.apply(listeners, arguments);
22994             return value === listeners ? zoom : value;
22995           };
22996
22997           zoom.clickDistance = function(_) {
22998             return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
22999           };
23000
23001           return zoom;
23002         }
23003
23004
23005
23006         var index$3 = /*#__PURE__*/Object.freeze({
23007                 version: version,
23008                 bisect: bisectRight,
23009                 bisectRight: bisectRight,
23010                 bisectLeft: bisectLeft,
23011                 ascending: d3_ascending,
23012                 bisector: d3_bisector,
23013                 cross: cross,
23014                 descending: d3_descending,
23015                 deviation: deviation,
23016                 extent: extent,
23017                 histogram: histogram,
23018                 thresholdFreedmanDiaconis: freedmanDiaconis,
23019                 thresholdScott: scott,
23020                 thresholdSturges: thresholdSturges,
23021                 max: max$2,
23022                 mean: mean,
23023                 median: d3_median,
23024                 merge: merge,
23025                 min: min,
23026                 pairs: pairs,
23027                 permute: permute,
23028                 quantile: threshold,
23029                 range: d3_range,
23030                 scan: scan,
23031                 shuffle: shuffle,
23032                 sum: sum,
23033                 ticks: ticks,
23034                 tickIncrement: tickIncrement,
23035                 tickStep: tickStep,
23036                 transpose: transpose,
23037                 variance: variance,
23038                 zip: zip,
23039                 axisTop: axisTop,
23040                 axisRight: axisRight,
23041                 axisBottom: axisBottom,
23042                 axisLeft: axisLeft,
23043                 brush: brush,
23044                 brushX: brushX,
23045                 brushY: brushY,
23046                 brushSelection: brushSelection,
23047                 chord: chord,
23048                 ribbon: ribbon,
23049                 nest: nest,
23050                 set: set$2,
23051                 map: map$3,
23052                 keys: keys$3,
23053                 values: values,
23054                 entries: entries,
23055                 color: color,
23056                 rgb: rgb,
23057                 hsl: hsl,
23058                 lab: lab,
23059                 hcl: hcl,
23060                 lch: lch,
23061                 gray: gray,
23062                 cubehelix: cubehelix,
23063                 contours: contours,
23064                 contourDensity: density,
23065                 dispatch: dispatch,
23066                 drag: d3_drag,
23067                 dragDisable: dragDisable,
23068                 dragEnable: yesdrag,
23069                 dsvFormat: dsvFormat,
23070                 csvParse: csvParse,
23071                 csvParseRows: csvParseRows,
23072                 csvFormat: csvFormat,
23073                 csvFormatBody: csvFormatBody,
23074                 csvFormatRows: csvFormatRows,
23075                 tsvParse: tsvParse,
23076                 tsvParseRows: tsvParseRows,
23077                 tsvFormat: tsvFormat,
23078                 tsvFormatBody: tsvFormatBody,
23079                 tsvFormatRows: tsvFormatRows,
23080                 autoType: autoType,
23081                 easeLinear: linear$1,
23082                 easeQuad: quadInOut,
23083                 easeQuadIn: quadIn,
23084                 easeQuadOut: quadOut,
23085                 easeQuadInOut: quadInOut,
23086                 easeCubic: cubicInOut,
23087                 easeCubicIn: cubicIn,
23088                 easeCubicOut: cubicOut,
23089                 easeCubicInOut: cubicInOut,
23090                 easePoly: polyInOut,
23091                 easePolyIn: polyIn,
23092                 easePolyOut: polyOut,
23093                 easePolyInOut: polyInOut,
23094                 easeSin: sinInOut,
23095                 easeSinIn: sinIn,
23096                 easeSinOut: sinOut,
23097                 easeSinInOut: sinInOut,
23098                 easeExp: expInOut,
23099                 easeExpIn: expIn,
23100                 easeExpOut: expOut,
23101                 easeExpInOut: expInOut,
23102                 easeCircle: circleInOut,
23103                 easeCircleIn: circleIn,
23104                 easeCircleOut: circleOut,
23105                 easeCircleInOut: circleInOut,
23106                 easeBounce: bounceOut,
23107                 easeBounceIn: bounceIn,
23108                 easeBounceOut: bounceOut,
23109                 easeBounceInOut: bounceInOut,
23110                 easeBack: backInOut,
23111                 easeBackIn: backIn,
23112                 easeBackOut: backOut,
23113                 easeBackInOut: backInOut,
23114                 easeElastic: elasticOut,
23115                 easeElasticIn: elasticIn,
23116                 easeElasticOut: elasticOut,
23117                 easeElasticInOut: elasticInOut,
23118                 blob: blob,
23119                 buffer: buffer,
23120                 dsv: dsv,
23121                 csv: csv$1,
23122                 tsv: tsv$1,
23123                 image: image,
23124                 json: d3_json,
23125                 text: d3_text,
23126                 xml: d3_xml,
23127                 html: html,
23128                 svg: svg,
23129                 forceCenter: center$1,
23130                 forceCollide: collide,
23131                 forceLink: link,
23132                 forceManyBody: manyBody,
23133                 forceRadial: radial,
23134                 forceSimulation: simulation,
23135                 forceX: x$2,
23136                 forceY: y$2,
23137                 formatDefaultLocale: defaultLocale,
23138                 get format () { return format; },
23139                 get formatPrefix () { return formatPrefix; },
23140                 formatLocale: formatLocale,
23141                 formatSpecifier: formatSpecifier,
23142                 precisionFixed: precisionFixed,
23143                 precisionPrefix: precisionPrefix,
23144                 precisionRound: precisionRound,
23145                 geoArea: d3_geoArea,
23146                 geoBounds: d3_geoBounds,
23147                 geoCentroid: d3_geoCentroid,
23148                 geoCircle: circle,
23149                 geoClipAntimeridian: clipAntimeridian,
23150                 geoClipCircle: clipCircle,
23151                 geoClipExtent: extent$1,
23152                 geoClipRectangle: clipRectangle,
23153                 geoContains: contains$2,
23154                 geoDistance: distance,
23155                 geoGraticule: graticule,
23156                 geoGraticule10: graticule10,
23157                 geoInterpolate: interpolate$1,
23158                 geoLength: d3_geoLength,
23159                 geoPath: d3_geoPath,
23160                 geoAlbers: albers,
23161                 geoAlbersUsa: albersUsa,
23162                 geoAzimuthalEqualArea: azimuthalEqualArea,
23163                 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
23164                 geoAzimuthalEquidistant: azimuthalEquidistant,
23165                 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
23166                 geoConicConformal: conicConformal,
23167                 geoConicConformalRaw: conicConformalRaw,
23168                 geoConicEqualArea: conicEqualArea,
23169                 geoConicEqualAreaRaw: conicEqualAreaRaw,
23170                 geoConicEquidistant: conicEquidistant,
23171                 geoConicEquidistantRaw: conicEquidistantRaw,
23172                 geoEqualEarth: equalEarth,
23173                 geoEqualEarthRaw: equalEarthRaw,
23174                 geoEquirectangular: equirectangular,
23175                 geoEquirectangularRaw: equirectangularRaw,
23176                 geoGnomonic: gnomonic,
23177                 geoGnomonicRaw: gnomonicRaw,
23178                 geoIdentity: d3_geoIdentity,
23179                 geoProjection: projection,
23180                 geoProjectionMutator: projectionMutator,
23181                 geoMercator: mercator,
23182                 geoMercatorRaw: mercatorRaw,
23183                 geoNaturalEarth1: naturalEarth1,
23184                 geoNaturalEarth1Raw: naturalEarth1Raw,
23185                 geoOrthographic: orthographic,
23186                 geoOrthographicRaw: orthographicRaw,
23187                 geoStereographic: stereographic,
23188                 geoStereographicRaw: stereographicRaw,
23189                 geoTransverseMercator: transverseMercator,
23190                 geoTransverseMercatorRaw: transverseMercatorRaw,
23191                 geoRotation: rotation,
23192                 geoStream: d3_geoStream,
23193                 geoTransform: d3_geoTransform,
23194                 cluster: cluster,
23195                 hierarchy: hierarchy,
23196                 pack: index$1,
23197                 packSiblings: siblings,
23198                 packEnclose: enclose,
23199                 partition: partition,
23200                 stratify: stratify,
23201                 tree: tree,
23202                 treemap: index$2,
23203                 treemapBinary: binary,
23204                 treemapDice: treemapDice,
23205                 treemapSlice: treemapSlice,
23206                 treemapSliceDice: sliceDice,
23207                 treemapSquarify: squarify,
23208                 treemapResquarify: resquarify,
23209                 interpolate: d3_interpolate,
23210                 interpolateArray: array$2,
23211                 interpolateBasis: basis$1,
23212                 interpolateBasisClosed: basisClosed,
23213                 interpolateDate: date,
23214                 interpolateDiscrete: discrete,
23215                 interpolateHue: hue$1,
23216                 interpolateNumber: d3_interpolateNumber,
23217                 interpolateObject: object,
23218                 interpolateRound: interpolateRound,
23219                 interpolateString: interpolateString,
23220                 interpolateTransformCss: interpolateTransformCss,
23221                 interpolateTransformSvg: interpolateTransformSvg,
23222                 interpolateZoom: interpolateZoom,
23223                 interpolateRgb: d3_interpolateRgb,
23224                 interpolateRgbBasis: rgbBasis,
23225                 interpolateRgbBasisClosed: rgbBasisClosed,
23226                 interpolateHsl: hsl$2,
23227                 interpolateHslLong: hslLong,
23228                 interpolateLab: lab$1,
23229                 interpolateHcl: hcl$2,
23230                 interpolateHclLong: hclLong,
23231                 interpolateCubehelix: cubehelix$2,
23232                 interpolateCubehelixLong: cubehelixLong,
23233                 piecewise: piecewise,
23234                 quantize: d3_quantize,
23235                 path: path,
23236                 polygonArea: d3_polygonArea,
23237                 polygonCentroid: d3_polygonCentroid,
23238                 polygonHull: d3_polygonHull,
23239                 polygonContains: contains$3,
23240                 polygonLength: length$1,
23241                 quadtree: quadtree,
23242                 randomUniform: uniform,
23243                 randomNormal: normal,
23244                 randomLogNormal: logNormal,
23245                 randomBates: bates,
23246                 randomIrwinHall: irwinHall,
23247                 randomExponential: exponential$1,
23248                 scaleBand: band,
23249                 scalePoint: point$1,
23250                 scaleIdentity: identity$6,
23251                 scaleLinear: linear$2,
23252                 scaleLog: log$1,
23253                 scaleSymlog: symlog,
23254                 scaleOrdinal: ordinal,
23255                 scaleImplicit: implicit,
23256                 scalePow: pow$1,
23257                 scaleSqrt: sqrt$1,
23258                 scaleQuantile: quantile,
23259                 scaleQuantize: quantize,
23260                 scaleThreshold: threshold$1,
23261                 scaleTime: time,
23262                 scaleUtc: utcTime,
23263                 scaleSequential: sequential,
23264                 scaleSequentialLog: sequentialLog,
23265                 scaleSequentialPow: sequentialPow,
23266                 scaleSequentialSqrt: sequentialSqrt,
23267                 scaleSequentialSymlog: sequentialSymlog,
23268                 scaleSequentialQuantile: sequentialQuantile,
23269                 scaleDiverging: diverging,
23270                 scaleDivergingLog: divergingLog,
23271                 scaleDivergingPow: divergingPow,
23272                 scaleDivergingSqrt: divergingSqrt,
23273                 scaleDivergingSymlog: divergingSymlog,
23274                 tickFormat: tickFormat,
23275                 schemeCategory10: category10,
23276                 schemeAccent: Accent,
23277                 schemeDark2: Dark2,
23278                 schemePaired: Paired,
23279                 schemePastel1: Pastel1,
23280                 schemePastel2: Pastel2,
23281                 schemeSet1: Set1,
23282                 schemeSet2: Set2,
23283                 schemeSet3: Set3,
23284                 interpolateBrBG: BrBG,
23285                 schemeBrBG: scheme,
23286                 interpolatePRGn: PRGn,
23287                 schemePRGn: scheme$1,
23288                 interpolatePiYG: PiYG,
23289                 schemePiYG: scheme$2,
23290                 interpolatePuOr: PuOr,
23291                 schemePuOr: scheme$3,
23292                 interpolateRdBu: RdBu,
23293                 schemeRdBu: scheme$4,
23294                 interpolateRdGy: RdGy,
23295                 schemeRdGy: scheme$5,
23296                 interpolateRdYlBu: RdYlBu,
23297                 schemeRdYlBu: scheme$6,
23298                 interpolateRdYlGn: RdYlGn,
23299                 schemeRdYlGn: scheme$7,
23300                 interpolateSpectral: Spectral,
23301                 schemeSpectral: scheme$8,
23302                 interpolateBuGn: BuGn,
23303                 schemeBuGn: scheme$9,
23304                 interpolateBuPu: BuPu,
23305                 schemeBuPu: scheme$a,
23306                 interpolateGnBu: GnBu,
23307                 schemeGnBu: scheme$b,
23308                 interpolateOrRd: OrRd,
23309                 schemeOrRd: scheme$c,
23310                 interpolatePuBuGn: PuBuGn,
23311                 schemePuBuGn: scheme$d,
23312                 interpolatePuBu: PuBu,
23313                 schemePuBu: scheme$e,
23314                 interpolatePuRd: PuRd,
23315                 schemePuRd: scheme$f,
23316                 interpolateRdPu: RdPu,
23317                 schemeRdPu: scheme$g,
23318                 interpolateYlGnBu: YlGnBu,
23319                 schemeYlGnBu: scheme$h,
23320                 interpolateYlGn: YlGn,
23321                 schemeYlGn: scheme$i,
23322                 interpolateYlOrBr: YlOrBr,
23323                 schemeYlOrBr: scheme$j,
23324                 interpolateYlOrRd: YlOrRd,
23325                 schemeYlOrRd: scheme$k,
23326                 interpolateBlues: Blues,
23327                 schemeBlues: scheme$l,
23328                 interpolateGreens: Greens,
23329                 schemeGreens: scheme$m,
23330                 interpolateGreys: Greys,
23331                 schemeGreys: scheme$n,
23332                 interpolatePurples: Purples,
23333                 schemePurples: scheme$o,
23334                 interpolateReds: Reds,
23335                 schemeReds: scheme$p,
23336                 interpolateOranges: Oranges,
23337                 schemeOranges: scheme$q,
23338                 interpolateCubehelixDefault: cubehelix$3,
23339                 interpolateRainbow: rainbow,
23340                 interpolateWarm: warm,
23341                 interpolateCool: cool,
23342                 interpolateSinebow: sinebow,
23343                 interpolateViridis: viridis,
23344                 interpolateMagma: magma,
23345                 interpolateInferno: inferno,
23346                 interpolatePlasma: plasma,
23347                 create: create$5,
23348                 creator: creator,
23349                 local: local,
23350                 matcher: matcher,
23351                 mouse: d3_mouse,
23352                 namespace: namespace,
23353                 namespaces: namespaces,
23354                 clientPoint: point,
23355                 select: d3_select,
23356                 selectAll: d3_selectAll,
23357                 selection: selection,
23358                 selector: selector,
23359                 selectorAll: selectorAll,
23360                 style: styleValue,
23361                 touch: touch,
23362                 touches: d3_touches,
23363                 window: defaultView,
23364                 get event () { return event; },
23365                 customEvent: customEvent,
23366                 arc: arc,
23367                 area: area$1,
23368                 line: line,
23369                 pie: pie,
23370                 areaRadial: areaRadial,
23371                 radialArea: areaRadial,
23372                 lineRadial: lineRadial$1,
23373                 radialLine: lineRadial$1,
23374                 pointRadial: pointRadial,
23375                 linkHorizontal: linkHorizontal,
23376                 linkVertical: linkVertical,
23377                 linkRadial: linkRadial,
23378                 symbol: symbol,
23379                 symbols: symbols,
23380                 symbolCircle: circle$2,
23381                 symbolCross: cross$2,
23382                 symbolDiamond: diamond,
23383                 symbolSquare: square,
23384                 symbolStar: star,
23385                 symbolTriangle: triangle,
23386                 symbolWye: wye,
23387                 curveBasisClosed: basisClosed$1,
23388                 curveBasisOpen: basisOpen,
23389                 curveBasis: basis$2,
23390                 curveBundle: bundle,
23391                 curveCardinalClosed: cardinalClosed,
23392                 curveCardinalOpen: cardinalOpen,
23393                 curveCardinal: cardinal,
23394                 curveCatmullRomClosed: catmullRomClosed,
23395                 curveCatmullRomOpen: catmullRomOpen,
23396                 curveCatmullRom: catmullRom,
23397                 curveLinearClosed: linearClosed,
23398                 curveLinear: curveLinear,
23399                 curveMonotoneX: monotoneX,
23400                 curveMonotoneY: monotoneY,
23401                 curveNatural: natural,
23402                 curveStep: step,
23403                 curveStepAfter: stepAfter,
23404                 curveStepBefore: stepBefore,
23405                 stack: stack,
23406                 stackOffsetExpand: expand,
23407                 stackOffsetDiverging: diverging$1,
23408                 stackOffsetNone: none$1,
23409                 stackOffsetSilhouette: silhouette,
23410                 stackOffsetWiggle: wiggle,
23411                 stackOrderAppearance: appearance,
23412                 stackOrderAscending: ascending$2,
23413                 stackOrderDescending: descending$1,
23414                 stackOrderInsideOut: insideOut,
23415                 stackOrderNone: none$2,
23416                 stackOrderReverse: reverse,
23417                 timeInterval: newInterval,
23418                 timeMillisecond: millisecond,
23419                 timeMilliseconds: milliseconds,
23420                 utcMillisecond: millisecond,
23421                 utcMilliseconds: milliseconds,
23422                 timeSecond: second,
23423                 timeSeconds: seconds,
23424                 utcSecond: second,
23425                 utcSeconds: seconds,
23426                 timeMinute: minute,
23427                 timeMinutes: minutes,
23428                 timeHour: hour,
23429                 timeHours: hours,
23430                 timeDay: day,
23431                 timeDays: days,
23432                 timeWeek: sunday,
23433                 timeWeeks: sundays,
23434                 timeSunday: sunday,
23435                 timeSundays: sundays,
23436                 timeMonday: monday,
23437                 timeMondays: mondays,
23438                 timeTuesday: tuesday,
23439                 timeTuesdays: tuesdays,
23440                 timeWednesday: wednesday,
23441                 timeWednesdays: wednesdays,
23442                 timeThursday: thursday,
23443                 timeThursdays: thursdays,
23444                 timeFriday: friday,
23445                 timeFridays: fridays,
23446                 timeSaturday: saturday,
23447                 timeSaturdays: saturdays,
23448                 timeMonth: month,
23449                 timeMonths: months,
23450                 timeYear: year,
23451                 timeYears: years,
23452                 utcMinute: utcMinute,
23453                 utcMinutes: utcMinutes,
23454                 utcHour: utcHour,
23455                 utcHours: utcHours,
23456                 utcDay: utcDay,
23457                 utcDays: utcDays,
23458                 utcWeek: utcSunday,
23459                 utcWeeks: utcSundays,
23460                 utcSunday: utcSunday,
23461                 utcSundays: utcSundays,
23462                 utcMonday: utcMonday,
23463                 utcMondays: utcMondays,
23464                 utcTuesday: utcTuesday,
23465                 utcTuesdays: utcTuesdays,
23466                 utcWednesday: utcWednesday,
23467                 utcWednesdays: utcWednesdays,
23468                 utcThursday: utcThursday,
23469                 utcThursdays: utcThursdays,
23470                 utcFriday: utcFriday,
23471                 utcFridays: utcFridays,
23472                 utcSaturday: utcSaturday,
23473                 utcSaturdays: utcSaturdays,
23474                 utcMonth: utcMonth,
23475                 utcMonths: utcMonths,
23476                 utcYear: utcYear,
23477                 utcYears: utcYears,
23478                 timeFormatDefaultLocale: defaultLocale$1,
23479                 get timeFormat () { return timeFormat; },
23480                 get timeParse () { return timeParse; },
23481                 get utcFormat () { return utcFormat; },
23482                 get utcParse () { return utcParse; },
23483                 timeFormatLocale: formatLocale$1,
23484                 isoFormat: formatIso,
23485                 isoParse: parseIso,
23486                 now: now,
23487                 timer: timer,
23488                 timerFlush: timerFlush,
23489                 timeout: d3_timeout,
23490                 interval: interval$1,
23491                 transition: transition,
23492                 active: active,
23493                 interrupt: interrupt,
23494                 voronoi: voronoi,
23495                 zoom: d3_zoom,
23496                 zoomTransform: transform,
23497                 zoomIdentity: identity$8
23498         });
23499
23500         function actionAddEntity(way) {
23501             return function(graph) {
23502                 return graph.replace(way);
23503             };
23504         }
23505
23506         /*
23507         Order the nodes of a way in reverse order and reverse any direction dependent tags
23508         other than `oneway`. (We assume that correcting a backwards oneway is the primary
23509         reason for reversing a way.)
23510
23511         In addition, numeric-valued `incline` tags are negated.
23512
23513         The JOSM implementation was used as a guide, but transformations that were of unclear benefit
23514         or adjusted tags that don't seem to be used in practice were omitted.
23515
23516         References:
23517             http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
23518             http://wiki.openstreetmap.org/wiki/Key:direction#Steps
23519             http://wiki.openstreetmap.org/wiki/Key:incline
23520             http://wiki.openstreetmap.org/wiki/Route#Members
23521             http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
23522             http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
23523             http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
23524         */
23525         function actionReverse(wayID, options) {
23526             var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
23527             var numeric = /^([+\-]?)(?=[\d.])/;
23528             var turn_lanes = /^turn:lanes:?/;
23529             var keyReplacements = [
23530                 [/:right$/, ':left'],
23531                 [/:left$/, ':right'],
23532                 [/:forward$/, ':backward'],
23533                 [/:backward$/, ':forward'],
23534                 [/:right:/, ':left:'],
23535                 [/:left:/, ':right:'],
23536                 [/:forward:/, ':backward:'],
23537                 [/:backward:/, ':forward:']
23538             ];
23539             var valueReplacements = {
23540                 left: 'right',
23541                 right: 'left',
23542                 up: 'down',
23543                 down: 'up',
23544                 forward: 'backward',
23545                 backward: 'forward',
23546                 forwards: 'backward',
23547                 backwards: 'forward',
23548             };
23549             var roleReplacements = {
23550                 forward: 'backward',
23551                 backward: 'forward',
23552                 forwards: 'backward',
23553                 backwards: 'forward'
23554             };
23555             var onewayReplacements = {
23556                 yes: '-1',
23557                 '1': '-1',
23558                 '-1': 'yes'
23559             };
23560
23561
23562             function reverseKey(key) {
23563                 for (var i = 0; i < keyReplacements.length; ++i) {
23564                     var replacement = keyReplacements[i];
23565                     if (replacement[0].test(key)) {
23566                         return key.replace(replacement[0], replacement[1]);
23567                     }
23568                 }
23569                 return key;
23570             }
23571
23572
23573             function reverseValue(key, value) {
23574                 if (ignoreKey.test(key)) return value;
23575
23576                 // Turn lanes are left/right to key (not way) direction - #5674
23577                 if (turn_lanes.test(key)) {
23578                     return value;
23579                 } else if (key === 'incline' && numeric.test(value)) {
23580                     return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
23581                 } else if (options && options.reverseOneway && key === 'oneway') {
23582                     return onewayReplacements[value] || value;
23583                 } else {
23584                     return valueReplacements[value] || value;
23585                 }
23586             }
23587
23588
23589             // Reverse the direction of tags attached to the nodes - #3076
23590             function reverseNodeTags(graph, nodeIDs) {
23591                 for (var i = 0; i < nodeIDs.length; i++) {
23592                     var node = graph.hasEntity(nodeIDs[i]);
23593                     if (!node || !Object.keys(node.tags).length) continue;
23594
23595                     var tags = {};
23596                     for (var key in node.tags) {
23597                         tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
23598                     }
23599                     graph = graph.replace(node.update({tags: tags}));
23600                 }
23601                 return graph;
23602             }
23603
23604
23605             return function(graph) {
23606                 var way = graph.entity(wayID);
23607                 var nodes = way.nodes.slice().reverse();
23608                 var tags = {};
23609                 var role;
23610
23611                 for (var key in way.tags) {
23612                     tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
23613                 }
23614
23615                 graph.parentRelations(way).forEach(function(relation) {
23616                     relation.members.forEach(function(member, index) {
23617                         if (member.id === way.id && (role = roleReplacements[member.role])) {
23618                             relation = relation.updateMember({role: role}, index);
23619                             graph = graph.replace(relation);
23620                         }
23621                     });
23622                 });
23623
23624                 // Reverse any associated directions on nodes on the way and then replace
23625                 // the way itself with the reversed node ids and updated way tags
23626                 return reverseNodeTags(graph, nodes)
23627                     .replace(way.update({nodes: nodes, tags: tags}));
23628             };
23629         }
23630
23631         function osmIsInterestingTag(key) {
23632             return key !== 'attribution' &&
23633                 key !== 'created_by' &&
23634                 key !== 'source' &&
23635                 key !== 'odbl' &&
23636                 key.indexOf('tiger:') !== 0;
23637         }
23638
23639         var osmAreaKeys = {};
23640         function osmSetAreaKeys(value) {
23641             osmAreaKeys = value;
23642         }
23643
23644         // Tags that indicate a node can be a standalone point
23645         // e.g. { amenity: { bar: true, parking: true, ... } ... }
23646         var osmPointTags = {};
23647         function osmSetPointTags(value) {
23648             osmPointTags = value;
23649         }
23650         // Tags that indicate a node can be part of a way
23651         // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
23652         var osmVertexTags = {};
23653         function osmSetVertexTags(value) {
23654             osmVertexTags = value;
23655         }
23656
23657         function osmNodeGeometriesForTags(nodeTags) {
23658             var geometries = {};
23659             for (var key in nodeTags) {
23660                 if (osmPointTags[key] &&
23661                     (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
23662                     geometries.point = true;
23663                 }
23664                 if (osmVertexTags[key] &&
23665                     (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
23666                     geometries.vertex = true;
23667                 }
23668                 // break early if both are already supported
23669                 if (geometries.point && geometries.vertex) break;
23670             }
23671             return geometries;
23672         }
23673
23674         var osmOneWayTags = {
23675             'aerialway': {
23676                 'chair_lift': true,
23677                 'drag_lift': true,
23678                 'j-bar': true,
23679                 'magic_carpet': true,
23680                 'mixed_lift': true,
23681                 'platter': true,
23682                 'rope_tow': true,
23683                 't-bar': true,
23684                 'zip_line': true
23685             },
23686             'highway': {
23687                 'motorway': true
23688             },
23689             'junction': {
23690                 'circular': true,
23691                 'roundabout': true
23692             },
23693             'man_made': {
23694                 'piste:halfpipe': true
23695             },
23696             'piste:type': {
23697                 'downhill': true,
23698                 'sled': true,
23699                 'yes': true
23700             },
23701             'waterway': {
23702                 'canal': true,
23703                 'ditch': true,
23704                 'drain': true,
23705                 'river': true,
23706                 'stream': true
23707             }
23708         };
23709
23710
23711         var osmPavedTags = {
23712             'surface': {
23713                 'paved': true,
23714                 'asphalt': true,
23715                 'concrete': true,
23716                 'concrete:lanes': true,
23717                 'concrete:plates': true
23718             },
23719             'tracktype': {
23720                 'grade1': true
23721             }
23722         };
23723
23724         var osmRightSideIsInsideTags = {
23725             'natural': {
23726                 'cliff': true,
23727                 'coastline': 'coastline',
23728             },
23729             'barrier': {
23730                 'retaining_wall': true,
23731                 'kerb': true,
23732                 'guard_rail': true,
23733                 'city_wall': true,
23734             },
23735             'man_made': {
23736                 'embankment': true
23737             }
23738         };
23739
23740         // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
23741         // (does not include `raceway`)
23742         var osmRoutableHighwayTagValues = {
23743             motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true,
23744             motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true,
23745             unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true,
23746             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23747         };
23748         // "highway" tag values that generally do not allow motor vehicles
23749         var osmPathHighwayTagValues = {
23750             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23751         };
23752
23753         // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
23754         var osmRailwayTrackTagValues = {
23755             rail: true, light_rail: true, tram: true, subway: true,
23756             monorail: true, funicular: true, miniature: true, narrow_gauge: true,
23757             disused: true, preserved: true
23758         };
23759
23760         // "waterway" tag values for line features representing water flow
23761         var osmFlowingWaterwayTagValues = {
23762             canal: true, ditch: true, drain: true, river: true, stream: true
23763         };
23764
23765         // constants
23766         var TAU = 2 * Math.PI;
23767         var EQUATORIAL_RADIUS = 6356752.314245179;
23768         var POLAR_RADIUS = 6378137.0;
23769
23770
23771         function geoLatToMeters(dLat) {
23772             return dLat * (TAU * POLAR_RADIUS / 360);
23773         }
23774
23775
23776         function geoLonToMeters(dLon, atLat) {
23777             return Math.abs(atLat) >= 90 ? 0 :
23778                 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
23779         }
23780
23781
23782         function geoMetersToLat(m) {
23783             return m / (TAU * POLAR_RADIUS / 360);
23784         }
23785
23786
23787         function geoMetersToLon(m, atLat) {
23788             return Math.abs(atLat) >= 90 ? 0 :
23789                 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
23790         }
23791
23792
23793         function geoMetersToOffset(meters, tileSize) {
23794             tileSize = tileSize || 256;
23795             return [
23796                 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
23797                 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
23798             ];
23799         }
23800
23801
23802         function geoOffsetToMeters(offset, tileSize) {
23803             tileSize = tileSize || 256;
23804             return [
23805                 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
23806                 -offset[1] * TAU * POLAR_RADIUS / tileSize
23807             ];
23808         }
23809
23810
23811         // Equirectangular approximation of spherical distances on Earth
23812         function geoSphericalDistance(a, b) {
23813             var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
23814             var y = geoLatToMeters(a[1] - b[1]);
23815             return Math.sqrt((x * x) + (y * y));
23816         }
23817
23818
23819         // scale to zoom
23820         function geoScaleToZoom(k, tileSize) {
23821             tileSize = tileSize || 256;
23822             var log2ts = Math.log(tileSize) * Math.LOG2E;
23823             return Math.log(k * TAU) / Math.LN2 - log2ts;
23824         }
23825
23826
23827         // zoom to scale
23828         function geoZoomToScale(z, tileSize) {
23829             tileSize = tileSize || 256;
23830             return tileSize * Math.pow(2, z) / TAU;
23831         }
23832
23833
23834         // returns info about the node from `nodes` closest to the given `point`
23835         function geoSphericalClosestNode(nodes, point) {
23836             var minDistance = Infinity, distance;
23837             var indexOfMin;
23838
23839             for (var i in nodes) {
23840                 distance = geoSphericalDistance(nodes[i].loc, point);
23841                 if (distance < minDistance) {
23842                     minDistance = distance;
23843                     indexOfMin = i;
23844                 }
23845             }
23846
23847             if (indexOfMin !== undefined) {
23848                 return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
23849             } else {
23850                 return null;
23851             }
23852         }
23853
23854         function geoExtent(min, max) {
23855             if (!(this instanceof geoExtent)) {
23856                 return new geoExtent(min, max);
23857             } else if (min instanceof geoExtent) {
23858                 return min;
23859             } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23860                 this[0] = min[0];
23861                 this[1] = min[1];
23862             } else {
23863                 this[0] = min        || [ Infinity,  Infinity];
23864                 this[1] = max || min || [-Infinity, -Infinity];
23865             }
23866         }
23867
23868         geoExtent.prototype = new Array(2);
23869
23870         Object.assign(geoExtent.prototype, {
23871
23872             equals: function (obj) {
23873                 return this[0][0] === obj[0][0] &&
23874                     this[0][1] === obj[0][1] &&
23875                     this[1][0] === obj[1][0] &&
23876                     this[1][1] === obj[1][1];
23877             },
23878
23879
23880             extend: function(obj) {
23881                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23882                 return geoExtent(
23883                     [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23884                     [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23885                 );
23886             },
23887
23888
23889             _extend: function(extent) {
23890                 this[0][0] = Math.min(extent[0][0], this[0][0]);
23891                 this[0][1] = Math.min(extent[0][1], this[0][1]);
23892                 this[1][0] = Math.max(extent[1][0], this[1][0]);
23893                 this[1][1] = Math.max(extent[1][1], this[1][1]);
23894             },
23895
23896
23897             area: function() {
23898                 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23899             },
23900
23901
23902             center: function() {
23903                 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
23904             },
23905
23906
23907             rectangle: function() {
23908                 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23909             },
23910
23911
23912             bbox: function() {
23913                 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23914             },
23915
23916
23917             polygon: function() {
23918                 return [
23919                     [this[0][0], this[0][1]],
23920                     [this[0][0], this[1][1]],
23921                     [this[1][0], this[1][1]],
23922                     [this[1][0], this[0][1]],
23923                     [this[0][0], this[0][1]]
23924                 ];
23925             },
23926
23927
23928             contains: function(obj) {
23929                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23930                 return obj[0][0] >= this[0][0] &&
23931                        obj[0][1] >= this[0][1] &&
23932                        obj[1][0] <= this[1][0] &&
23933                        obj[1][1] <= this[1][1];
23934             },
23935
23936
23937             intersects: function(obj) {
23938                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23939                 return obj[0][0] <= this[1][0] &&
23940                        obj[0][1] <= this[1][1] &&
23941                        obj[1][0] >= this[0][0] &&
23942                        obj[1][1] >= this[0][1];
23943             },
23944
23945
23946             intersection: function(obj) {
23947                 if (!this.intersects(obj)) return new geoExtent();
23948                 return new geoExtent(
23949                     [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23950                     [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23951                 );
23952             },
23953
23954
23955             percentContainedIn: function(obj) {
23956                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23957                 var a1 = this.intersection(obj).area();
23958                 var a2 = this.area();
23959
23960                 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23961                     return 0;
23962                 } else {
23963                     return a1 / a2;
23964                 }
23965             },
23966
23967
23968             padByMeters: function(meters) {
23969                 var dLat = geoMetersToLat(meters);
23970                 var dLon = geoMetersToLon(meters, this.center()[1]);
23971                 return geoExtent(
23972                     [this[0][0] - dLon, this[0][1] - dLat],
23973                     [this[1][0] + dLon, this[1][1] + dLat]
23974                 );
23975             },
23976
23977
23978             toParam: function() {
23979                 return this.rectangle().join(',');
23980             }
23981
23982         });
23983
23984         // vector equals
23985         function geoVecEqual(a, b, epsilon) {
23986             if (epsilon) {
23987                 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
23988             } else {
23989                 return (a[0] === b[0]) && (a[1] === b[1]);
23990             }
23991         }
23992
23993         // vector addition
23994         function geoVecAdd(a, b) {
23995             return [ a[0] + b[0], a[1] + b[1] ];
23996         }
23997
23998         // vector subtraction
23999         function geoVecSubtract(a, b) {
24000             return [ a[0] - b[0], a[1] - b[1] ];
24001         }
24002
24003         // vector scaling
24004         function geoVecScale(a, mag) {
24005             return [ a[0] * mag, a[1] * mag ];
24006         }
24007
24008         // vector rounding (was: geoRoundCoordinates)
24009         function geoVecFloor(a) {
24010             return [ Math.floor(a[0]), Math.floor(a[1]) ];
24011         }
24012
24013         // linear interpolation
24014         function geoVecInterp(a, b, t) {
24015             return [
24016                 a[0] + (b[0] - a[0]) * t,
24017                 a[1] + (b[1] - a[1]) * t
24018             ];
24019         }
24020
24021         // http://jsperf.com/id-dist-optimization
24022         function geoVecLength(a, b) {
24023             b = b || [0, 0];
24024             var x = a[0] - b[0];
24025             var y = a[1] - b[1];
24026             return Math.sqrt((x * x) + (y * y));
24027         }
24028
24029         // get a unit vector
24030         function geoVecNormalize(a) {
24031             var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1]));
24032             if (length !== 0) {
24033                 return geoVecScale(a, 1 / length);
24034             }
24035             return [0, 0];
24036         }
24037
24038         // Return the counterclockwise angle in the range (-pi, pi)
24039         // between the positive X axis and the line intersecting a and b.
24040         function geoVecAngle(a, b) {
24041             return Math.atan2(b[1] - a[1], b[0] - a[0]);
24042         }
24043
24044         // dot product
24045         function geoVecDot(a, b, origin) {
24046             origin = origin || [0, 0];
24047             var p = geoVecSubtract(a, origin);
24048             var q = geoVecSubtract(b, origin);
24049             return (p[0]) * (q[0]) + (p[1]) * (q[1]);
24050         }
24051
24052         // normalized dot product
24053         function geoVecNormalizedDot(a, b, origin) {
24054             origin = origin || [0, 0];
24055             var p = geoVecNormalize(geoVecSubtract(a, origin));
24056             var q = geoVecNormalize(geoVecSubtract(b, origin));
24057             return geoVecDot(p, q);
24058         }
24059
24060         // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24061         // Returns a positive value, if OAB makes a counter-clockwise turn,
24062         // negative for clockwise turn, and zero if the points are collinear.
24063         function geoVecCross(a, b, origin) {
24064             origin = origin || [0, 0];
24065             var p = geoVecSubtract(a, origin);
24066             var q = geoVecSubtract(b, origin);
24067             return (p[0]) * (q[1]) - (p[1]) * (q[0]);
24068         }
24069
24070
24071         // find closest orthogonal projection of point onto points array
24072         function geoVecProject(a, points) {
24073             var min = Infinity;
24074             var idx;
24075             var target;
24076
24077             for (var i = 0; i < points.length - 1; i++) {
24078                 var o = points[i];
24079                 var s = geoVecSubtract(points[i + 1], o);
24080                 var v = geoVecSubtract(a, o);
24081                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24082                 var p;
24083
24084                 if (proj < 0) {
24085                     p = o;
24086                 } else if (proj > 1) {
24087                     p = points[i + 1];
24088                 } else {
24089                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24090                 }
24091
24092                 var dist = geoVecLength(p, a);
24093                 if (dist < min) {
24094                     min = dist;
24095                     idx = i + 1;
24096                     target = p;
24097                 }
24098             }
24099
24100             if (idx !== undefined) {
24101                 return { index: idx, distance: min, target: target };
24102             } else {
24103                 return null;
24104             }
24105         }
24106
24107         // Return the counterclockwise angle in the range (-pi, pi)
24108         // between the positive X axis and the line intersecting a and b.
24109         function geoAngle(a, b, projection) {
24110             return geoVecAngle(projection(a.loc), projection(b.loc));
24111         }
24112
24113
24114         function geoEdgeEqual(a, b) {
24115             return (a[0] === b[0] && a[1] === b[1]) ||
24116                 (a[0] === b[1] && a[1] === b[0]);
24117         }
24118
24119
24120         // Rotate all points counterclockwise around a pivot point by given angle
24121         function geoRotate(points, angle, around) {
24122             return points.map(function(point) {
24123                 var radial = geoVecSubtract(point, around);
24124                 return [
24125                     radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24126                     radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24127                 ];
24128             });
24129         }
24130
24131
24132         // Choose the edge with the minimal distance from `point` to its orthogonal
24133         // projection onto that edge, if such a projection exists, or the distance to
24134         // the closest vertex on that edge. Returns an object with the `index` of the
24135         // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24136         function geoChooseEdge(nodes, point, projection, activeID) {
24137             var dist = geoVecLength;
24138             var points = nodes.map(function(n) { return projection(n.loc); });
24139             var ids = nodes.map(function(n) { return n.id; });
24140             var min = Infinity;
24141             var idx;
24142             var loc;
24143
24144             for (var i = 0; i < points.length - 1; i++) {
24145                 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24146
24147                 var o = points[i];
24148                 var s = geoVecSubtract(points[i + 1], o);
24149                 var v = geoVecSubtract(point, o);
24150                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24151                 var p;
24152
24153                 if (proj < 0) {
24154                     p = o;
24155                 } else if (proj > 1) {
24156                     p = points[i + 1];
24157                 } else {
24158                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24159                 }
24160
24161                 var d = dist(p, point);
24162                 if (d < min) {
24163                     min = d;
24164                     idx = i + 1;
24165                     loc = projection.invert(p);
24166                 }
24167             }
24168
24169             if (idx !== undefined) {
24170                 return { index: idx, distance: min, loc: loc };
24171             } else {
24172                 return null;
24173             }
24174         }
24175
24176
24177         // Test active (dragged or drawing) segments against inactive segments
24178         // This is used to test e.g. multipolygon rings that cross
24179         // `activeNodes` is the ring containing the activeID being dragged.
24180         // `inactiveNodes` is the other ring to test against
24181         function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24182             var actives = [];
24183             var inactives = [];
24184             var j, k, n1, n2, segment;
24185
24186             // gather active segments (only segments in activeNodes that contain the activeID)
24187             for (j = 0; j < activeNodes.length - 1; j++) {
24188                 n1 = activeNodes[j];
24189                 n2 = activeNodes[j+1];
24190                 segment = [n1.loc, n2.loc];
24191                 if (n1.id === activeID || n2.id === activeID) {
24192                     actives.push(segment);
24193                 }
24194             }
24195
24196             // gather inactive segments
24197             for (j = 0; j < inactiveNodes.length - 1; j++) {
24198                 n1 = inactiveNodes[j];
24199                 n2 = inactiveNodes[j+1];
24200                 segment = [n1.loc, n2.loc];
24201                 inactives.push(segment);
24202             }
24203
24204             // test
24205             for (j = 0; j < actives.length; j++) {
24206                 for (k = 0; k < inactives.length; k++) {
24207                     var p = actives[j];
24208                     var q = inactives[k];
24209                     var hit = geoLineIntersection(p, q);
24210                     if (hit) {
24211                         return true;
24212                     }
24213                 }
24214             }
24215
24216             return false;
24217         }
24218
24219
24220         // Test active (dragged or drawing) segments against inactive segments
24221         // This is used to test whether a way intersects with itself.
24222         function geoHasSelfIntersections(nodes, activeID) {
24223             var actives = [];
24224             var inactives = [];
24225             var j, k;
24226
24227             // group active and passive segments along the nodes
24228             for (j = 0; j < nodes.length - 1; j++) {
24229                 var n1 = nodes[j];
24230                 var n2 = nodes[j+1];
24231                 var segment = [n1.loc, n2.loc];
24232                 if (n1.id === activeID || n2.id === activeID) {
24233                     actives.push(segment);
24234                 } else {
24235                     inactives.push(segment);
24236                 }
24237             }
24238
24239             // test
24240             for (j = 0; j < actives.length; j++) {
24241                 for (k = 0; k < inactives.length; k++) {
24242                     var p = actives[j];
24243                     var q = inactives[k];
24244                     // skip if segments share an endpoint
24245                     if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24246                         geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24247                         continue;
24248                     }
24249
24250                     var hit = geoLineIntersection(p, q);
24251                     if (hit) {
24252                         var epsilon = 1e-8;
24253                         // skip if the hit is at the segment's endpoint
24254                         if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24255                             geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24256                             continue;
24257                         } else {
24258                             return true;
24259                         }
24260                     }
24261                 }
24262             }
24263
24264             return false;
24265         }
24266
24267
24268         // Return the intersection point of 2 line segments.
24269         // From https://github.com/pgkelley4/line-segments-intersect
24270         // This uses the vector cross product approach described below:
24271         //  http://stackoverflow.com/a/565282/786339
24272         function geoLineIntersection(a, b) {
24273             var p = [a[0][0], a[0][1]];
24274             var p2 = [a[1][0], a[1][1]];
24275             var q = [b[0][0], b[0][1]];
24276             var q2 = [b[1][0], b[1][1]];
24277             var r = geoVecSubtract(p2, p);
24278             var s = geoVecSubtract(q2, q);
24279             var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24280             var denominator = geoVecCross(r, s);
24281
24282             if (uNumerator && denominator) {
24283                 var u = uNumerator / denominator;
24284                 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24285
24286                 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24287                     return geoVecInterp(p, p2, t);
24288                 }
24289             }
24290
24291             return null;
24292         }
24293
24294
24295         function geoPathIntersections(path1, path2) {
24296             var intersections = [];
24297             for (var i = 0; i < path1.length - 1; i++) {
24298                 for (var j = 0; j < path2.length - 1; j++) {
24299                     var a = [ path1[i], path1[i+1] ];
24300                     var b = [ path2[j], path2[j+1] ];
24301                     var hit = geoLineIntersection(a, b);
24302                     if (hit) {
24303                         intersections.push(hit);
24304                     }
24305                 }
24306             }
24307             return intersections;
24308         }
24309
24310         function geoPathHasIntersections(path1, path2) {
24311             for (var i = 0; i < path1.length - 1; i++) {
24312                 for (var j = 0; j < path2.length - 1; j++) {
24313                     var a = [ path1[i], path1[i+1] ];
24314                     var b = [ path2[j], path2[j+1] ];
24315                     var hit = geoLineIntersection(a, b);
24316                     if (hit) {
24317                         return true;
24318                     }
24319                 }
24320             }
24321             return false;
24322         }
24323
24324
24325         // Return whether point is contained in polygon.
24326         //
24327         // `point` should be a 2-item array of coordinates.
24328         // `polygon` should be an array of 2-item arrays of coordinates.
24329         //
24330         // From https://github.com/substack/point-in-polygon.
24331         // ray-casting algorithm based on
24332         // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24333         //
24334         function geoPointInPolygon(point, polygon) {
24335             var x = point[0];
24336             var y = point[1];
24337             var inside = false;
24338
24339             for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24340                 var xi = polygon[i][0];
24341                 var yi = polygon[i][1];
24342                 var xj = polygon[j][0];
24343                 var yj = polygon[j][1];
24344
24345                 var intersect = ((yi > y) !== (yj > y)) &&
24346                     (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24347                 if (intersect) inside = !inside;
24348             }
24349
24350             return inside;
24351         }
24352
24353
24354         function geoPolygonContainsPolygon(outer, inner) {
24355             return inner.every(function(point) {
24356                 return geoPointInPolygon(point, outer);
24357             });
24358         }
24359
24360
24361         function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24362             function testPoints(outer, inner) {
24363                 return inner.some(function(point) {
24364                     return geoPointInPolygon(point, outer);
24365                 });
24366             }
24367
24368            return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24369         }
24370
24371
24372         // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
24373         // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
24374         function geoGetSmallestSurroundingRectangle(points) {
24375             var hull = d3_polygonHull(points);
24376             var centroid = d3_polygonCentroid(hull);
24377             var minArea = Infinity;
24378             var ssrExtent = [];
24379             var ssrAngle = 0;
24380             var c1 = hull[0];
24381
24382             for (var i = 0; i <= hull.length - 1; i++) {
24383                 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1];
24384                 var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
24385                 var poly = geoRotate(hull, -angle, centroid);
24386                 var extent = poly.reduce(function(extent, point) {
24387                     return extent.extend(geoExtent(point));
24388                 }, geoExtent());
24389
24390                 var area = extent.area();
24391                 if (area < minArea) {
24392                     minArea = area;
24393                     ssrExtent = extent;
24394                     ssrAngle = angle;
24395                 }
24396                 c1 = c2;
24397             }
24398
24399             return {
24400                 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
24401                 angle: ssrAngle
24402             };
24403         }
24404
24405
24406         function geoPathLength(path) {
24407             var length = 0;
24408             for (var i = 0; i < path.length - 1; i++) {
24409                 length += geoVecLength(path[i], path[i + 1]);
24410             }
24411             return length;
24412         }
24413
24414
24415         // If the given point is at the edge of the padded viewport,
24416         // return a vector that will nudge the viewport in that direction
24417         function geoViewportEdge(point, dimensions) {
24418             var pad = [80, 20, 50, 20];   // top, right, bottom, left
24419             var x = 0;
24420             var y = 0;
24421
24422             if (point[0] > dimensions[0] - pad[1])
24423                 x = -10;
24424             if (point[0] < pad[3])
24425                 x = 10;
24426             if (point[1] > dimensions[1] - pad[2])
24427                 y = -10;
24428             if (point[1] < pad[0])
24429                 y = 10;
24430
24431             if (x || y) {
24432                 return [x, y];
24433             } else {
24434                 return null;
24435             }
24436         }
24437
24438         /*
24439             Bypasses features of D3's default projection stream pipeline that are unnecessary:
24440             * Antimeridian clipping
24441             * Spherical rotation
24442             * Resampling
24443         */
24444         function geoRawMercator() {
24445             var project = mercatorRaw;
24446             var k = 512 / Math.PI; // scale
24447             var x = 0;
24448             var y = 0; // translate
24449             var clipExtent = [[0, 0], [0, 0]];
24450
24451
24452             function projection(point) {
24453                 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24454                 return [point[0] * k + x, y - point[1] * k];
24455             }
24456
24457
24458             projection.invert = function(point) {
24459                 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24460                 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24461             };
24462
24463
24464             projection.scale = function(_) {
24465                 if (!arguments.length) return k;
24466                 k = +_;
24467                 return projection;
24468             };
24469
24470
24471             projection.translate = function(_) {
24472                 if (!arguments.length) return [x, y];
24473                 x = +_[0];
24474                 y = +_[1];
24475                 return projection;
24476             };
24477
24478
24479             projection.clipExtent = function(_) {
24480                 if (!arguments.length) return clipExtent;
24481                 clipExtent = _;
24482                 return projection;
24483             };
24484
24485
24486             projection.transform = function(obj) {
24487                 if (!arguments.length) return identity$8.translate(x, y).scale(k);
24488                 x = +obj.x;
24489                 y = +obj.y;
24490                 k = +obj.k;
24491                 return projection;
24492             };
24493
24494
24495             projection.stream = d3_geoTransform({
24496                 point: function(x, y) {
24497                     var vec = projection([x, y]);
24498                     this.stream.point(vec[0], vec[1]);
24499                 }
24500             }).stream;
24501
24502
24503             return projection;
24504         }
24505
24506         function geoOrthoNormalizedDotProduct(a, b, origin) {
24507             if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
24508                 return 1;  // coincident points, treat as straight and try to remove
24509             }
24510             return geoVecNormalizedDot(a, b, origin);
24511         }
24512
24513
24514         function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
24515             var val = Math.abs(dotp);
24516             if (val < epsilon) {
24517                 return 0;      // already orthogonal
24518             } else if (allowStraightAngles && Math.abs(val-1) < epsilon) {
24519                 return 0;      // straight angle, which is okay in this case
24520             } else if (val < lowerThreshold || val > upperThreshold) {
24521                 return dotp;   // can be adjusted
24522             } else {
24523                 return null;   // ignore vertex
24524             }
24525         }
24526
24527
24528         function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
24529             var score = 0;
24530             var first = isClosed ? 0 : 1;
24531             var last = isClosed ? points.length : points.length - 1;
24532             var coords = points.map(function(p) { return p.coord; });
24533
24534             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24535             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24536
24537             for (var i = first; i < last; i++) {
24538                 var a = coords[(i - 1 + coords.length) % coords.length];
24539                 var origin = coords[i];
24540                 var b = coords[(i + 1) % coords.length];
24541
24542                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
24543                 if (dotp === null) continue;    // ignore vertex
24544                 score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
24545             }
24546
24547             return score;
24548         }
24549
24550         // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
24551         function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
24552             var max = -Infinity;
24553
24554             var first = isClosed ? 0 : 1;
24555             var last = isClosed ? coords.length : coords.length - 1;
24556
24557             for (var i = first; i < last; i++) {
24558                 var a = coords[(i - 1 + coords.length) % coords.length];
24559                 var origin = coords[i];
24560                 var b = coords[(i + 1) % coords.length];
24561                 var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
24562
24563                 var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
24564
24565                 if (angle > 45) angle = 90 - angle;
24566
24567                 if (angle >= lessThan) continue;
24568
24569                 if (angle > max) max = angle;
24570             }
24571
24572             if (max === -Infinity) return null;
24573
24574             return max;
24575         }
24576
24577
24578         // similar to geoOrthoCalcScore, but returns quickly if there is something to do
24579         function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
24580             var score = null;
24581             var first = isClosed ? 0 : 1;
24582             var last = isClosed ? coords.length : coords.length - 1;
24583
24584             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24585             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24586
24587             for (var i = first; i < last; i++) {
24588                 var a = coords[(i - 1 + coords.length) % coords.length];
24589                 var origin = coords[i];
24590                 var b = coords[(i + 1) % coords.length];
24591
24592                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
24593                 if (dotp === null) continue;        // ignore vertex
24594                 if (Math.abs(dotp) > 0) return 1;   // something to do
24595                 score = 0;                          // already square
24596             }
24597
24598             return score;
24599         }
24600
24601         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"]];
24602
24603         var wikibooks$1 = /*#__PURE__*/Object.freeze({
24604                 'default': wikibooks
24605         });
24606
24607         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"]];
24608
24609         var wikinews$1 = /*#__PURE__*/Object.freeze({
24610                 'default': wikinews
24611         });
24612
24613         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"]];
24614
24615         var wikiquote$1 = /*#__PURE__*/Object.freeze({
24616                 'default': wikiquote
24617         });
24618
24619         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"]];
24620
24621         var wikiversity$1 = /*#__PURE__*/Object.freeze({
24622                 'default': wikiversity
24623         });
24624
24625         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"]];
24626
24627         var wikivoyage$1 = /*#__PURE__*/Object.freeze({
24628                 'default': wikivoyage
24629         });
24630
24631         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"]];
24632
24633         var wiktionary$1 = /*#__PURE__*/Object.freeze({
24634                 'default': wiktionary
24635         });
24636
24637         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"]];
24638
24639         var wikipedia$1 = /*#__PURE__*/Object.freeze({
24640                 'default': wikipedia
24641         });
24642
24643         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"]];
24644
24645         var wikisource$1 = /*#__PURE__*/Object.freeze({
24646                 'default': wikisource
24647         });
24648
24649         getCjsExportFromNamespace(wikibooks$1);
24650
24651         getCjsExportFromNamespace(wikinews$1);
24652
24653         getCjsExportFromNamespace(wikiquote$1);
24654
24655         getCjsExportFromNamespace(wikiversity$1);
24656
24657         getCjsExportFromNamespace(wikivoyage$1);
24658
24659         getCjsExportFromNamespace(wiktionary$1);
24660
24661         var require$$6 = getCjsExportFromNamespace(wikipedia$1);
24662
24663         getCjsExportFromNamespace(wikisource$1);
24664
24665         var wikipedia$2 = require$$6;
24666
24667         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"]]}];
24668
24669         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:"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"}},{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:{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:{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"}}];
24670
24671         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};
24672
24673         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}};
24674
24675         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"};
24676
24677         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"}]}]}];
24678
24679         var type$1 = "FeatureCollection";
24680         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]]]}}];
24681         var dataImperial = {
24682         type: type$1,
24683         features: features
24684         };
24685
24686         var type$2 = "FeatureCollection";
24687         var features$1 = [{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]]]}}];
24688         var dataDriveLeft = {
24689         type: type$2,
24690         features: features$1
24691         };
24692
24693         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_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"}}},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/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"},icao:{label:"ICAO"},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"},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"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},produce:{label:"Produce"},product:{label:"Products"},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:""},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:""},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/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/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/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/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/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/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:""},"camp_site/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},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/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/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,phone,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"},"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:""},"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:""},"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/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/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/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_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:""}}},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"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe 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:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-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:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Standard Imagery Vintage"},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."},"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-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."},"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"},"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."},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"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"},"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-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"},"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"}}}}};
24694
24695         var features$2 = {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]]]}},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]]]}},"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]]]}},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]]]}},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.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-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]]]}},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]]]}}};
24696
24697         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/"},"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-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"}]},"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"}]},"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"},"OSM-NI-telegram":{id:"OSM-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:"Talk-ni Owner",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:"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/"},"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-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"}]},"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/"}]}};
24698
24699         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",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:"DigitalGlobe-Premium",name:"DigitalGlobe Premium Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe 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/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Premium-vintage",name:"DigitalGlobe Premium Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Standard",name:"DigitalGlobe Standard Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-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/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Standard-vintage",name:"DigitalGlobe Standard Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",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"},{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://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{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://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{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:4326",zoomExtent:[17,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-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"}];
24700
24701         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"},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"},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:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"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/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","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","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","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","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","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","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","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",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],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",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],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","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","website","phone","email","fax","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","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/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","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:"maki-restaurant",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","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","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","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/kindergarten":{icon:"maki-school",fields:["name","operator","address"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","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","building_area","address","ref/isil","internet_access","internet_access/fee"],moreFields:["access_simple","air_conditioning","opening_hours","internet_access/ssid","website","phone","email","fax","wheelchair","payment_multi"],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","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"],name:"Multilevel Parking Garage"},"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"],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","opening_hours","internet_access","internet_access/ssid","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","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:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"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","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","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","operator","opening_hours","capacity","website","lit"],moreFields:["wheelchair","location","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","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","address","religion","denomination","website"],moreFields:["internet_access","internet_access/ssid","phone","email","fax","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","address","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","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","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","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","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"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],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/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"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",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"],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",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",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"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},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",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:"maki-attraction",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/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:"maki-attraction",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:"maki-attraction",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/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","phone","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},"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"],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"},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","to","from"],moreFields:["maxheight","maxweight","opening_hours","wheelchair"],tags:{route:"ferry"},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:"maki-shop",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"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:"fas-mask",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/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/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_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","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:["name","ref_route","operator","network","to","from"],moreFields:["interval","maxheight","maxweight","opening_hours","duration","wheelchair"],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","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"],moreFields:["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",geometry:["vertex","line"],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.",operator:"ABN AMRO Group","operator:wikidata":"Q17061287","operator:wikipedia":"en:ABN AMRO Group"},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",operator:"Commonwealth Bank of Australia","operator:wikidata":"Q285328","operator:wikipedia":"en:Commonwealth 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",operator:"Access Bank Group","operator:wikidata":"Q4672420","operator:wikipedia":"en:Access Bank Group"},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://pbs.twimg.com/profile_images/580476082798923776/6wuC8WL4_bigger.png",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://graph.facebook.com/AllahabadBank/picture?type=large",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlpha%20Bank%20logo.svg&width=100",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",operator:"Hellenic Financial Stability Fund","operator:wikidata":"Q19903317","operator:wikipedia":"en:Hellenic Financial Stability Fund"},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",operator:"Argenta Group","operator:wikidata":"Q19604341"},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",operator:"Associated Banc-Corp"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/689449211050393601/0_NfM1Dp_bigger.jpg",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",operator:"Société Nationale d'Investissement","operator:en":"National Investment Company","operator:wikidata":"Q3488506","operator:wikipedia":"en:Société Nationale d'Investissement"},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",operator:"Grupo Aval","operator:en":"Aval Group","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"},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",operator:"Baden-Württembergischer Genossenschaftsverband","operator:en":"Baden-Württemberg Cooperative Association","operator:wikidata":"Q798896","operator:wikipedia":"de:Baden-Württembergischer Genossenschaftsverband"},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://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBBVA%202019.svg&width=100",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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1137091638935863296/yKCGa-Fa_bigger.png",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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},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://pbs.twimg.com/profile_images/841417123339616257/leTBJ_Ls_bigger.jpg",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",operator:"Banco de Crédito del Perú","operator:en":"Credit Bank of Peru","operator:es":"Banco de Crédito del Perú","operator:wikidata":"Q4854124","operator:wikipedia":"es:Banco de Crédito del Perú"},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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl: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://pbs.twimg.com/profile_images/824289835988951040/YC83rlON_bigger.jpg",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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"},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":{name:"BMO",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","us"],terms:["bmo bank of montreal"],matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",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",operator:"Bank of Montreal","operator:wikidata":"Q806693","operator:wikipedia":"en:Bank of Montreal"},countryCodes:["us"],terms:[],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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"en:BNP Paribas"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1129679122182082561/dBPwAfEP_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBoc2013%20ft%20logo.png&width=100",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/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",operator:"Groupe BPCE","operator:en":"BPCE Group","operator:fr":"Groupe BPCE","operator:wikidata":"Q806941","operator:wikipedia":"en:Groupe BPCE"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBaden-W%C3%BCrttembergische%20Bank%20text%20logo%20black.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q798891",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:ed":"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",operator:"Landesbank Baden-Württemberg","operator:de":"Landesbank Baden-Württemberg","operator:en":"Baden-Württemberg Regional Bank","operator:wikidata":"Q451814","operator:wikipedia":"en:Landesbank Baden-Württemberg"},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",operator:"Citigroup","operator:wikidata":"Q219508","operator:wikipedia":"en:Citigroup"},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",operator:"Intesa Sanpaolo","operator:en":"Intesa St. Paul","operator:it":"Intesa Sanpaolo","operator:wikidata":"Q1343118","operator:wikipedia":"en:Intesa Sanpaolo"},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",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"},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",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"},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",operator:"Banco Popolare","operator:en":"Popular Bank","operator:it":"Banco Popolare","operator:wikidata":"Q806194","operator:wikipedia":"en:Banco Popolare"},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",operator:"Atlante","operator:en":"Atlas","operator:it":"Atlante","operator:wikidata":"Q25206459","operator:wikipedia":"en:Atlante (private equity fund)"},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ă",operator:"National Bank of Greece","operator:wikidata":"Q1816028","operator:wikipedia":"en:National Bank of Greece"},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",operator:"Grupo Aval","operator:en":"Aval Group","operator:pt":"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Agrario%20de%20Colombia%20logo.svg&width=100",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",operator:"Grupo Elektra","operator:en":"Elektra Group","operator:es":"Grupo Elektra","operator:wikidata":"Q1142753","operator:wikipedia":"en:Grupo Elektra"},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",operator:"Falabella","operator:es":"Falabella","operator:wikidata":"Q1374824","operator:wikipedia":"en:S.A.C.I. 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://pbs.twimg.com/profile_images/1086265271898202112/jhjR8vK2_bigger.jpg",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",operator:"BIND Group"},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",geometry:["point","area"],tags:{"brand:wikidata":"Q4854104",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"},countryCodes:["br"],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",operator:"Popular, Inc.","operator:wikidata":"Q7229656","operator:wikipedia":"en:Popular, Inc."},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",operator:"Grupo Pichincha","operator:wikidata":"Q6440687","operator:wikipedia":"es:Grupo Pichincha"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupobancopopular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q537259",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español",operator:"Banco Santander","operator:wikidata":"Q806215","operator:wikipedia":"en:Banco Santander"},countryCodes:["us","vi"],terms:["popular"],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á",operator:"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"},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://pbs.twimg.com/profile_images/598696774920835072/Fz_rBV61_bigger.jpg",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://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",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://pbs.twimg.com/profile_images/924817393049677824/zctRzkcO_bigger.jpg",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",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/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://pbs.twimg.com/profile_images/598696774920835072/Fz_rBV61_bigger.jpg",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",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",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",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/Canara Bank":{name:"Canara Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/canarabankglobal/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",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/1138902469201801216/kIpfpW_m_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",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:["de","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",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 Bank":{name:"EastWest Bank",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 Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest 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:[],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",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://pbs.twimg.com/profile_images/1006473636620963842/3eFmAKr3_bigger.jpg",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://pbs.twimg.com/profile_images/2181568914/527318_348483655208805_236502029740302_986925_830235027_n_bigger.jpg",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://pbs.twimg.com/profile_images/1135542453543550977/MGMFDH7x_bigger.png",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://pbs.twimg.com/profile_images/815922892869423108/PEISbMWQ_bigger.jpg",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 (Western USA)":{name:"First Bank (Western USA)",icon:"maki-bank",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:[],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank (Trinidad and Tobago)":{name:"First Citizens Bank (Trinidad and Tobago)",icon:"maki-bank",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://pbs.twimg.com/profile_images/913797195782148096/Gps3Vaqp_bigger.jpg",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 Midwest Bank":{name:"First Midwest Bank",icon:"maki-bank",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://pbs.twimg.com/profile_images/1030111772605173762/949xGWES_bigger.jpg",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",operator:"Fulton Financial Corporation","operator:wikidata":"Q5508431","operator:wikipedia":"en:Fulton Financial Corporation"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20galicia%20logo.png&width=100",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%2FBBVA%202019.svg&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%2FBBVA%202019.svg&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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGetin%20Bank%20Logo.png&width=100",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",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://pbs.twimg.com/profile_images/895259332107010050/pB7ruENL_bigger.jpg",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",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":{name:"HSBC",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1029690966758895616/3T9gt_mL_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHandelsbanken.svg&width=100",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://pbs.twimg.com/profile_images/1826329346/Heritage_Bank_logo_Square_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHong%20Leong%20Bank.svg&width=100",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",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://pbs.twimg.com/profile_images/1136005142858424321/MvHrZYI8_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",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://pbs.twimg.com/profile_images/1121403488292851713/XrMDErhB_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FING%20Group%20N.V.%20Logo.svg&width=100",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",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",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://pbs.twimg.com/profile_images/940112386027147264/uciMr62n_bigger.jpg",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://pbs.twimg.com/profile_images/690239152504307712/41xwql8A_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Sanpaolo.gif&width=100",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://pbs.twimg.com/profile_images/1136387506818113538/CaBmzzwQ_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FItau.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJS%20Bank%20-%20New%20logo%202011%20-%20Copy.png&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKeyBank.png&width=100",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://pbs.twimg.com/profile_images/1131535603777060867/lwDe8P5N_bigger.jpg",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://pbs.twimg.com/profile_images/1110433478343053314/J_fxuytW_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKutxabank.svg&width=100",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",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://pbs.twimg.com/profile_images/899663758662017024/JLvGAjAM_bigger.jpg",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/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/877443340551282689/fZlNq46c_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFundaci%C3%B3n%20bancaria%20la%20caixa.jpg&width=100",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://pbs.twimg.com/profile_images/935069892683927552/gCjeXHBh_bigger.jpg",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",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://pbs.twimg.com/profile_images/882560751629742082/qQgEeneD_bigger.jpg",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://pbs.twimg.com/profile_images/1113761969448865792/ni1LBvk__bigger.png",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://pbs.twimg.com/profile_images/1136639701056655360/qxTpE9Do_bigger.png",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://pbs.twimg.com/profile_images/1096422949081341953/zTOinsUb_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Banco%20Macro.svg&width=100",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://pbs.twimg.com/profile_images/1035410125601886208/2TiXmDhB_bigger.jpg",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/Mibanco":{name:"Mibanco",icon:"maki-bank",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",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/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",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",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://pbs.twimg.com/profile_images/1086907839820398592/h_bUA0T6_bigger.jpg",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://pbs.twimg.com/profile_images/1134723716364013569/KL1GTzee_bigger.png",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://pbs.twimg.com/profile_images/1139126037676285952/ODyln4C0_bigger.png",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",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://pbs.twimg.com/profile_images/729590013856382976/KEp-3zPj_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Novo%20Banco.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",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://pbs.twimg.com/profile_images/599117673033637888/dxClM7lU_bigger.jpg",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://pbs.twimg.com/profile_images/948214548519112704/QopepRkh_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",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",operator:"Banco de Oro","operator:wikidata":"Q4854129","operator:wikipedia":"en:Banco de Oro"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/887244088378052608/L2VNwfzZ_bigger.jpg",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://pbs.twimg.com/profile_images/550208070584786944/XIkH6cRe_bigger.png",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotyp%20PKO%20BP.svg&width=100",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://pbs.twimg.com/profile_images/701620751019827200/E4JWcIfp_bigger.jpg",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",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://pbs.twimg.com/profile_images/1064714176596254720/afM24Gwn_bigger.jpg",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",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":{name:"Peoples Bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/956878317642289152/3eKgkDXU_bigger.jpg",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/Postbank (Bulgaria)":{name:"Postbank (Bulgaria)",icon:"maki-bank",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://pbs.twimg.com/profile_images/908269765227053056/0zk6Mfhc_bigger.jpg",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/894046729062027264/48n7ij3E_bigger.jpg",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://pbs.twimg.com/profile_images/1135532386949763072/NdPhjrB6_bigger.png",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://pbs.twimg.com/profile_images/1134724783931887616/h5bixsdB_bigger.png",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",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",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://pbs.twimg.com/profile_images/1098603227333959687/q1wdK2sL_bigger.png",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",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/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/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/SantanderRio/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":{name:"Scotiabank",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:[],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",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/spardabankmuenchen/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/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:["ca","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/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/1137216537289302016/nDiuFr0P_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/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/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/1135930358636134407/TypmFPcO_bigger.png",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://pbs.twimg.com/profile_images/956878317642289152/3eKgkDXU_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",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",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/1054304253831974912/7JMH1giO_bigger.jpg",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/1014466369105158144/UyZ584fr_bigger.jpg",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://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":"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":"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://pbs.twimg.com/profile_images/924817393049677824/zctRzkcO_bigger.jpg",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/1135574794030555137/jPG1Vsfu_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",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20citic.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",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",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20cmbc.gif&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBoc2013%20ft%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",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",operator:"nextbike","operator:wikidata":"Q2351279","operator:wikipedia":"de:Nextbike"},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/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/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/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é 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/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/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/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é","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's",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","peets coffee and 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/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/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",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/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",geometry:["point","area"],tags:{"brand:wikidata":"Q11305989",amenity:"cafe"},addTags:{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://graph.facebook.com/blinknetwork/picture?type=large",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/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/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","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/109シネマズ":{name:"109シネマズ",icon:"maki-cinema",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シネマズ",operator:"株式会社 東急レクリエーション","operator:en":"Tokyu Recreation Co., Ltd.","operator:wikidata":"Q11527011","operator:wikipedia":"ja:東急レクリエーション"},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://graph.facebook.com/RegalMovies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q835638",amenity:"cinema"},addTags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q835638","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"},countryCodes:["us"],terms:["b and b","b and b theatres","b&b theaters"],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",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplexx":{name:"Cineplexx",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/1125406971023306754/aVpG7gAl_bigger.png",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://pbs.twimg.com/profile_images/1130630166344945664/zjkVbEAk_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHOYTS%20LOGO%20RED-01.png&width=100",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",operator:"株式会社松竹マルチプレックスシアターズ","operator:en":"Shochiku Multiplex Theatres, Ltd."},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",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シネマズ",operator:"TOHOシネマズ株式会社","operator:en":"TOHO CINEMAS LTD.",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",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":"イオンシネマ",operator:"イオンエンターテイメント株式会社","operator:en":"Aeon Entertainment Co., Ltd."},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":"ユナイテッド・シネマ",operator:"ユナイテッド・シネマ株式会社","operator:en":"UNITED CINEMAS CO., LTD."},countryCodes:["jp"],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/davitakidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5207184",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5207184","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/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/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:["western dental and orthodontics"],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:"maki-restaurant",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:"maki-restaurant",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/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:"maki-restaurant",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",takeaway:"yes"},countryCodes:["us"],terms:["breuger's","breugger's","bruegger'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/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:"maki-restaurant",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/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":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya",takeaway:"yes"},countryCodes:["cn","jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cofix":{name:"Cofix",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Cofix.co.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16132717",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cofix","brand:wikidata":"Q16132717","brand:wikipedia":"en:Cofix",name:"Cofix",takeaway:"yes"},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:"maki-restaurant",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/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",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["dominos"],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:"maki-restaurant",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",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:["freddys frozen custard & steakburgers","freddys frozen custard and steakburgers"],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",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:["ca"],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/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",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:["hot head"],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:"maki-restaurant",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",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["jersey mikes"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",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/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:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:["kentucky fried chicken"],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/sandwich/Lee's Sandwiches":{name:"Lee's Sandwiches",icon:"maki-restaurant",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"],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/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",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:["moes "],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",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/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:"maki-restaurant",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:"maki-restaurant",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/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:"maki-restaurant",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:"maki-restaurant",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:"maki-restaurant",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/Sarku Japan":{name:"Sarku Japan",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSarku%20Japan%20logo.png&width=100",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:"maki-restaurant",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",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:"maki-restaurant",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/sandwich/Steak Escape":{name:"Steak Escape",icon:"maki-restaurant",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:"maki-restaurant",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/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/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:"maki-restaurant",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/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/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",takeaway:"yes"},countryCodes:["us"],terms:["wahoo's"],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:"maki-restaurant",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",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://pbs.twimg.com/profile_images/955840927968280576/pAowOseE_bigger.jpg",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:"maki-restaurant",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:"maki-restaurant",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 Пицца",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:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/874903323660439552/wUgjK1EH_bigger.jpg",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/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/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/かっぱ寿司":{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://pbs.twimg.com/profile_images/999109688582008832/evpixQ34_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHokka-Hokka%20Tei%20logo.gif&width=100",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",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/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",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:"maki-restaurant",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":"ドミノ・ピザ",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/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/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",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:"日高屋",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 Foods","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya Foods",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/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:lzh":"麥當勞","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:lzh":"麥當勞",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":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳",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",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/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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour"},terms:[],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",operator:"Q1 Energie AG","operator:wikidata":"Q2121146","operator:wikipedia":"de:Q1 Energie"},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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},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/turkeyhillstores/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/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:["ben and jerrys"],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/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/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 & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","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/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/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/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/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/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",operator:"Apollo Hospitals","operator:wikidata":"Q4780321","operator:wikipedia":"en:Apollo Hospitals"},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":{name:"CVS",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","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},terms:["cvs pharmacy"],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/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/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/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/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/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/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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},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",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group"},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/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/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",operator:"USPS","operator:wikidata":"Q668687"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCorreios%20(2014).svg&width=100",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",operator:"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"},countryCodes:["ca","us"],terms:["ups","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",operator:"USPS","operator:wikidata":"Q668687"},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"},countryCodes:[],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/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/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 & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill and bar"],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/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:["bjs restaurant and brewhouse"],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/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:["buffalo wings and rings"],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://pbs.twimg.com/profile_images/2564135938/i7bi5jrxpjt6di0praf9_bigger.jpeg",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:["chili's grill and bar"],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://pbs.twimg.com/profile_images/1082685748028026880/pPcUFDue_bigger.jpg",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",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc."},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/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",imageURL:"https://graph.facebook.com/GrillCourtePaille/picture?type=large",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/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 & grill","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/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/american/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:"american"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},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/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/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/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 & schmick","mccormick & schmicks grill","mccormick and schmick","mccormick and schmick's"],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/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/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 company","noodles co"],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:"burger",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/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 (Branded)":{name:"Phở Hòa (Branded)",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:["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:["quaker steak and lube"],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/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/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/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/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/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:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","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:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路"},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":"華屋与兵衛",operator:"株式会社ゼンショーホールディングス","operator:en":"Zensho Holdings Co., Ltd.","operator:ja":"株式会社ゼンショーホールディングス","operator:wikidata":"Q8069229","operator:wikipedia":"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/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/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",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/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/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",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"en:DHL Express",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",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"de:DHL",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/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:"dvd"},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",operator:"Posti Group","operator:wikidata":"Q843453","operator:wikipedia":"fi:Posti Group",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/1133719168996564992/YYUxyMIM_bigger.png",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":"コカ・コーラ",operator:"Coca Cola Japan Co., Ltd.","operator:wikidata":"Q11506438","operator:wikipedia":"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",operator:"Australian Red Cross Blood Service","operator:wikidata":"Q4824602","operator:wikipedia":"en: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",operator:"AvalonBay Communities","operator:wikidata":"Q4827537","operator:wikipedia":"en:AvalonBay Communities",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:[],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"},countryCodes:["au"],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/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/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},"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/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/Connells":{name:"Connells",icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{"brand:wikidata":"Q1526312",office:"estate_agent"},addTags:{brand:"Connells","brand:wikidata":"Q1526312","brand:wikipedia":"en:The Connells",name:"Connells",office:"estate_agent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Engel & Völkers":{name:"Engel & Völkers",icon:"temaki-real_estate_agency",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEngel-voelkers-logo.png&width=100",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/RE/MAX":{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://pbs.twimg.com/profile_images/1135951897582587905/1LahD9Lm_bigger.png",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://graph.facebook.com/AOK.BW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q295933",office:"insurance"},addTags:{brand:"AOK","brand:wikidata":"Q295933","brand:wikipedia":"de:AOK Baden-Württemberg",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/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://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrtelecom.png&width=100",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/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",operator:"Pennsylvania Liquor Control Board","operator:wikidata":"Q7164000","operator:wikipedia":"en:Pennsylvania Liquor Control Board",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",operator:"Coles Group","operator:wikidata":"Q1339055","operator:wikipedia":"en:Coles Group",shop:"alcohol"},countryCodes:["au"],terms:[],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/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/Spec's":{name:"Spec's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1138088997467623424/F9TQyxlR_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/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/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/巴黎贝甜 (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:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",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/サイクルベースあさひ":{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/1037325155310161921/6E9Rvy3Y_bigger.jpg",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/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/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/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/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",operator:"Genuine Parts Company","operator:wikidata":"Q5533818","operator:wikipedia":"en:Genuine Parts Company",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:[],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://pbs.twimg.com/profile_images/1069402555938037761/aK6lJYjW_bigger.jpg",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/1003734298048905217/s6j3I8IK_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",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",shop:"car_repair"},countryCodes:["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 & auto service","tuffy tire & auto service center","tuffy tire & auto 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/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/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://graph.facebook.com/landroverusa/picture?type=large",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/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",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/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/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/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/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/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/1107597207384088576/6Y06g3zq_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",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group",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/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"},countryCodes:["us"],terms:["godiva"],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/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":"アオキ",operator:"株式会社AOKIホールディングス","operator:en":"AOKI Holdings Inc.",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/MonsoonUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",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","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",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/Bonita":{name:"Bonita",icon:"maki-clothing-store",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","operator:wikidata":"Q5050852","operator:wikipedia":"en:Destination XL Group",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&g","dolce & gabana","dolce & gabanna","dolce & gabbanna","dolce and gabana","dolce and gabanna","dolce and gabbana","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/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/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/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/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:[],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/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:["janie and jack"],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",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/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/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",operator:"Ann Inc.","operator:wikidata":"Q4766699","operator:wikipedia":"en:Ann Inc.",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","operator:wikidata":"Q5370765","operator:wikipedia":"en:J.Crew",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/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":"Q3069980",shop:"clothes"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},countryCodes:["gb","gg","ie"],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","operator:wikidata":"Q28172489","operator:wikipedia":"en:Bestseller (company)",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://graph.facebook.com/PEPCOpl/picture?type=large",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",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",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",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},countryCodes:["at","ch","de","hr","it","ru"],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/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",operator:"CBR Fashion Holding","operator:wikidata":"Q1022989","operator:wikipedia":"de:CBR Fashion Holding",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/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/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://pbs.twimg.com/profile_images/1047115960497463297/pAYqykoJ_bigger.jpg",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:[],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/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:[],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/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/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/143773816138046/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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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/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/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://pbs.twimg.com/profile_images/875897219508871168/OZ1swK9c_bigger.jpg",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/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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVkusVill%20textlogo.png&width=100",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/Копейка":{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",imageURL:"https://pbs.twimg.com/profile_images/875617750923616257/dCryLWcX_bigger.jpg",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",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"en:Seven & I Holdings Co.",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://pbs.twimg.com/profile_images/875897219508871168/OZ1swK9c_bigger.jpg",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":"ローソン・スリーエフ",operator:"株式会社エル・ティーエフ","operator:en":"L・TF Co., Ltd.",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/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","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},countryCodes:["ca","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/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/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/1117907267343532035/bNbA3Pv5_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:[],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:["lord and taylor"],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:["marks and spencer"],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",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",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://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en: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://pbs.twimg.com/profile_images/496081734534844416/2dQvcYKy_bigger.jpeg",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/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/komeri.recruit.jp/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:[],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/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",operator:"ElectronicPartner","operator:wikidata":"Q1326008","operator:wikipedia":"de:ElectronicPartner",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://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/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","van cleef and arpels","van cleef and 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/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:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},countryCodes:["ca","us"],terms:["ashley furniture","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:["crate and barrel"],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/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/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/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",operator:"Disney Consumer Products","operator:wikidata":"Q3030410","operator:wikipedia":"en:Disney Consumer Products and Interactive Media",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/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"],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/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",imageURL:"https://graph.facebook.com/harbor.f.tools/picture?type=large",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.germany/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/1136291410636754944/XbHAPXKQ_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:["holland and barrett"],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:"maki-shop",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:"maki-shop",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/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:["bed bath and beyond"],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/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/Claire's":{name:"Claire's",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/claires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974996",shop:"jewelry"},addTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"jewelry"},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",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",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",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",shop:"jewelry"},countryCodes:["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/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 and company","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/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/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/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:[],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:[],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",imageURL:"https://pbs.twimg.com/profile_images/1090909837385441280/-CqxodYE_bigger.jpg",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/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/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/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/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/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/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/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",operator:"GrandVision","operator:wikidata":"Q15812731","operator:wikipedia":"nl:GrandVision",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",imageURL:"https://graph.facebook.com/targetopticalnn/picture?type=large",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/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://pbs.twimg.com/profile_images/909819274851741696/br7A2jTq_bigger.jpg",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/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",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:"fas-mask",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/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"},countryCodes:["ph"],terms:[],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",operator:"Petco","operator:wikidata":"Q7171798","operator:wikipedia":"en:Petco",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/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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",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/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/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://pbs.twimg.com/profile_images/1119296742300766209/G_KesZkl_bigger.png",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/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://pbs.twimg.com/profile_images/561257801650302976/enHlVVdc_bigger.jpeg",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:["johnston and murphy"],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",operator:"Genesco","operator:wikidata":"Q5532704","operator:wikipedia":"en:Genesco",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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"},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/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",operator:"Wortmann Schuh-Holding","operator:wikidata":"Q1726079","operator:wikipedia":"de:Wortmann Schuh-Holding",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/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",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/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/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/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",imageURL:"https://graph.facebook.com/mcpaperberlin/picture?type=large",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/Papyrus":{name:"Papyrus",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/papyrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28222692",shop:"stationery"},addTags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",shop:"stationery"},countryCodes:["us"],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/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","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe 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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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",operator:"Edeka","operator:wikidata":"Q701755","operator:wikipedia":"en:Edeka",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",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",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","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",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/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"},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/Iceland":{name:"Iceland",icon:"maki-grocery",imageURL:"https://graph.facebook.com/icelandfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721810",shop:"supermarket"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},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/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","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados 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","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",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/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",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",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/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/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/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:["stop and shop"],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/1135401302178041857/BADvlDme_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/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:[],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/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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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/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:["евроопт market"],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":"ヨークマート",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"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 Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",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/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/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/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":{name:"TUI",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/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/Thomson":{name:"Thomson",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/worldofTUI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7795876",shop:"travel_agency"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},countryCodes:["gb"],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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEuroshop%20LOGO.jpg&width=100",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/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",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",operator:"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",operator:"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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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":"コストコ",operator:"コストコホールセールジャパン株式会社","operator:en":"Costco Wholesale Japan Co., Ltd.",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 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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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 & suites","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",operator:"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 & suites","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/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",operator:"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",operator:"Hyatt",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",operator:"Hyatt",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",operator:"Hyatt",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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},countryCodes:["us"],terms:["la quinta inn & suites","la quinta inn and suites","la quinta inns & 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",operator:"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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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",operator:"Marriott International","operator:wikidata":"Q1141173","operator:wikipedia":"en:Marriott International",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/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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true}};
24702
24703         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"]};
24704
24705         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"]}};
24706
24707         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"}}}},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/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"},icao:{key:"icao",type:"text",label:"ICAO"},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"},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"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},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"}}}};
24708
24709         var quickselect = createCommonjsModule(function (module, exports) {
24710         (function (global, factory) {
24711                 module.exports = factory();
24712         }(commonjsGlobal, (function () {
24713         function quickselect(arr, k, left, right, compare) {
24714             quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
24715         }
24716
24717         function quickselectStep(arr, k, left, right, compare) {
24718
24719             while (right > left) {
24720                 if (right - left > 600) {
24721                     var n = right - left + 1;
24722                     var m = k - left + 1;
24723                     var z = Math.log(n);
24724                     var s = 0.5 * Math.exp(2 * z / 3);
24725                     var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24726                     var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24727                     var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24728                     quickselectStep(arr, k, newLeft, newRight, compare);
24729                 }
24730
24731                 var t = arr[k];
24732                 var i = left;
24733                 var j = right;
24734
24735                 swap(arr, left, k);
24736                 if (compare(arr[right], t) > 0) swap(arr, left, right);
24737
24738                 while (i < j) {
24739                     swap(arr, i, j);
24740                     i++;
24741                     j--;
24742                     while (compare(arr[i], t) < 0) i++;
24743                     while (compare(arr[j], t) > 0) j--;
24744                 }
24745
24746                 if (compare(arr[left], t) === 0) swap(arr, left, j);
24747                 else {
24748                     j++;
24749                     swap(arr, j, right);
24750                 }
24751
24752                 if (j <= k) left = j + 1;
24753                 if (k <= j) right = j - 1;
24754             }
24755         }
24756
24757         function swap(arr, i, j) {
24758             var tmp = arr[i];
24759             arr[i] = arr[j];
24760             arr[j] = tmp;
24761         }
24762
24763         function defaultCompare(a, b) {
24764             return a < b ? -1 : a > b ? 1 : 0;
24765         }
24766
24767         return quickselect;
24768
24769         })));
24770         });
24771
24772         var rbush_1 = rbush;
24773         var default_1 = rbush;
24774
24775
24776
24777         function rbush(maxEntries, format) {
24778             if (!(this instanceof rbush)) return new rbush(maxEntries, format);
24779
24780             // max entries in a node is 9 by default; min node fill is 40% for best performance
24781             this._maxEntries = Math.max(4, maxEntries || 9);
24782             this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
24783
24784             if (format) {
24785                 this._initFormat(format);
24786             }
24787
24788             this.clear();
24789         }
24790
24791         rbush.prototype = {
24792
24793             all: function () {
24794                 return this._all(this.data, []);
24795             },
24796
24797             search: function (bbox) {
24798
24799                 var node = this.data,
24800                     result = [],
24801                     toBBox = this.toBBox;
24802
24803                 if (!intersects$1(bbox, node)) return result;
24804
24805                 var nodesToSearch = [],
24806                     i, len, child, childBBox;
24807
24808                 while (node) {
24809                     for (i = 0, len = node.children.length; i < len; i++) {
24810
24811                         child = node.children[i];
24812                         childBBox = node.leaf ? toBBox(child) : child;
24813
24814                         if (intersects$1(bbox, childBBox)) {
24815                             if (node.leaf) result.push(child);
24816                             else if (contains$4(bbox, childBBox)) this._all(child, result);
24817                             else nodesToSearch.push(child);
24818                         }
24819                     }
24820                     node = nodesToSearch.pop();
24821                 }
24822
24823                 return result;
24824             },
24825
24826             collides: function (bbox) {
24827
24828                 var node = this.data,
24829                     toBBox = this.toBBox;
24830
24831                 if (!intersects$1(bbox, node)) return false;
24832
24833                 var nodesToSearch = [],
24834                     i, len, child, childBBox;
24835
24836                 while (node) {
24837                     for (i = 0, len = node.children.length; i < len; i++) {
24838
24839                         child = node.children[i];
24840                         childBBox = node.leaf ? toBBox(child) : child;
24841
24842                         if (intersects$1(bbox, childBBox)) {
24843                             if (node.leaf || contains$4(bbox, childBBox)) return true;
24844                             nodesToSearch.push(child);
24845                         }
24846                     }
24847                     node = nodesToSearch.pop();
24848                 }
24849
24850                 return false;
24851             },
24852
24853             load: function (data) {
24854                 if (!(data && data.length)) return this;
24855
24856                 if (data.length < this._minEntries) {
24857                     for (var i = 0, len = data.length; i < len; i++) {
24858                         this.insert(data[i]);
24859                     }
24860                     return this;
24861                 }
24862
24863                 // recursively build the tree with the given data from scratch using OMT algorithm
24864                 var node = this._build(data.slice(), 0, data.length - 1, 0);
24865
24866                 if (!this.data.children.length) {
24867                     // save as is if tree is empty
24868                     this.data = node;
24869
24870                 } else if (this.data.height === node.height) {
24871                     // split root if trees have the same height
24872                     this._splitRoot(this.data, node);
24873
24874                 } else {
24875                     if (this.data.height < node.height) {
24876                         // swap trees if inserted one is bigger
24877                         var tmpNode = this.data;
24878                         this.data = node;
24879                         node = tmpNode;
24880                     }
24881
24882                     // insert the small tree into the large tree at appropriate level
24883                     this._insert(node, this.data.height - node.height - 1, true);
24884                 }
24885
24886                 return this;
24887             },
24888
24889             insert: function (item) {
24890                 if (item) this._insert(item, this.data.height - 1);
24891                 return this;
24892             },
24893
24894             clear: function () {
24895                 this.data = createNode([]);
24896                 return this;
24897             },
24898
24899             remove: function (item, equalsFn) {
24900                 if (!item) return this;
24901
24902                 var node = this.data,
24903                     bbox = this.toBBox(item),
24904                     path = [],
24905                     indexes = [],
24906                     i, parent, index, goingUp;
24907
24908                 // depth-first iterative tree traversal
24909                 while (node || path.length) {
24910
24911                     if (!node) { // go up
24912                         node = path.pop();
24913                         parent = path[path.length - 1];
24914                         i = indexes.pop();
24915                         goingUp = true;
24916                     }
24917
24918                     if (node.leaf) { // check current node
24919                         index = findItem(item, node.children, equalsFn);
24920
24921                         if (index !== -1) {
24922                             // item found, remove the item and condense tree upwards
24923                             node.children.splice(index, 1);
24924                             path.push(node);
24925                             this._condense(path);
24926                             return this;
24927                         }
24928                     }
24929
24930                     if (!goingUp && !node.leaf && contains$4(node, bbox)) { // go down
24931                         path.push(node);
24932                         indexes.push(i);
24933                         i = 0;
24934                         parent = node;
24935                         node = node.children[0];
24936
24937                     } else if (parent) { // go right
24938                         i++;
24939                         node = parent.children[i];
24940                         goingUp = false;
24941
24942                     } else node = null; // nothing found
24943                 }
24944
24945                 return this;
24946             },
24947
24948             toBBox: function (item) { return item; },
24949
24950             compareMinX: compareNodeMinX,
24951             compareMinY: compareNodeMinY,
24952
24953             toJSON: function () { return this.data; },
24954
24955             fromJSON: function (data) {
24956                 this.data = data;
24957                 return this;
24958             },
24959
24960             _all: function (node, result) {
24961                 var nodesToSearch = [];
24962                 while (node) {
24963                     if (node.leaf) result.push.apply(result, node.children);
24964                     else nodesToSearch.push.apply(nodesToSearch, node.children);
24965
24966                     node = nodesToSearch.pop();
24967                 }
24968                 return result;
24969             },
24970
24971             _build: function (items, left, right, height) {
24972
24973                 var N = right - left + 1,
24974                     M = this._maxEntries,
24975                     node;
24976
24977                 if (N <= M) {
24978                     // reached leaf level; return leaf
24979                     node = createNode(items.slice(left, right + 1));
24980                     calcBBox(node, this.toBBox);
24981                     return node;
24982                 }
24983
24984                 if (!height) {
24985                     // target height of the bulk-loaded tree
24986                     height = Math.ceil(Math.log(N) / Math.log(M));
24987
24988                     // target number of root entries to maximize storage utilization
24989                     M = Math.ceil(N / Math.pow(M, height - 1));
24990                 }
24991
24992                 node = createNode([]);
24993                 node.leaf = false;
24994                 node.height = height;
24995
24996                 // split the items into M mostly square tiles
24997
24998                 var N2 = Math.ceil(N / M),
24999                     N1 = N2 * Math.ceil(Math.sqrt(M)),
25000                     i, j, right2, right3;
25001
25002                 multiSelect(items, left, right, N1, this.compareMinX);
25003
25004                 for (i = left; i <= right; i += N1) {
25005
25006                     right2 = Math.min(i + N1 - 1, right);
25007
25008                     multiSelect(items, i, right2, N2, this.compareMinY);
25009
25010                     for (j = i; j <= right2; j += N2) {
25011
25012                         right3 = Math.min(j + N2 - 1, right2);
25013
25014                         // pack each entry recursively
25015                         node.children.push(this._build(items, j, right3, height - 1));
25016                     }
25017                 }
25018
25019                 calcBBox(node, this.toBBox);
25020
25021                 return node;
25022             },
25023
25024             _chooseSubtree: function (bbox, node, level, path) {
25025
25026                 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
25027
25028                 while (true) {
25029                     path.push(node);
25030
25031                     if (node.leaf || path.length - 1 === level) break;
25032
25033                     minArea = minEnlargement = Infinity;
25034
25035                     for (i = 0, len = node.children.length; i < len; i++) {
25036                         child = node.children[i];
25037                         area = bboxArea(child);
25038                         enlargement = enlargedArea(bbox, child) - area;
25039
25040                         // choose entry with the least area enlargement
25041                         if (enlargement < minEnlargement) {
25042                             minEnlargement = enlargement;
25043                             minArea = area < minArea ? area : minArea;
25044                             targetNode = child;
25045
25046                         } else if (enlargement === minEnlargement) {
25047                             // otherwise choose one with the smallest area
25048                             if (area < minArea) {
25049                                 minArea = area;
25050                                 targetNode = child;
25051                             }
25052                         }
25053                     }
25054
25055                     node = targetNode || node.children[0];
25056                 }
25057
25058                 return node;
25059             },
25060
25061             _insert: function (item, level, isNode) {
25062
25063                 var toBBox = this.toBBox,
25064                     bbox = isNode ? item : toBBox(item),
25065                     insertPath = [];
25066
25067                 // find the best node for accommodating the item, saving all nodes along the path too
25068                 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
25069
25070                 // put the item into the node
25071                 node.children.push(item);
25072                 extend$1(node, bbox);
25073
25074                 // split on node overflow; propagate upwards if necessary
25075                 while (level >= 0) {
25076                     if (insertPath[level].children.length > this._maxEntries) {
25077                         this._split(insertPath, level);
25078                         level--;
25079                     } else break;
25080                 }
25081
25082                 // adjust bboxes along the insertion path
25083                 this._adjustParentBBoxes(bbox, insertPath, level);
25084             },
25085
25086             // split overflowed node into two
25087             _split: function (insertPath, level) {
25088
25089                 var node = insertPath[level],
25090                     M = node.children.length,
25091                     m = this._minEntries;
25092
25093                 this._chooseSplitAxis(node, m, M);
25094
25095                 var splitIndex = this._chooseSplitIndex(node, m, M);
25096
25097                 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
25098                 newNode.height = node.height;
25099                 newNode.leaf = node.leaf;
25100
25101                 calcBBox(node, this.toBBox);
25102                 calcBBox(newNode, this.toBBox);
25103
25104                 if (level) insertPath[level - 1].children.push(newNode);
25105                 else this._splitRoot(node, newNode);
25106             },
25107
25108             _splitRoot: function (node, newNode) {
25109                 // split root node
25110                 this.data = createNode([node, newNode]);
25111                 this.data.height = node.height + 1;
25112                 this.data.leaf = false;
25113                 calcBBox(this.data, this.toBBox);
25114             },
25115
25116             _chooseSplitIndex: function (node, m, M) {
25117
25118                 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
25119
25120                 minOverlap = minArea = Infinity;
25121
25122                 for (i = m; i <= M - m; i++) {
25123                     bbox1 = distBBox(node, 0, i, this.toBBox);
25124                     bbox2 = distBBox(node, i, M, this.toBBox);
25125
25126                     overlap = intersectionArea(bbox1, bbox2);
25127                     area = bboxArea(bbox1) + bboxArea(bbox2);
25128
25129                     // choose distribution with minimum overlap
25130                     if (overlap < minOverlap) {
25131                         minOverlap = overlap;
25132                         index = i;
25133
25134                         minArea = area < minArea ? area : minArea;
25135
25136                     } else if (overlap === minOverlap) {
25137                         // otherwise choose distribution with minimum area
25138                         if (area < minArea) {
25139                             minArea = area;
25140                             index = i;
25141                         }
25142                     }
25143                 }
25144
25145                 return index;
25146             },
25147
25148             // sorts node children by the best axis for split
25149             _chooseSplitAxis: function (node, m, M) {
25150
25151                 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
25152                     compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
25153                     xMargin = this._allDistMargin(node, m, M, compareMinX),
25154                     yMargin = this._allDistMargin(node, m, M, compareMinY);
25155
25156                 // if total distributions margin value is minimal for x, sort by minX,
25157                 // otherwise it's already sorted by minY
25158                 if (xMargin < yMargin) node.children.sort(compareMinX);
25159             },
25160
25161             // total margin of all possible split distributions where each node is at least m full
25162             _allDistMargin: function (node, m, M, compare) {
25163
25164                 node.children.sort(compare);
25165
25166                 var toBBox = this.toBBox,
25167                     leftBBox = distBBox(node, 0, m, toBBox),
25168                     rightBBox = distBBox(node, M - m, M, toBBox),
25169                     margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
25170                     i, child;
25171
25172                 for (i = m; i < M - m; i++) {
25173                     child = node.children[i];
25174                     extend$1(leftBBox, node.leaf ? toBBox(child) : child);
25175                     margin += bboxMargin(leftBBox);
25176                 }
25177
25178                 for (i = M - m - 1; i >= m; i--) {
25179                     child = node.children[i];
25180                     extend$1(rightBBox, node.leaf ? toBBox(child) : child);
25181                     margin += bboxMargin(rightBBox);
25182                 }
25183
25184                 return margin;
25185             },
25186
25187             _adjustParentBBoxes: function (bbox, path, level) {
25188                 // adjust bboxes along the given tree path
25189                 for (var i = level; i >= 0; i--) {
25190                     extend$1(path[i], bbox);
25191                 }
25192             },
25193
25194             _condense: function (path) {
25195                 // go through the path, removing empty nodes and updating bboxes
25196                 for (var i = path.length - 1, siblings; i >= 0; i--) {
25197                     if (path[i].children.length === 0) {
25198                         if (i > 0) {
25199                             siblings = path[i - 1].children;
25200                             siblings.splice(siblings.indexOf(path[i]), 1);
25201
25202                         } else this.clear();
25203
25204                     } else calcBBox(path[i], this.toBBox);
25205                 }
25206             },
25207
25208             _initFormat: function (format) {
25209                 // data format (minX, minY, maxX, maxY accessors)
25210
25211                 // uses eval-type function compilation instead of just accepting a toBBox function
25212                 // because the algorithms are very sensitive to sorting functions performance,
25213                 // so they should be dead simple and without inner calls
25214
25215                 var compareArr = ['return a', ' - b', ';'];
25216
25217                 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
25218                 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
25219
25220                 this.toBBox = new Function('a',
25221                     'return {minX: a' + format[0] +
25222                     ', minY: a' + format[1] +
25223                     ', maxX: a' + format[2] +
25224                     ', maxY: a' + format[3] + '};');
25225             }
25226         };
25227
25228         function findItem(item, items, equalsFn) {
25229             if (!equalsFn) return items.indexOf(item);
25230
25231             for (var i = 0; i < items.length; i++) {
25232                 if (equalsFn(item, items[i])) return i;
25233             }
25234             return -1;
25235         }
25236
25237         // calculate node's bbox from bboxes of its children
25238         function calcBBox(node, toBBox) {
25239             distBBox(node, 0, node.children.length, toBBox, node);
25240         }
25241
25242         // min bounding rectangle of node children from k to p-1
25243         function distBBox(node, k, p, toBBox, destNode) {
25244             if (!destNode) destNode = createNode(null);
25245             destNode.minX = Infinity;
25246             destNode.minY = Infinity;
25247             destNode.maxX = -Infinity;
25248             destNode.maxY = -Infinity;
25249
25250             for (var i = k, child; i < p; i++) {
25251                 child = node.children[i];
25252                 extend$1(destNode, node.leaf ? toBBox(child) : child);
25253             }
25254
25255             return destNode;
25256         }
25257
25258         function extend$1(a, b) {
25259             a.minX = Math.min(a.minX, b.minX);
25260             a.minY = Math.min(a.minY, b.minY);
25261             a.maxX = Math.max(a.maxX, b.maxX);
25262             a.maxY = Math.max(a.maxY, b.maxY);
25263             return a;
25264         }
25265
25266         function compareNodeMinX(a, b) { return a.minX - b.minX; }
25267         function compareNodeMinY(a, b) { return a.minY - b.minY; }
25268
25269         function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
25270         function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
25271
25272         function enlargedArea(a, b) {
25273             return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
25274                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
25275         }
25276
25277         function intersectionArea(a, b) {
25278             var minX = Math.max(a.minX, b.minX),
25279                 minY = Math.max(a.minY, b.minY),
25280                 maxX = Math.min(a.maxX, b.maxX),
25281                 maxY = Math.min(a.maxY, b.maxY);
25282
25283             return Math.max(0, maxX - minX) *
25284                    Math.max(0, maxY - minY);
25285         }
25286
25287         function contains$4(a, b) {
25288             return a.minX <= b.minX &&
25289                    a.minY <= b.minY &&
25290                    b.maxX <= a.maxX &&
25291                    b.maxY <= a.maxY;
25292         }
25293
25294         function intersects$1(a, b) {
25295             return b.minX <= a.maxX &&
25296                    b.minY <= a.maxY &&
25297                    b.maxX >= a.minX &&
25298                    b.maxY >= a.minY;
25299         }
25300
25301         function createNode(children) {
25302             return {
25303                 children: children,
25304                 height: 1,
25305                 leaf: true,
25306                 minX: Infinity,
25307                 minY: Infinity,
25308                 maxX: -Infinity,
25309                 maxY: -Infinity
25310             };
25311         }
25312
25313         // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
25314         // combines selection algorithm with binary divide & conquer approach
25315
25316         function multiSelect(arr, left, right, n, compare) {
25317             var stack = [left, right],
25318                 mid;
25319
25320             while (stack.length) {
25321                 right = stack.pop();
25322                 left = stack.pop();
25323
25324                 if (right - left <= n) continue;
25325
25326                 mid = left + Math.ceil((right - left) / n / 2) * n;
25327                 quickselect(arr, mid, left, right, compare);
25328
25329                 stack.push(left, mid, mid, right);
25330             }
25331         }
25332         rbush_1.default = default_1;
25333
25334         var lineclip_1 = lineclip;
25335
25336         lineclip.polyline = lineclip;
25337         lineclip.polygon = polygonclip;
25338
25339
25340         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
25341         // handle polylines rather than just segments
25342
25343         function lineclip(points, bbox, result) {
25344
25345             var len = points.length,
25346                 codeA = bitCode(points[0], bbox),
25347                 part = [],
25348                 i, a, b, codeB, lastCode;
25349
25350             if (!result) result = [];
25351
25352             for (i = 1; i < len; i++) {
25353                 a = points[i - 1];
25354                 b = points[i];
25355                 codeB = lastCode = bitCode(b, bbox);
25356
25357                 while (true) {
25358
25359                     if (!(codeA | codeB)) { // accept
25360                         part.push(a);
25361
25362                         if (codeB !== lastCode) { // segment went outside
25363                             part.push(b);
25364
25365                             if (i < len - 1) { // start a new line
25366                                 result.push(part);
25367                                 part = [];
25368                             }
25369                         } else if (i === len - 1) {
25370                             part.push(b);
25371                         }
25372                         break;
25373
25374                     } else if (codeA & codeB) { // trivial reject
25375                         break;
25376
25377                     } else if (codeA) { // a outside, intersect with clip edge
25378                         a = intersect$1(a, b, codeA, bbox);
25379                         codeA = bitCode(a, bbox);
25380
25381                     } else { // b outside
25382                         b = intersect$1(a, b, codeB, bbox);
25383                         codeB = bitCode(b, bbox);
25384                     }
25385                 }
25386
25387                 codeA = lastCode;
25388             }
25389
25390             if (part.length) result.push(part);
25391
25392             return result;
25393         }
25394
25395         // Sutherland-Hodgeman polygon clipping algorithm
25396
25397         function polygonclip(points, bbox) {
25398
25399             var result, edge, prev, prevInside, i, p, inside;
25400
25401             // clip against each side of the clip rectangle
25402             for (edge = 1; edge <= 8; edge *= 2) {
25403                 result = [];
25404                 prev = points[points.length - 1];
25405                 prevInside = !(bitCode(prev, bbox) & edge);
25406
25407                 for (i = 0; i < points.length; i++) {
25408                     p = points[i];
25409                     inside = !(bitCode(p, bbox) & edge);
25410
25411                     // if segment goes through the clip window, add an intersection
25412                     if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
25413
25414                     if (inside) result.push(p); // add a point if it's inside
25415
25416                     prev = p;
25417                     prevInside = inside;
25418                 }
25419
25420                 points = result;
25421
25422                 if (!points.length) break;
25423             }
25424
25425             return result;
25426         }
25427
25428         // intersect a segment against one of the 4 lines that make up the bbox
25429
25430         function intersect$1(a, b, edge, bbox) {
25431             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
25432                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
25433                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
25434                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
25435                    null;
25436         }
25437
25438         // bit code reflects the point position relative to the bbox:
25439
25440         //         left  mid  right
25441         //    top  1001  1000  1010
25442         //    mid  0001  0000  0010
25443         // bottom  0101  0100  0110
25444
25445         function bitCode(p, bbox) {
25446             var code = 0;
25447
25448             if (p[0] < bbox[0]) code |= 1; // left
25449             else if (p[0] > bbox[2]) code |= 2; // right
25450
25451             if (p[1] < bbox[1]) code |= 4; // bottom
25452             else if (p[1] > bbox[3]) code |= 8; // top
25453
25454             return code;
25455         }
25456
25457         var whichPolygon_1 = whichPolygon;
25458
25459         function whichPolygon(data) {
25460             var bboxes = [];
25461             for (var i = 0; i < data.features.length; i++) {
25462                 var feature = data.features[i];
25463                 var coords = feature.geometry.coordinates;
25464
25465                 if (feature.geometry.type === 'Polygon') {
25466                     bboxes.push(treeItem(coords, feature.properties));
25467
25468                 } else if (feature.geometry.type === 'MultiPolygon') {
25469                     for (var j = 0; j < coords.length; j++) {
25470                         bboxes.push(treeItem(coords[j], feature.properties));
25471                     }
25472                 }
25473             }
25474
25475             var tree = rbush_1().load(bboxes);
25476
25477             function query(p, multi) {
25478                 var output = [],
25479                     result = tree.search({
25480                         minX: p[0],
25481                         minY: p[1],
25482                         maxX: p[0],
25483                         maxY: p[1]
25484                     });
25485                 for (var i = 0; i < result.length; i++) {
25486                     if (insidePolygon(result[i].coords, p)) {
25487                         if (multi)
25488                             output.push(result[i].props);
25489                         else
25490                             return result[i].props;
25491                     }
25492                 }
25493                 return multi && output.length ? output : null;
25494             }
25495
25496             query.tree = tree;
25497             query.bbox = function queryBBox(bbox) {
25498                 var output = [];
25499                 var result = tree.search({
25500                     minX: bbox[0],
25501                     minY: bbox[1],
25502                     maxX: bbox[2],
25503                     maxY: bbox[3]
25504                 });
25505                 for (var i = 0; i < result.length; i++) {
25506                     if (polygonIntersectsBBox(result[i].coords, bbox)) {
25507                         output.push(result[i].props);
25508                     }
25509                 }
25510                 return output;
25511             };
25512
25513             return query;
25514         }
25515
25516         function polygonIntersectsBBox(polygon, bbox) {
25517             var bboxCenter = [
25518                 (bbox[0] + bbox[2]) / 2,
25519                 (bbox[1] + bbox[3]) / 2
25520             ];
25521             if (insidePolygon(polygon, bboxCenter)) return true;
25522             for (var i = 0; i < polygon.length; i++) {
25523                 if (lineclip_1(polygon[i], bbox).length > 0) return true;
25524             }
25525             return false;
25526         }
25527
25528         // ray casting algorithm for detecting if point is in polygon
25529         function insidePolygon(rings, p) {
25530             var inside = false;
25531             for (var i = 0, len = rings.length; i < len; i++) {
25532                 var ring = rings[i];
25533                 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
25534                     if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
25535                 }
25536             }
25537             return inside;
25538         }
25539
25540         function rayIntersect(p, p1, p2) {
25541             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]);
25542         }
25543
25544         function treeItem(coords, props) {
25545             var item = {
25546                 minX: Infinity,
25547                 minY: Infinity,
25548                 maxX: -Infinity,
25549                 maxY: -Infinity,
25550                 coords: coords,
25551                 props: props
25552             };
25553
25554             for (var i = 0; i < coords[0].length; i++) {
25555                 var p = coords[0][i];
25556                 item.minX = Math.min(item.minX, p[0]);
25557                 item.minY = Math.min(item.minY, p[1]);
25558                 item.maxX = Math.max(item.maxX, p[0]);
25559                 item.maxY = Math.max(item.maxY, p[1]);
25560             }
25561             return item;
25562         }
25563
25564         // index the osm-community-index
25565         var ociFeatureCollection = Object.values(features$2).map(function(feature) {
25566             // workaround for which-polygon: only supports `properties`, not `id`
25567             // https://github.com/mapbox/which-polygon/pull/6
25568             feature.properties = {
25569                 id: feature.id,
25570                 area: d3_geoArea(feature)   // also precompute areas
25571             };
25572             return feature;
25573         });
25574
25575
25576         var data = {
25577             community: {
25578                 features: features$2,
25579                 resources: resources,
25580                 query: whichPolygon_1({
25581                     type: 'FeatureCollection',
25582                     features: ociFeatureCollection
25583                 })
25584             },
25585             imagery: dataImagery,  //legacy
25586             presets: {
25587                 presets: presets,
25588                 defaults: defaults,
25589                 categories: categories,
25590                 fields: fields
25591             }
25592         };
25593
25594         // http://2ality.com/2015/01/es6-set-operations.html
25595
25596         // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
25597         // This operation is also sometimes called minus (-).
25598         // var a = [1,2,3];
25599         // var b = [4,3,2];
25600         // utilArrayDifference(a, b)
25601         //   [1]
25602         // utilArrayDifference(b, a)
25603         //   [4]
25604         function utilArrayDifference(a, b) {
25605             var other = new Set(b);
25606             return Array.from(new Set(a))
25607                 .filter(function(v) { return !other.has(v); });
25608         }
25609
25610         // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
25611         // var a = [1,2,3];
25612         // var b = [4,3,2];
25613         // utilArrayIntersection(a, b)
25614         //   [2,3]
25615         function utilArrayIntersection(a, b) {
25616             var other = new Set(b);
25617             return Array.from(new Set(a))
25618                 .filter(function(v) { return other.has(v); });
25619         }
25620
25621         // Union (a ∪ b): create a set that contains the elements of both set a and set b.
25622         // var a = [1,2,3];
25623         // var b = [4,3,2];
25624         // utilArrayUnion(a, b)
25625         //   [1,2,3,4]
25626         function utilArrayUnion(a, b) {
25627             var result = new Set(a);
25628             b.forEach(function(v) { result.add(v); });
25629             return Array.from(result);
25630         }
25631
25632         // Returns an Array with all the duplicates removed
25633         // var a = [1,1,2,3,3];
25634         // utilArrayUniq(a)
25635         //   [1,2,3]
25636         function utilArrayUniq(a) {
25637             return Array.from(new Set(a));
25638         }
25639
25640
25641         // Splits array into chunks of given chunk size
25642         // var a = [1,2,3,4,5,6,7];
25643         // utilArrayChunk(a, 3);
25644         //   [[1,2,3],[4,5,6],[7]];
25645         function utilArrayChunk(a, chunkSize) {
25646             if (!chunkSize || chunkSize < 0) return [a.slice()];
25647
25648             var result = new Array(Math.ceil(a.length / chunkSize));
25649             return Array.from(result, function(item, i) {
25650                 return a.slice(i * chunkSize, i * chunkSize + chunkSize);
25651             });
25652         }
25653
25654
25655         // Flattens two level array into a single level
25656         // var a = [[1,2,3],[4,5,6],[7]];
25657         // utilArrayFlatten(a);
25658         //   [1,2,3,4,5,6,7];
25659         function utilArrayFlatten(a) {
25660             return a.reduce(function(acc, val) {
25661                 return acc.concat(val);
25662             }, []);
25663         }
25664
25665
25666         // Groups the items of the Array according to the given key
25667         // `key` can be passed as a property or as a key function
25668         //
25669         // var pets = [
25670         //     { type: 'Dog', name: 'Spot' },
25671         //     { type: 'Cat', name: 'Tiger' },
25672         //     { type: 'Dog', name: 'Rover' },
25673         //     { type: 'Cat', name: 'Leo' }
25674         // ];
25675         //
25676         // utilArrayGroupBy(pets, 'type')
25677         //   {
25678         //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
25679         //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
25680         //   }
25681         //
25682         // utilArrayGroupBy(pets, function(item) { return item.name.length; })
25683         //   {
25684         //     3: [{type: 'Cat', name: 'Leo'}],
25685         //     4: [{type: 'Dog', name: 'Spot'}],
25686         //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
25687         //   }
25688         function utilArrayGroupBy(a, key) {
25689             return a.reduce(function(acc, item) {
25690                 var group = (typeof key === 'function') ? key(item) : item[key];
25691                 (acc[group] = acc[group] || []).push(item);
25692                 return acc;
25693             }, {});
25694         }
25695
25696
25697         // Returns an Array with all the duplicates removed
25698         // where uniqueness determined by the given key
25699         // `key` can be passed as a property or as a key function
25700         //
25701         // var pets = [
25702         //     { type: 'Dog', name: 'Spot' },
25703         //     { type: 'Cat', name: 'Tiger' },
25704         //     { type: 'Dog', name: 'Rover' },
25705         //     { type: 'Cat', name: 'Leo' }
25706         // ];
25707         //
25708         // utilArrayUniqBy(pets, 'type')
25709         //   [
25710         //     { type: 'Dog', name: 'Spot' },
25711         //     { type: 'Cat', name: 'Tiger' }
25712         //   ]
25713         //
25714         // utilArrayUniqBy(pets, function(item) { return item.name.length; })
25715         //   [
25716         //     { type: 'Dog', name: 'Spot' },
25717         //     { type: 'Cat', name: 'Tiger' },
25718         //     { type: 'Cat', name: 'Leo' }
25719         //   }
25720         function utilArrayUniqBy(a, key) {
25721             var seen = new Set();
25722             return a.reduce(function(acc, item) {
25723                 var val = (typeof key === 'function') ? key(item) : item[key];
25724                 if (val && !seen.has(val)) {
25725                     seen.add(val);
25726                     acc.push(item);
25727                 }
25728                 return acc;
25729             }, []);
25730         }
25731
25732         var remove$1 = removeDiacritics;
25733
25734         var replacementList = [
25735           {
25736             base: ' ',
25737             chars: "\u00A0",
25738           }, {
25739             base: '0',
25740             chars: "\u07C0",
25741           }, {
25742             base: 'A',
25743             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",
25744           }, {
25745             base: 'AA',
25746             chars: "\uA732",
25747           }, {
25748             base: 'AE',
25749             chars: "\u00C6\u01FC\u01E2",
25750           }, {
25751             base: 'AO',
25752             chars: "\uA734",
25753           }, {
25754             base: 'AU',
25755             chars: "\uA736",
25756           }, {
25757             base: 'AV',
25758             chars: "\uA738\uA73A",
25759           }, {
25760             base: 'AY',
25761             chars: "\uA73C",
25762           }, {
25763             base: 'B',
25764             chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
25765           }, {
25766             base: 'C',
25767             chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
25768           }, {
25769             base: 'D',
25770             chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
25771           }, {
25772             base: 'Dh',
25773             chars: "\u00D0",
25774           }, {
25775             base: 'DZ',
25776             chars: "\u01F1\u01C4",
25777           }, {
25778             base: 'Dz',
25779             chars: "\u01F2\u01C5",
25780           }, {
25781             base: 'E',
25782             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",
25783           }, {
25784             base: 'F',
25785             chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
25786           }, {
25787             base: 'G',
25788             chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
25789           }, {
25790             base: 'H',
25791             chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
25792           }, {
25793             base: 'I',
25794             chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
25795           }, {
25796             base: 'J',
25797             chars: "\u24BF\uFF2A\u0134\u0248\u0237",
25798           }, {
25799             base: 'K',
25800             chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
25801           }, {
25802             base: 'L',
25803             chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
25804           }, {
25805             base: 'LJ',
25806             chars: "\u01C7",
25807           }, {
25808             base: 'Lj',
25809             chars: "\u01C8",
25810           }, {
25811             base: 'M',
25812             chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
25813           }, {
25814             base: 'N',
25815             chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
25816           }, {
25817             base: 'NJ',
25818             chars: "\u01CA",
25819           }, {
25820             base: 'Nj',
25821             chars: "\u01CB",
25822           }, {
25823             base: 'O',
25824             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",
25825           }, {
25826             base: 'OE',
25827             chars: "\u0152",
25828           }, {
25829             base: 'OI',
25830             chars: "\u01A2",
25831           }, {
25832             base: 'OO',
25833             chars: "\uA74E",
25834           }, {
25835             base: 'OU',
25836             chars: "\u0222",
25837           }, {
25838             base: 'P',
25839             chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
25840           }, {
25841             base: 'Q',
25842             chars: "\u24C6\uFF31\uA756\uA758\u024A",
25843           }, {
25844             base: 'R',
25845             chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
25846           }, {
25847             base: 'S',
25848             chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
25849           }, {
25850             base: 'T',
25851             chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
25852           }, {
25853             base: 'Th',
25854             chars: "\u00DE",
25855           }, {
25856             base: 'TZ',
25857             chars: "\uA728",
25858           }, {
25859             base: 'U',
25860             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",
25861           }, {
25862             base: 'V',
25863             chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
25864           }, {
25865             base: 'VY',
25866             chars: "\uA760",
25867           }, {
25868             base: 'W',
25869             chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
25870           }, {
25871             base: 'X',
25872             chars: "\u24CD\uFF38\u1E8A\u1E8C",
25873           }, {
25874             base: 'Y',
25875             chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
25876           }, {
25877             base: 'Z',
25878             chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
25879           }, {
25880             base: 'a',
25881             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",
25882           }, {
25883             base: 'aa',
25884             chars: "\uA733",
25885           }, {
25886             base: 'ae',
25887             chars: "\u00E6\u01FD\u01E3",
25888           }, {
25889             base: 'ao',
25890             chars: "\uA735",
25891           }, {
25892             base: 'au',
25893             chars: "\uA737",
25894           }, {
25895             base: 'av',
25896             chars: "\uA739\uA73B",
25897           }, {
25898             base: 'ay',
25899             chars: "\uA73D",
25900           }, {
25901             base: 'b',
25902             chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
25903           }, {
25904             base: 'c',
25905             chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
25906           }, {
25907             base: 'd',
25908             chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
25909           }, {
25910             base: 'dh',
25911             chars: "\u00F0",
25912           }, {
25913             base: 'dz',
25914             chars: "\u01F3\u01C6",
25915           }, {
25916             base: 'e',
25917             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",
25918           }, {
25919             base: 'f',
25920             chars: "\u24D5\uFF46\u1E1F\u0192",
25921           }, {
25922             base: 'ff',
25923             chars: "\uFB00",
25924           }, {
25925             base: 'fi',
25926             chars: "\uFB01",
25927           }, {
25928             base: 'fl',
25929             chars: "\uFB02",
25930           }, {
25931             base: 'ffi',
25932             chars: "\uFB03",
25933           }, {
25934             base: 'ffl',
25935             chars: "\uFB04",
25936           }, {
25937             base: 'g',
25938             chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
25939           }, {
25940             base: 'h',
25941             chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
25942           }, {
25943             base: 'hv',
25944             chars: "\u0195",
25945           }, {
25946             base: 'i',
25947             chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
25948           }, {
25949             base: 'j',
25950             chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
25951           }, {
25952             base: 'k',
25953             chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
25954           }, {
25955             base: 'l',
25956             chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
25957           }, {
25958             base: 'lj',
25959             chars: "\u01C9",
25960           }, {
25961             base: 'm',
25962             chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
25963           }, {
25964             base: 'n',
25965             chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
25966           }, {
25967             base: 'nj',
25968             chars: "\u01CC",
25969           }, {
25970             base: 'o',
25971             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",
25972           }, {
25973             base: 'oe',
25974             chars: "\u0153",
25975           }, {
25976             base: 'oi',
25977             chars: "\u01A3",
25978           }, {
25979             base: 'oo',
25980             chars: "\uA74F",
25981           }, {
25982             base: 'ou',
25983             chars: "\u0223",
25984           }, {
25985             base: 'p',
25986             chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
25987           }, {
25988             base: 'q',
25989             chars: "\u24E0\uFF51\u024B\uA757\uA759",
25990           }, {
25991             base: 'r',
25992             chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
25993           }, {
25994             base: 's',
25995             chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
25996           }, {
25997             base: 'ss',
25998             chars: "\xDF",
25999           }, {
26000             base: 't',
26001             chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26002           }, {
26003             base: 'th',
26004             chars: "\u00FE",
26005           }, {
26006             base: 'tz',
26007             chars: "\uA729",
26008           }, {
26009             base: 'u',
26010             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",
26011           }, {
26012             base: 'v',
26013             chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26014           }, {
26015             base: 'vy',
26016             chars: "\uA761",
26017           }, {
26018             base: 'w',
26019             chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26020           }, {
26021             base: 'x',
26022             chars: "\u24E7\uFF58\u1E8B\u1E8D",
26023           }, {
26024             base: 'y',
26025             chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26026           }, {
26027             base: 'z',
26028             chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26029           }
26030         ];
26031
26032         var diacriticsMap = {};
26033         for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
26034           var chars = replacementList[i$1].chars;
26035           for (var j = 0; j < chars.length; j += 1) {
26036             diacriticsMap[chars[j]] = replacementList[i$1].base;
26037           }
26038         }
26039
26040         function removeDiacritics(str) {
26041           return str.replace(/[^\u0000-\u007e]/g, function(c) {
26042             return diacriticsMap[c] || c;
26043           });
26044         }
26045
26046         var replacementList_1 = replacementList;
26047         var diacriticsMap_1 = diacriticsMap;
26048
26049         var diacritics = {
26050                 remove: remove$1,
26051                 replacementList: replacementList_1,
26052                 diacriticsMap: diacriticsMap_1
26053         };
26054
26055         var isArabic_1 = createCommonjsModule(function (module, exports) {
26056         Object.defineProperty(exports, "__esModule", { value: true });
26057         var arabicBlocks = [
26058             [0x0600, 0x06FF],
26059             [0x0750, 0x077F],
26060             [0x08A0, 0x08FF],
26061             [0xFB50, 0xFDFF],
26062             [0xFE70, 0xFEFF],
26063             [0x10E60, 0x10E7F],
26064             [0x1EC70, 0x1ECBF],
26065             [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
26066         ];
26067         function isArabic(char) {
26068             if (char.length > 1) {
26069                 // allow the newer chars?
26070                 throw new Error('isArabic works on only one-character strings');
26071             }
26072             var code = char.charCodeAt(0);
26073             for (var i = 0; i < arabicBlocks.length; i++) {
26074                 var block = arabicBlocks[i];
26075                 if (code >= block[0] && code <= block[1]) {
26076                     return true;
26077                 }
26078             }
26079             return false;
26080         }
26081         exports.isArabic = isArabic;
26082         function isMath(char) {
26083             if (char.length > 2) {
26084                 // allow the newer chars?
26085                 throw new Error('isMath works on only one-character strings');
26086             }
26087             var code = char.charCodeAt(0);
26088             return (code >= 0x660 && code <= 0x66C);
26089         }
26090         exports.isMath = isMath;
26091         });
26092
26093         unwrapExports(isArabic_1);
26094         var isArabic_2 = isArabic_1.isArabic;
26095         var isArabic_3 = isArabic_1.isMath;
26096
26097         var unicodeArabic = createCommonjsModule(function (module, exports) {
26098         Object.defineProperty(exports, "__esModule", { value: true });
26099         var arabicReference = {
26100             "alef": {
26101                 "normal": [
26102                     "\u0627"
26103                 ],
26104                 "madda_above": {
26105                     "normal": [
26106                         "\u0627\u0653",
26107                         "\u0622"
26108                     ],
26109                     "isolated": "\uFE81",
26110                     "final": "\uFE82"
26111                 },
26112                 "hamza_above": {
26113                     "normal": [
26114                         "\u0627\u0654",
26115                         "\u0623"
26116                     ],
26117                     "isolated": "\uFE83",
26118                     "final": "\uFE84"
26119                 },
26120                 "hamza_below": {
26121                     "normal": [
26122                         "\u0627\u0655",
26123                         "\u0625"
26124                     ],
26125                     "isolated": "\uFE87",
26126                     "final": "\uFE88"
26127                 },
26128                 "wasla": {
26129                     "normal": "\u0671",
26130                     "isolated": "\uFB50",
26131                     "final": "\uFB51"
26132                 },
26133                 "wavy_hamza_above": [
26134                     "\u0672"
26135                 ],
26136                 "wavy_hamza_below": [
26137                     "\u0627\u065F",
26138                     "\u0673"
26139                 ],
26140                 "high_hamza": [
26141                     "\u0675",
26142                     "\u0627\u0674"
26143                 ],
26144                 "indic_two_above": [
26145                     "\u0773"
26146                 ],
26147                 "indic_three_above": [
26148                     "\u0774"
26149                 ],
26150                 "fathatan": {
26151                     "normal": [
26152                         "\u0627\u064B"
26153                     ],
26154                     "final": "\uFD3C",
26155                     "isolated": "\uFD3D"
26156                 },
26157                 "isolated": "\uFE8D",
26158                 "final": "\uFE8E"
26159             },
26160             "beh": {
26161                 "normal": [
26162                     "\u0628"
26163                 ],
26164                 "dotless": [
26165                     "\u066E"
26166                 ],
26167                 "three_dots_horizontally_below": [
26168                     "\u0750"
26169                 ],
26170                 "dot_below_three_dots_above": [
26171                     "\u0751"
26172                 ],
26173                 "three_dots_pointing_upwards_below": [
26174                     "\u0752"
26175                 ],
26176                 "three_dots_pointing_upwards_below_two_dots_above": [
26177                     "\u0753"
26178                 ],
26179                 "two_dots_below_dot_above": [
26180                     "\u0754"
26181                 ],
26182                 "inverted_small_v_below": [
26183                     "\u0755"
26184                 ],
26185                 "small_v": [
26186                     "\u0756"
26187                 ],
26188                 "small_v_below": [
26189                     "\u08A0"
26190                 ],
26191                 "hamza_above": [
26192                     "\u08A1"
26193                 ],
26194                 "small_meem_above": [
26195                     "\u08B6"
26196                 ],
26197                 "isolated": "\uFE8F",
26198                 "final": "\uFE90",
26199                 "initial": "\uFE91",
26200                 "medial": "\uFE92"
26201             },
26202             "teh marbuta": {
26203                 "normal": [
26204                     "\u0629"
26205                 ],
26206                 "isolated": "\uFE93",
26207                 "final": "\uFE94"
26208             },
26209             "teh": {
26210                 "normal": [
26211                     "\u062A"
26212                 ],
26213                 "ring": [
26214                     "\u067C"
26215                 ],
26216                 "three_dots_above_downwards": [
26217                     "\u067D"
26218                 ],
26219                 "small_teh_above": [
26220                     "\u08B8"
26221                 ],
26222                 "isolated": "\uFE95",
26223                 "final": "\uFE96",
26224                 "initial": "\uFE97",
26225                 "medial": "\uFE98"
26226             },
26227             "theh": {
26228                 "normal": [
26229                     "\u062B"
26230                 ],
26231                 "isolated": "\uFE99",
26232                 "final": "\uFE9A",
26233                 "initial": "\uFE9B",
26234                 "medial": "\uFE9C"
26235             },
26236             "jeem": {
26237                 "normal": [
26238                     "\u062C"
26239                 ],
26240                 "two_dots_above": [
26241                     "\u08A2"
26242                 ],
26243                 "isolated": "\uFE9D",
26244                 "final": "\uFE9E",
26245                 "initial": "\uFE9F",
26246                 "medial": "\uFEA0"
26247             },
26248             "hah": {
26249                 "normal": [
26250                     "\u062D"
26251                 ],
26252                 "hamza_above": [
26253                     "\u0681"
26254                 ],
26255                 "two_dots_vertical_above": [
26256                     "\u0682"
26257                 ],
26258                 "three_dots_above": [
26259                     "\u0685"
26260                 ],
26261                 "two_dots_above": [
26262                     "\u0757"
26263                 ],
26264                 "three_dots_pointing_upwards_below": [
26265                     "\u0758"
26266                 ],
26267                 "small_tah_below": [
26268                     "\u076E"
26269                 ],
26270                 "small_tah_two_dots": [
26271                     "\u076F"
26272                 ],
26273                 "small_tah_above": [
26274                     "\u0772"
26275                 ],
26276                 "indic_four_below": [
26277                     "\u077C"
26278                 ],
26279                 "isolated": "\uFEA1",
26280                 "final": "\uFEA2",
26281                 "initial": "\uFEA3",
26282                 "medial": "\uFEA4"
26283             },
26284             "khah": {
26285                 "normal": [
26286                     "\u062E"
26287                 ],
26288                 "isolated": "\uFEA5",
26289                 "final": "\uFEA6",
26290                 "initial": "\uFEA7",
26291                 "medial": "\uFEA8"
26292             },
26293             "dal": {
26294                 "normal": [
26295                     "\u062F"
26296                 ],
26297                 "ring": [
26298                     "\u0689"
26299                 ],
26300                 "dot_below": [
26301                     "\u068A"
26302                 ],
26303                 "dot_below_small_tah": [
26304                     "\u068B"
26305                 ],
26306                 "three_dots_above_downwards": [
26307                     "\u068F"
26308                 ],
26309                 "four_dots_above": [
26310                     "\u0690"
26311                 ],
26312                 "inverted_v": [
26313                     "\u06EE"
26314                 ],
26315                 "two_dots_vertically_below_small_tah": [
26316                     "\u0759"
26317                 ],
26318                 "inverted_small_v_below": [
26319                     "\u075A"
26320                 ],
26321                 "three_dots_below": [
26322                     "\u08AE"
26323                 ],
26324                 "isolated": "\uFEA9",
26325                 "final": "\uFEAA"
26326             },
26327             "thal": {
26328                 "normal": [
26329                     "\u0630"
26330                 ],
26331                 "isolated": "\uFEAB",
26332                 "final": "\uFEAC"
26333             },
26334             "reh": {
26335                 "normal": [
26336                     "\u0631"
26337                 ],
26338                 "small_v": [
26339                     "\u0692"
26340                 ],
26341                 "ring": [
26342                     "\u0693"
26343                 ],
26344                 "dot_below": [
26345                     "\u0694"
26346                 ],
26347                 "small_v_below": [
26348                     "\u0695"
26349                 ],
26350                 "dot_below_dot_above": [
26351                     "\u0696"
26352                 ],
26353                 "two_dots_above": [
26354                     "\u0697"
26355                 ],
26356                 "four_dots_above": [
26357                     "\u0699"
26358                 ],
26359                 "inverted_v": [
26360                     "\u06EF"
26361                 ],
26362                 "stroke": [
26363                     "\u075B"
26364                 ],
26365                 "two_dots_vertically_above": [
26366                     "\u076B"
26367                 ],
26368                 "hamza_above": [
26369                     "\u076C"
26370                 ],
26371                 "small_tah_two_dots": [
26372                     "\u0771"
26373                 ],
26374                 "loop": [
26375                     "\u08AA"
26376                 ],
26377                 "small_noon_above": [
26378                     "\u08B9"
26379                 ],
26380                 "isolated": "\uFEAD",
26381                 "final": "\uFEAE"
26382             },
26383             "zain": {
26384                 "normal": [
26385                     "\u0632"
26386                 ],
26387                 "inverted_v_above": [
26388                     "\u08B2"
26389                 ],
26390                 "isolated": "\uFEAF",
26391                 "final": "\uFEB0"
26392             },
26393             "seen": {
26394                 "normal": [
26395                     "\u0633"
26396                 ],
26397                 "dot_below_dot_above": [
26398                     "\u069A"
26399                 ],
26400                 "three_dots_below": [
26401                     "\u069B"
26402                 ],
26403                 "three_dots_below_three_dots_above": [
26404                     "\u069C"
26405                 ],
26406                 "four_dots_above": [
26407                     "\u075C"
26408                 ],
26409                 "two_dots_vertically_above": [
26410                     "\u076D"
26411                 ],
26412                 "small_tah_two_dots": [
26413                     "\u0770"
26414                 ],
26415                 "indic_four_above": [
26416                     "\u077D"
26417                 ],
26418                 "inverted_v": [
26419                     "\u077E"
26420                 ],
26421                 "isolated": "\uFEB1",
26422                 "final": "\uFEB2",
26423                 "initial": "\uFEB3",
26424                 "medial": "\uFEB4"
26425             },
26426             "sheen": {
26427                 "normal": [
26428                     "\u0634"
26429                 ],
26430                 "dot_below": [
26431                     "\u06FA"
26432                 ],
26433                 "isolated": "\uFEB5",
26434                 "final": "\uFEB6",
26435                 "initial": "\uFEB7",
26436                 "medial": "\uFEB8"
26437             },
26438             "sad": {
26439                 "normal": [
26440                     "\u0635"
26441                 ],
26442                 "two_dots_below": [
26443                     "\u069D"
26444                 ],
26445                 "three_dots_above": [
26446                     "\u069E"
26447                 ],
26448                 "three_dots_below": [
26449                     "\u08AF"
26450                 ],
26451                 "isolated": "\uFEB9",
26452                 "final": "\uFEBA",
26453                 "initial": "\uFEBB",
26454                 "medial": "\uFEBC"
26455             },
26456             "dad": {
26457                 "normal": [
26458                     "\u0636"
26459                 ],
26460                 "dot_below": [
26461                     "\u06FB"
26462                 ],
26463                 "isolated": "\uFEBD",
26464                 "final": "\uFEBE",
26465                 "initial": "\uFEBF",
26466                 "medial": "\uFEC0"
26467             },
26468             "tah": {
26469                 "normal": [
26470                     "\u0637"
26471                 ],
26472                 "three_dots_above": [
26473                     "\u069F"
26474                 ],
26475                 "two_dots_above": [
26476                     "\u08A3"
26477                 ],
26478                 "isolated": "\uFEC1",
26479                 "final": "\uFEC2",
26480                 "initial": "\uFEC3",
26481                 "medial": "\uFEC4"
26482             },
26483             "zah": {
26484                 "normal": [
26485                     "\u0638"
26486                 ],
26487                 "isolated": "\uFEC5",
26488                 "final": "\uFEC6",
26489                 "initial": "\uFEC7",
26490                 "medial": "\uFEC8"
26491             },
26492             "ain": {
26493                 "normal": [
26494                     "\u0639"
26495                 ],
26496                 "three_dots_above": [
26497                     "\u06A0"
26498                 ],
26499                 "two_dots_above": [
26500                     "\u075D"
26501                 ],
26502                 "three_dots_pointing_downwards_above": [
26503                     "\u075E"
26504                 ],
26505                 "two_dots_vertically_above": [
26506                     "\u075F"
26507                 ],
26508                 "three_dots_below": [
26509                     "\u08B3"
26510                 ],
26511                 "isolated": "\uFEC9",
26512                 "final": "\uFECA",
26513                 "initial": "\uFECB",
26514                 "medial": "\uFECC"
26515             },
26516             "ghain": {
26517                 "normal": [
26518                     "\u063A"
26519                 ],
26520                 "dot_below": [
26521                     "\u06FC"
26522                 ],
26523                 "isolated": "\uFECD",
26524                 "final": "\uFECE",
26525                 "initial": "\uFECF",
26526                 "medial": "\uFED0"
26527             },
26528             "feh": {
26529                 "normal": [
26530                     "\u0641"
26531                 ],
26532                 "dotless": [
26533                     "\u06A1"
26534                 ],
26535                 "dot_moved_below": [
26536                     "\u06A2"
26537                 ],
26538                 "dot_below": [
26539                     "\u06A3"
26540                 ],
26541                 "three_dots_below": [
26542                     "\u06A5"
26543                 ],
26544                 "two_dots_below": [
26545                     "\u0760"
26546                 ],
26547                 "three_dots_pointing_upwards_below": [
26548                     "\u0761"
26549                 ],
26550                 "dot_below_three_dots_above": [
26551                     "\u08A4"
26552                 ],
26553                 "isolated": "\uFED1",
26554                 "final": "\uFED2",
26555                 "initial": "\uFED3",
26556                 "medial": "\uFED4"
26557             },
26558             "qaf": {
26559                 "normal": [
26560                     "\u0642"
26561                 ],
26562                 "dotless": [
26563                     "\u066F"
26564                 ],
26565                 "dot_above": [
26566                     "\u06A7"
26567                 ],
26568                 "three_dots_above": [
26569                     "\u06A8"
26570                 ],
26571                 "dot_below": [
26572                     "\u08A5"
26573                 ],
26574                 "isolated": "\uFED5",
26575                 "final": "\uFED6",
26576                 "initial": "\uFED7",
26577                 "medial": "\uFED8"
26578             },
26579             "kaf": {
26580                 "normal": [
26581                     "\u0643"
26582                 ],
26583                 "swash": [
26584                     "\u06AA"
26585                 ],
26586                 "ring": [
26587                     "\u06AB"
26588                 ],
26589                 "dot_above": [
26590                     "\u06AC"
26591                 ],
26592                 "three_dots_below": [
26593                     "\u06AE"
26594                 ],
26595                 "two_dots_above": [
26596                     "\u077F"
26597                 ],
26598                 "dot_below": [
26599                     "\u08B4"
26600                 ],
26601                 "isolated": "\uFED9",
26602                 "final": "\uFEDA",
26603                 "initial": "\uFEDB",
26604                 "medial": "\uFEDC"
26605             },
26606             "lam": {
26607                 "normal": [
26608                     "\u0644"
26609                 ],
26610                 "small_v": [
26611                     "\u06B5"
26612                 ],
26613                 "dot_above": [
26614                     "\u06B6"
26615                 ],
26616                 "three_dots_above": [
26617                     "\u06B7"
26618                 ],
26619                 "three_dots_below": [
26620                     "\u06B8"
26621                 ],
26622                 "bar": [
26623                     "\u076A"
26624                 ],
26625                 "double_bar": [
26626                     "\u08A6"
26627                 ],
26628                 "isolated": "\uFEDD",
26629                 "final": "\uFEDE",
26630                 "initial": "\uFEDF",
26631                 "medial": "\uFEE0"
26632             },
26633             "meem": {
26634                 "normal": [
26635                     "\u0645"
26636                 ],
26637                 "dot_above": [
26638                     "\u0765"
26639                 ],
26640                 "dot_below": [
26641                     "\u0766"
26642                 ],
26643                 "three_dots_above": [
26644                     "\u08A7"
26645                 ],
26646                 "isolated": "\uFEE1",
26647                 "final": "\uFEE2",
26648                 "initial": "\uFEE3",
26649                 "medial": "\uFEE4"
26650             },
26651             "noon": {
26652                 "normal": [
26653                     "\u0646"
26654                 ],
26655                 "dot_below": [
26656                     "\u06B9"
26657                 ],
26658                 "ring": [
26659                     "\u06BC"
26660                 ],
26661                 "three_dots_above": [
26662                     "\u06BD"
26663                 ],
26664                 "two_dots_below": [
26665                     "\u0767"
26666                 ],
26667                 "small_tah": [
26668                     "\u0768"
26669                 ],
26670                 "small_v": [
26671                     "\u0769"
26672                 ],
26673                 "isolated": "\uFEE5",
26674                 "final": "\uFEE6",
26675                 "initial": "\uFEE7",
26676                 "medial": "\uFEE8"
26677             },
26678             "heh": {
26679                 "normal": [
26680                     "\u0647"
26681                 ],
26682                 "isolated": "\uFEE9",
26683                 "final": "\uFEEA",
26684                 "initial": "\uFEEB",
26685                 "medial": "\uFEEC"
26686             },
26687             "waw": {
26688                 "normal": [
26689                     "\u0648"
26690                 ],
26691                 "hamza_above": {
26692                     "normal": [
26693                         "\u0624",
26694                         "\u0648\u0654"
26695                     ],
26696                     "isolated": "\uFE85",
26697                     "final": "\uFE86"
26698                 },
26699                 "high_hamza": [
26700                     "\u0676",
26701                     "\u0648\u0674"
26702                 ],
26703                 "ring": [
26704                     "\u06C4"
26705                 ],
26706                 "two_dots_above": [
26707                     "\u06CA"
26708                 ],
26709                 "dot_above": [
26710                     "\u06CF"
26711                 ],
26712                 "indic_two_above": [
26713                     "\u0778"
26714                 ],
26715                 "indic_three_above": [
26716                     "\u0779"
26717                 ],
26718                 "dot_within": [
26719                     "\u08AB"
26720                 ],
26721                 "isolated": "\uFEED",
26722                 "final": "\uFEEE"
26723             },
26724             "alef_maksura": {
26725                 "normal": [
26726                     "\u0649"
26727                 ],
26728                 "hamza_above": [
26729                     "\u0626",
26730                     "\u064A\u0654"
26731                 ],
26732                 "initial": "\uFBE8",
26733                 "medial": "\uFBE9",
26734                 "isolated": "\uFEEF",
26735                 "final": "\uFEF0"
26736             },
26737             "yeh": {
26738                 "normal": [
26739                     "\u064A"
26740                 ],
26741                 "hamza_above": {
26742                     "normal": [
26743                         "\u0626",
26744                         "\u0649\u0654"
26745                     ],
26746                     "isolated": "\uFE89",
26747                     "final": "\uFE8A",
26748                     "initial": "\uFE8B",
26749                     "medial": "\uFE8C"
26750                 },
26751                 "two_dots_below_hamza_above": [
26752                     "\u08A8"
26753                 ],
26754                 "high_hamza": [
26755                     "\u0678",
26756                     "\u064A\u0674"
26757                 ],
26758                 "tail": [
26759                     "\u06CD"
26760                 ],
26761                 "small_v": [
26762                     "\u06CE"
26763                 ],
26764                 "three_dots_below": [
26765                     "\u06D1"
26766                 ],
26767                 "two_dots_below_dot_above": [
26768                     "\u08A9"
26769                 ],
26770                 "two_dots_below_small_noon_above": [
26771                     "\u08BA"
26772                 ],
26773                 "isolated": "\uFEF1",
26774                 "final": "\uFEF2",
26775                 "initial": "\uFEF3",
26776                 "medial": "\uFEF4"
26777             },
26778             "tteh": {
26779                 "normal": [
26780                     "\u0679"
26781                 ],
26782                 "isolated": "\uFB66",
26783                 "final": "\uFB67",
26784                 "initial": "\uFB68",
26785                 "medial": "\uFB69"
26786             },
26787             "tteheh": {
26788                 "normal": [
26789                     "\u067A"
26790                 ],
26791                 "isolated": "\uFB5E",
26792                 "final": "\uFB5F",
26793                 "initial": "\uFB60",
26794                 "medial": "\uFB61"
26795             },
26796             "beeh": {
26797                 "normal": [
26798                     "\u067B"
26799                 ],
26800                 "isolated": "\uFB52",
26801                 "final": "\uFB53",
26802                 "initial": "\uFB54",
26803                 "medial": "\uFB55"
26804             },
26805             "peh": {
26806                 "normal": [
26807                     "\u067E"
26808                 ],
26809                 "small_meem_above": [
26810                     "\u08B7"
26811                 ],
26812                 "isolated": "\uFB56",
26813                 "final": "\uFB57",
26814                 "initial": "\uFB58",
26815                 "medial": "\uFB59"
26816             },
26817             "teheh": {
26818                 "normal": [
26819                     "\u067F"
26820                 ],
26821                 "isolated": "\uFB62",
26822                 "final": "\uFB63",
26823                 "initial": "\uFB64",
26824                 "medial": "\uFB65"
26825             },
26826             "beheh": {
26827                 "normal": [
26828                     "\u0680"
26829                 ],
26830                 "isolated": "\uFB5A",
26831                 "final": "\uFB5B",
26832                 "initial": "\uFB5C",
26833                 "medial": "\uFB5D"
26834             },
26835             "nyeh": {
26836                 "normal": [
26837                     "\u0683"
26838                 ],
26839                 "isolated": "\uFB76",
26840                 "final": "\uFB77",
26841                 "initial": "\uFB78",
26842                 "medial": "\uFB79"
26843             },
26844             "dyeh": {
26845                 "normal": [
26846                     "\u0684"
26847                 ],
26848                 "isolated": "\uFB72",
26849                 "final": "\uFB73",
26850                 "initial": "\uFB74",
26851                 "medial": "\uFB75"
26852             },
26853             "tcheh": {
26854                 "normal": [
26855                     "\u0686"
26856                 ],
26857                 "dot_above": [
26858                     "\u06BF"
26859                 ],
26860                 "isolated": "\uFB7A",
26861                 "final": "\uFB7B",
26862                 "initial": "\uFB7C",
26863                 "medial": "\uFB7D"
26864             },
26865             "tcheheh": {
26866                 "normal": [
26867                     "\u0687"
26868                 ],
26869                 "isolated": "\uFB7E",
26870                 "final": "\uFB7F",
26871                 "initial": "\uFB80",
26872                 "medial": "\uFB81"
26873             },
26874             "ddal": {
26875                 "normal": [
26876                     "\u0688"
26877                 ],
26878                 "isolated": "\uFB88",
26879                 "final": "\uFB89"
26880             },
26881             "dahal": {
26882                 "normal": [
26883                     "\u068C"
26884                 ],
26885                 "isolated": "\uFB84",
26886                 "final": "\uFB85"
26887             },
26888             "ddahal": {
26889                 "normal": [
26890                     "\u068D"
26891                 ],
26892                 "isolated": "\uFB82",
26893                 "final": "\uFB83"
26894             },
26895             "dul": {
26896                 "normal": [
26897                     "\u068F",
26898                     "\u068E"
26899                 ],
26900                 "isolated": "\uFB86",
26901                 "final": "\uFB87"
26902             },
26903             "rreh": {
26904                 "normal": [
26905                     "\u0691"
26906                 ],
26907                 "isolated": "\uFB8C",
26908                 "final": "\uFB8D"
26909             },
26910             "jeh": {
26911                 "normal": [
26912                     "\u0698"
26913                 ],
26914                 "isolated": "\uFB8A",
26915                 "final": "\uFB8B"
26916             },
26917             "veh": {
26918                 "normal": [
26919                     "\u06A4"
26920                 ],
26921                 "isolated": "\uFB6A",
26922                 "final": "\uFB6B",
26923                 "initial": "\uFB6C",
26924                 "medial": "\uFB6D"
26925             },
26926             "peheh": {
26927                 "normal": [
26928                     "\u06A6"
26929                 ],
26930                 "isolated": "\uFB6E",
26931                 "final": "\uFB6F",
26932                 "initial": "\uFB70",
26933                 "medial": "\uFB71"
26934             },
26935             "keheh": {
26936                 "normal": [
26937                     "\u06A9"
26938                 ],
26939                 "dot_above": [
26940                     "\u0762"
26941                 ],
26942                 "three_dots_above": [
26943                     "\u0763"
26944                 ],
26945                 "three_dots_pointing_upwards_below": [
26946                     "\u0764"
26947                 ],
26948                 "isolated": "\uFB8E",
26949                 "final": "\uFB8F",
26950                 "initial": "\uFB90",
26951                 "medial": "\uFB91"
26952             },
26953             "ng": {
26954                 "normal": [
26955                     "\u06AD"
26956                 ],
26957                 "isolated": "\uFBD3",
26958                 "final": "\uFBD4",
26959                 "initial": "\uFBD5",
26960                 "medial": "\uFBD6"
26961             },
26962             "gaf": {
26963                 "normal": [
26964                     "\u06AF"
26965                 ],
26966                 "ring": [
26967                     "\u06B0"
26968                 ],
26969                 "two_dots_below": [
26970                     "\u06B2"
26971                 ],
26972                 "three_dots_above": [
26973                     "\u06B4"
26974                 ],
26975                 "inverted_stroke": [
26976                     "\u08B0"
26977                 ],
26978                 "isolated": "\uFB92",
26979                 "final": "\uFB93",
26980                 "initial": "\uFB94",
26981                 "medial": "\uFB95"
26982             },
26983             "ngoeh": {
26984                 "normal": [
26985                     "\u06B1"
26986                 ],
26987                 "isolated": "\uFB9A",
26988                 "final": "\uFB9B",
26989                 "initial": "\uFB9C",
26990                 "medial": "\uFB9D"
26991             },
26992             "gueh": {
26993                 "normal": [
26994                     "\u06B3"
26995                 ],
26996                 "isolated": "\uFB96",
26997                 "final": "\uFB97",
26998                 "initial": "\uFB98",
26999                 "medial": "\uFB99"
27000             },
27001             "noon ghunna": {
27002                 "normal": [
27003                     "\u06BA"
27004                 ],
27005                 "isolated": "\uFB9E",
27006                 "final": "\uFB9F"
27007             },
27008             "rnoon": {
27009                 "normal": [
27010                     "\u06BB"
27011                 ],
27012                 "isolated": "\uFBA0",
27013                 "final": "\uFBA1",
27014                 "initial": "\uFBA2",
27015                 "medial": "\uFBA3"
27016             },
27017             "heh doachashmee": {
27018                 "normal": [
27019                     "\u06BE"
27020                 ],
27021                 "isolated": "\uFBAA",
27022                 "final": "\uFBAB",
27023                 "initial": "\uFBAC",
27024                 "medial": "\uFBAD"
27025             },
27026             "heh goal": {
27027                 "normal": [
27028                     "\u06C1"
27029                 ],
27030                 "hamza_above": [
27031                     "\u06C1\u0654",
27032                     "\u06C2"
27033                 ],
27034                 "isolated": "\uFBA6",
27035                 "final": "\uFBA7",
27036                 "initial": "\uFBA8",
27037                 "medial": "\uFBA9"
27038             },
27039             "teh marbuta goal": {
27040                 "normal": [
27041                     "\u06C3"
27042                 ]
27043             },
27044             "kirghiz oe": {
27045                 "normal": [
27046                     "\u06C5"
27047                 ],
27048                 "isolated": "\uFBE0",
27049                 "final": "\uFBE1"
27050             },
27051             "oe": {
27052                 "normal": [
27053                     "\u06C6"
27054                 ],
27055                 "isolated": "\uFBD9",
27056                 "final": "\uFBDA"
27057             },
27058             "u": {
27059                 "normal": [
27060                     "\u06C7"
27061                 ],
27062                 "hamza_above": {
27063                     "normal": [
27064                         "\u0677",
27065                         "\u06C7\u0674"
27066                     ],
27067                     "isolated": "\uFBDD"
27068                 },
27069                 "isolated": "\uFBD7",
27070                 "final": "\uFBD8"
27071             },
27072             "yu": {
27073                 "normal": [
27074                     "\u06C8"
27075                 ],
27076                 "isolated": "\uFBDB",
27077                 "final": "\uFBDC"
27078             },
27079             "kirghiz yu": {
27080                 "normal": [
27081                     "\u06C9"
27082                 ],
27083                 "isolated": "\uFBE2",
27084                 "final": "\uFBE3"
27085             },
27086             "ve": {
27087                 "normal": [
27088                     "\u06CB"
27089                 ],
27090                 "isolated": "\uFBDE",
27091                 "final": "\uFBDF"
27092             },
27093             "farsi yeh": {
27094                 "normal": [
27095                     "\u06CC"
27096                 ],
27097                 "indic_two_above": [
27098                     "\u0775"
27099                 ],
27100                 "indic_three_above": [
27101                     "\u0776"
27102                 ],
27103                 "indic_four_above": [
27104                     "\u0777"
27105                 ],
27106                 "isolated": "\uFBFC",
27107                 "final": "\uFBFD",
27108                 "initial": "\uFBFE",
27109                 "medial": "\uFBFF"
27110             },
27111             "e": {
27112                 "normal": [
27113                     "\u06D0"
27114                 ],
27115                 "isolated": "\uFBE4",
27116                 "final": "\uFBE5",
27117                 "initial": "\uFBE6",
27118                 "medial": "\uFBE7"
27119             },
27120             "yeh barree": {
27121                 "normal": [
27122                     "\u06D2"
27123                 ],
27124                 "hamza_above": {
27125                     "normal": [
27126                         "\u06D2\u0654",
27127                         "\u06D3"
27128                     ],
27129                     "isolated": "\uFBB0",
27130                     "final": "\uFBB1"
27131                 },
27132                 "indic_two_above": [
27133                     "\u077A"
27134                 ],
27135                 "indic_three_above": [
27136                     "\u077B"
27137                 ],
27138                 "isolated": "\uFBAE",
27139                 "final": "\uFBAF"
27140             },
27141             "ae": {
27142                 "normal": [
27143                     "\u06D5"
27144                 ],
27145                 "isolated": "\u06D5",
27146                 "final": "\uFEEA",
27147                 "yeh_above": {
27148                     "normal": [
27149                         "\u06C0",
27150                         "\u06D5\u0654"
27151                     ],
27152                     "isolated": "\uFBA4",
27153                     "final": "\uFBA5"
27154                 }
27155             },
27156             "rohingya yeh": {
27157                 "normal": [
27158                     "\u08AC"
27159                 ]
27160             },
27161             "low alef": {
27162                 "normal": [
27163                     "\u08AD"
27164                 ]
27165             },
27166             "straight waw": {
27167                 "normal": [
27168                     "\u08B1"
27169                 ]
27170             },
27171             "african feh": {
27172                 "normal": [
27173                     "\u08BB"
27174                 ]
27175             },
27176             "african qaf": {
27177                 "normal": [
27178                     "\u08BC"
27179                 ]
27180             },
27181             "african noon": {
27182                 "normal": [
27183                     "\u08BD"
27184                 ]
27185             }
27186         };
27187         exports.default = arabicReference;
27188         });
27189
27190         unwrapExports(unicodeArabic);
27191
27192         var unicodeLigatures = createCommonjsModule(function (module, exports) {
27193         Object.defineProperty(exports, "__esModule", { value: true });
27194         var ligatureReference = {
27195             "\u0626\u0627": {
27196                 "isolated": "\uFBEA",
27197                 "final": "\uFBEB"
27198             },
27199             "\u0626\u06D5": {
27200                 "isolated": "\uFBEC",
27201                 "final": "\uFBED"
27202             },
27203             "\u0626\u0648": {
27204                 "isolated": "\uFBEE",
27205                 "final": "\uFBEF"
27206             },
27207             "\u0626\u06C7": {
27208                 "isolated": "\uFBF0",
27209                 "final": "\uFBF1"
27210             },
27211             "\u0626\u06C6": {
27212                 "isolated": "\uFBF2",
27213                 "final": "\uFBF3"
27214             },
27215             "\u0626\u06C8": {
27216                 "isolated": "\uFBF4",
27217                 "final": "\uFBF5"
27218             },
27219             "\u0626\u06D0": {
27220                 "isolated": "\uFBF6",
27221                 "final": "\uFBF7",
27222                 "initial": "\uFBF8"
27223             },
27224             "\u0626\u0649": {
27225                 "uighur_kirghiz": {
27226                     "isolated": "\uFBF9",
27227                     "final": "\uFBFA",
27228                     "initial": "\uFBFB"
27229                 },
27230                 "isolated": "\uFC03",
27231                 "final": "\uFC68"
27232             },
27233             "\u0626\u062C": {
27234                 "isolated": "\uFC00",
27235                 "initial": "\uFC97"
27236             },
27237             "\u0626\u062D": {
27238                 "isolated": "\uFC01",
27239                 "initial": "\uFC98"
27240             },
27241             "\u0626\u0645": {
27242                 "isolated": "\uFC02",
27243                 "final": "\uFC66",
27244                 "initial": "\uFC9A",
27245                 "medial": "\uFCDF"
27246             },
27247             "\u0626\u064A": {
27248                 "isolated": "\uFC04",
27249                 "final": "\uFC69"
27250             },
27251             "\u0628\u062C": {
27252                 "isolated": "\uFC05",
27253                 "initial": "\uFC9C"
27254             },
27255             "\u0628\u062D": {
27256                 "isolated": "\uFC06",
27257                 "initial": "\uFC9D"
27258             },
27259             "\u0628\u062E": {
27260                 "isolated": "\uFC07",
27261                 "initial": "\uFC9E"
27262             },
27263             "\u0628\u0645": {
27264                 "isolated": "\uFC08",
27265                 "final": "\uFC6C",
27266                 "initial": "\uFC9F",
27267                 "medial": "\uFCE1"
27268             },
27269             "\u0628\u0649": {
27270                 "isolated": "\uFC09",
27271                 "final": "\uFC6E"
27272             },
27273             "\u0628\u064A": {
27274                 "isolated": "\uFC0A",
27275                 "final": "\uFC6F"
27276             },
27277             "\u062A\u062C": {
27278                 "isolated": "\uFC0B",
27279                 "initial": "\uFCA1"
27280             },
27281             "\u062A\u062D": {
27282                 "isolated": "\uFC0C",
27283                 "initial": "\uFCA2"
27284             },
27285             "\u062A\u062E": {
27286                 "isolated": "\uFC0D",
27287                 "initial": "\uFCA3"
27288             },
27289             "\u062A\u0645": {
27290                 "isolated": "\uFC0E",
27291                 "final": "\uFC72",
27292                 "initial": "\uFCA4",
27293                 "medial": "\uFCE3"
27294             },
27295             "\u062A\u0649": {
27296                 "isolated": "\uFC0F",
27297                 "final": "\uFC74"
27298             },
27299             "\u062A\u064A": {
27300                 "isolated": "\uFC10",
27301                 "final": "\uFC75"
27302             },
27303             "\u062B\u062C": {
27304                 "isolated": "\uFC11"
27305             },
27306             "\u062B\u0645": {
27307                 "isolated": "\uFC12",
27308                 "final": "\uFC78",
27309                 "initial": "\uFCA6",
27310                 "medial": "\uFCE5"
27311             },
27312             "\u062B\u0649": {
27313                 "isolated": "\uFC13",
27314                 "final": "\uFC7A"
27315             },
27316             "\u062B\u0648": {
27317                 "isolated": "\uFC14"
27318             },
27319             "\u062C\u062D": {
27320                 "isolated": "\uFC15",
27321                 "initial": "\uFCA7"
27322             },
27323             "\u062C\u0645": {
27324                 "isolated": "\uFC16",
27325                 "initial": "\uFCA8"
27326             },
27327             "\u062D\u062C": {
27328                 "isolated": "\uFC17",
27329                 "initial": "\uFCA9"
27330             },
27331             "\u062D\u0645": {
27332                 "isolated": "\uFC18",
27333                 "initial": "\uFCAA"
27334             },
27335             "\u062E\u062C": {
27336                 "isolated": "\uFC19",
27337                 "initial": "\uFCAB"
27338             },
27339             "\u062E\u062D": {
27340                 "isolated": "\uFC1A"
27341             },
27342             "\u062E\u0645": {
27343                 "isolated": "\uFC1B",
27344                 "initial": "\uFCAC"
27345             },
27346             "\u0633\u062C": {
27347                 "isolated": "\uFC1C",
27348                 "initial": "\uFCAD",
27349                 "medial": "\uFD34"
27350             },
27351             "\u0633\u062D": {
27352                 "isolated": "\uFC1D",
27353                 "initial": "\uFCAE",
27354                 "medial": "\uFD35"
27355             },
27356             "\u0633\u062E": {
27357                 "isolated": "\uFC1E",
27358                 "initial": "\uFCAF",
27359                 "medial": "\uFD36"
27360             },
27361             "\u0633\u0645": {
27362                 "isolated": "\uFC1F",
27363                 "initial": "\uFCB0",
27364                 "medial": "\uFCE7"
27365             },
27366             "\u0635\u062D": {
27367                 "isolated": "\uFC20",
27368                 "initial": "\uFCB1"
27369             },
27370             "\u0635\u0645": {
27371                 "isolated": "\uFC21",
27372                 "initial": "\uFCB3"
27373             },
27374             "\u0636\u062C": {
27375                 "isolated": "\uFC22",
27376                 "initial": "\uFCB4"
27377             },
27378             "\u0636\u062D": {
27379                 "isolated": "\uFC23",
27380                 "initial": "\uFCB5"
27381             },
27382             "\u0636\u062E": {
27383                 "isolated": "\uFC24",
27384                 "initial": "\uFCB6"
27385             },
27386             "\u0636\u0645": {
27387                 "isolated": "\uFC25",
27388                 "initial": "\uFCB7"
27389             },
27390             "\u0637\u062D": {
27391                 "isolated": "\uFC26",
27392                 "initial": "\uFCB8"
27393             },
27394             "\u0637\u0645": {
27395                 "isolated": "\uFC27",
27396                 "initial": "\uFD33",
27397                 "medial": "\uFD3A"
27398             },
27399             "\u0638\u0645": {
27400                 "isolated": "\uFC28",
27401                 "initial": "\uFCB9",
27402                 "medial": "\uFD3B"
27403             },
27404             "\u0639\u062C": {
27405                 "isolated": "\uFC29",
27406                 "initial": "\uFCBA"
27407             },
27408             "\u0639\u0645": {
27409                 "isolated": "\uFC2A",
27410                 "initial": "\uFCBB"
27411             },
27412             "\u063A\u062C": {
27413                 "isolated": "\uFC2B",
27414                 "initial": "\uFCBC"
27415             },
27416             "\u063A\u0645": {
27417                 "isolated": "\uFC2C",
27418                 "initial": "\uFCBD"
27419             },
27420             "\u0641\u062C": {
27421                 "isolated": "\uFC2D",
27422                 "initial": "\uFCBE"
27423             },
27424             "\u0641\u062D": {
27425                 "isolated": "\uFC2E",
27426                 "initial": "\uFCBF"
27427             },
27428             "\u0641\u062E": {
27429                 "isolated": "\uFC2F",
27430                 "initial": "\uFCC0"
27431             },
27432             "\u0641\u0645": {
27433                 "isolated": "\uFC30",
27434                 "initial": "\uFCC1"
27435             },
27436             "\u0641\u0649": {
27437                 "isolated": "\uFC31",
27438                 "final": "\uFC7C"
27439             },
27440             "\u0641\u064A": {
27441                 "isolated": "\uFC32",
27442                 "final": "\uFC7D"
27443             },
27444             "\u0642\u062D": {
27445                 "isolated": "\uFC33",
27446                 "initial": "\uFCC2"
27447             },
27448             "\u0642\u0645": {
27449                 "isolated": "\uFC34",
27450                 "initial": "\uFCC3"
27451             },
27452             "\u0642\u0649": {
27453                 "isolated": "\uFC35",
27454                 "final": "\uFC7E"
27455             },
27456             "\u0642\u064A": {
27457                 "isolated": "\uFC36",
27458                 "final": "\uFC7F"
27459             },
27460             "\u0643\u0627": {
27461                 "isolated": "\uFC37",
27462                 "final": "\uFC80"
27463             },
27464             "\u0643\u062C": {
27465                 "isolated": "\uFC38",
27466                 "initial": "\uFCC4"
27467             },
27468             "\u0643\u062D": {
27469                 "isolated": "\uFC39",
27470                 "initial": "\uFCC5"
27471             },
27472             "\u0643\u062E": {
27473                 "isolated": "\uFC3A",
27474                 "initial": "\uFCC6"
27475             },
27476             "\u0643\u0644": {
27477                 "isolated": "\uFC3B",
27478                 "final": "\uFC81",
27479                 "initial": "\uFCC7",
27480                 "medial": "\uFCEB"
27481             },
27482             "\u0643\u0645": {
27483                 "isolated": "\uFC3C",
27484                 "final": "\uFC82",
27485                 "initial": "\uFCC8",
27486                 "medial": "\uFCEC"
27487             },
27488             "\u0643\u0649": {
27489                 "isolated": "\uFC3D",
27490                 "final": "\uFC83"
27491             },
27492             "\u0643\u064A": {
27493                 "isolated": "\uFC3E",
27494                 "final": "\uFC84"
27495             },
27496             "\u0644\u062C": {
27497                 "isolated": "\uFC3F",
27498                 "initial": "\uFCC9"
27499             },
27500             "\u0644\u062D": {
27501                 "isolated": "\uFC40",
27502                 "initial": "\uFCCA"
27503             },
27504             "\u0644\u062E": {
27505                 "isolated": "\uFC41",
27506                 "initial": "\uFCCB"
27507             },
27508             "\u0644\u0645": {
27509                 "isolated": "\uFC42",
27510                 "final": "\uFC85",
27511                 "initial": "\uFCCC",
27512                 "medial": "\uFCED"
27513             },
27514             "\u0644\u0649": {
27515                 "isolated": "\uFC43",
27516                 "final": "\uFC86"
27517             },
27518             "\u0644\u064A": {
27519                 "isolated": "\uFC44",
27520                 "final": "\uFC87"
27521             },
27522             "\u0645\u062C": {
27523                 "isolated": "\uFC45",
27524                 "initial": "\uFCCE"
27525             },
27526             "\u0645\u062D": {
27527                 "isolated": "\uFC46",
27528                 "initial": "\uFCCF"
27529             },
27530             "\u0645\u062E": {
27531                 "isolated": "\uFC47",
27532                 "initial": "\uFCD0"
27533             },
27534             "\u0645\u0645": {
27535                 "isolated": "\uFC48",
27536                 "final": "\uFC89",
27537                 "initial": "\uFCD1"
27538             },
27539             "\u0645\u0649": {
27540                 "isolated": "\uFC49"
27541             },
27542             "\u0645\u064A": {
27543                 "isolated": "\uFC4A"
27544             },
27545             "\u0646\u062C": {
27546                 "isolated": "\uFC4B",
27547                 "initial": "\uFCD2"
27548             },
27549             "\u0646\u062D": {
27550                 "isolated": "\uFC4C",
27551                 "initial": "\uFCD3"
27552             },
27553             "\u0646\u062E": {
27554                 "isolated": "\uFC4D",
27555                 "initial": "\uFCD4"
27556             },
27557             "\u0646\u0645": {
27558                 "isolated": "\uFC4E",
27559                 "final": "\uFC8C",
27560                 "initial": "\uFCD5",
27561                 "medial": "\uFCEE"
27562             },
27563             "\u0646\u0649": {
27564                 "isolated": "\uFC4F",
27565                 "final": "\uFC8E"
27566             },
27567             "\u0646\u064A": {
27568                 "isolated": "\uFC50",
27569                 "final": "\uFC8F"
27570             },
27571             "\u0647\u062C": {
27572                 "isolated": "\uFC51",
27573                 "initial": "\uFCD7"
27574             },
27575             "\u0647\u0645": {
27576                 "isolated": "\uFC52",
27577                 "initial": "\uFCD8"
27578             },
27579             "\u0647\u0649": {
27580                 "isolated": "\uFC53"
27581             },
27582             "\u0647\u064A": {
27583                 "isolated": "\uFC54"
27584             },
27585             "\u064A\u062C": {
27586                 "isolated": "\uFC55",
27587                 "initial": "\uFCDA"
27588             },
27589             "\u064A\u062D": {
27590                 "isolated": "\uFC56",
27591                 "initial": "\uFCDB"
27592             },
27593             "\u064A\u062E": {
27594                 "isolated": "\uFC57",
27595                 "initial": "\uFCDC"
27596             },
27597             "\u064A\u0645": {
27598                 "isolated": "\uFC58",
27599                 "final": "\uFC93",
27600                 "initial": "\uFCDD",
27601                 "medial": "\uFCF0"
27602             },
27603             "\u064A\u0649": {
27604                 "isolated": "\uFC59",
27605                 "final": "\uFC95"
27606             },
27607             "\u064A\u064A": {
27608                 "isolated": "\uFC5A",
27609                 "final": "\uFC96"
27610             },
27611             "\u0630\u0670": {
27612                 "isolated": "\uFC5B"
27613             },
27614             "\u0631\u0670": {
27615                 "isolated": "\uFC5C"
27616             },
27617             "\u0649\u0670": {
27618                 "isolated": "\uFC5D",
27619                 "final": "\uFC90"
27620             },
27621             "\u064C\u0651": {
27622                 "isolated": "\uFC5E"
27623             },
27624             "\u064D\u0651": {
27625                 "isolated": "\uFC5F"
27626             },
27627             "\u064E\u0651": {
27628                 "isolated": "\uFC60"
27629             },
27630             "\u064F\u0651": {
27631                 "isolated": "\uFC61"
27632             },
27633             "\u0650\u0651": {
27634                 "isolated": "\uFC62"
27635             },
27636             "\u0651\u0670": {
27637                 "isolated": "\uFC63"
27638             },
27639             "\u0626\u0631": {
27640                 "final": "\uFC64"
27641             },
27642             "\u0626\u0632": {
27643                 "final": "\uFC65"
27644             },
27645             "\u0626\u0646": {
27646                 "final": "\uFC67"
27647             },
27648             "\u0628\u0631": {
27649                 "final": "\uFC6A"
27650             },
27651             "\u0628\u0632": {
27652                 "final": "\uFC6B"
27653             },
27654             "\u0628\u0646": {
27655                 "final": "\uFC6D"
27656             },
27657             "\u062A\u0631": {
27658                 "final": "\uFC70"
27659             },
27660             "\u062A\u0632": {
27661                 "final": "\uFC71"
27662             },
27663             "\u062A\u0646": {
27664                 "final": "\uFC73"
27665             },
27666             "\u062B\u0631": {
27667                 "final": "\uFC76"
27668             },
27669             "\u062B\u0632": {
27670                 "final": "\uFC77"
27671             },
27672             "\u062B\u0646": {
27673                 "final": "\uFC79"
27674             },
27675             "\u062B\u064A": {
27676                 "final": "\uFC7B"
27677             },
27678             "\u0645\u0627": {
27679                 "final": "\uFC88"
27680             },
27681             "\u0646\u0631": {
27682                 "final": "\uFC8A"
27683             },
27684             "\u0646\u0632": {
27685                 "final": "\uFC8B"
27686             },
27687             "\u0646\u0646": {
27688                 "final": "\uFC8D"
27689             },
27690             "\u064A\u0631": {
27691                 "final": "\uFC91"
27692             },
27693             "\u064A\u0632": {
27694                 "final": "\uFC92"
27695             },
27696             "\u064A\u0646": {
27697                 "final": "\uFC94"
27698             },
27699             "\u0626\u062E": {
27700                 "initial": "\uFC99"
27701             },
27702             "\u0626\u0647": {
27703                 "initial": "\uFC9B",
27704                 "medial": "\uFCE0"
27705             },
27706             "\u0628\u0647": {
27707                 "initial": "\uFCA0",
27708                 "medial": "\uFCE2"
27709             },
27710             "\u062A\u0647": {
27711                 "initial": "\uFCA5",
27712                 "medial": "\uFCE4"
27713             },
27714             "\u0635\u062E": {
27715                 "initial": "\uFCB2"
27716             },
27717             "\u0644\u0647": {
27718                 "initial": "\uFCCD"
27719             },
27720             "\u0646\u0647": {
27721                 "initial": "\uFCD6",
27722                 "medial": "\uFCEF"
27723             },
27724             "\u0647\u0670": {
27725                 "initial": "\uFCD9"
27726             },
27727             "\u064A\u0647": {
27728                 "initial": "\uFCDE",
27729                 "medial": "\uFCF1"
27730             },
27731             "\u062B\u0647": {
27732                 "medial": "\uFCE6"
27733             },
27734             "\u0633\u0647": {
27735                 "medial": "\uFCE8",
27736                 "initial": "\uFD31"
27737             },
27738             "\u0634\u0645": {
27739                 "medial": "\uFCE9",
27740                 "isolated": "\uFD0C",
27741                 "final": "\uFD28",
27742                 "initial": "\uFD30"
27743             },
27744             "\u0634\u0647": {
27745                 "medial": "\uFCEA",
27746                 "initial": "\uFD32"
27747             },
27748             "\u0640\u064E\u0651": {
27749                 "medial": "\uFCF2"
27750             },
27751             "\u0640\u064F\u0651": {
27752                 "medial": "\uFCF3"
27753             },
27754             "\u0640\u0650\u0651": {
27755                 "medial": "\uFCF4"
27756             },
27757             "\u0637\u0649": {
27758                 "isolated": "\uFCF5",
27759                 "final": "\uFD11"
27760             },
27761             "\u0637\u064A": {
27762                 "isolated": "\uFCF6",
27763                 "final": "\uFD12"
27764             },
27765             "\u0639\u0649": {
27766                 "isolated": "\uFCF7",
27767                 "final": "\uFD13"
27768             },
27769             "\u0639\u064A": {
27770                 "isolated": "\uFCF8",
27771                 "final": "\uFD14"
27772             },
27773             "\u063A\u0649": {
27774                 "isolated": "\uFCF9",
27775                 "final": "\uFD15"
27776             },
27777             "\u063A\u064A": {
27778                 "isolated": "\uFCFA",
27779                 "final": "\uFD16"
27780             },
27781             "\u0633\u0649": {
27782                 "isolated": "\uFCFB"
27783             },
27784             "\u0633\u064A": {
27785                 "isolated": "\uFCFC",
27786                 "final": "\uFD18"
27787             },
27788             "\u0634\u0649": {
27789                 "isolated": "\uFCFD",
27790                 "final": "\uFD19"
27791             },
27792             "\u0634\u064A": {
27793                 "isolated": "\uFCFE",
27794                 "final": "\uFD1A"
27795             },
27796             "\u062D\u0649": {
27797                 "isolated": "\uFCFF",
27798                 "final": "\uFD1B"
27799             },
27800             "\u062D\u064A": {
27801                 "isolated": "\uFD00",
27802                 "final": "\uFD1C"
27803             },
27804             "\u062C\u0649": {
27805                 "isolated": "\uFD01",
27806                 "final": "\uFD1D"
27807             },
27808             "\u062C\u064A": {
27809                 "isolated": "\uFD02",
27810                 "final": "\uFD1E"
27811             },
27812             "\u062E\u0649": {
27813                 "isolated": "\uFD03",
27814                 "final": "\uFD1F"
27815             },
27816             "\u062E\u064A": {
27817                 "isolated": "\uFD04",
27818                 "final": "\uFD20"
27819             },
27820             "\u0635\u0649": {
27821                 "isolated": "\uFD05",
27822                 "final": "\uFD21"
27823             },
27824             "\u0635\u064A": {
27825                 "isolated": "\uFD06",
27826                 "final": "\uFD22"
27827             },
27828             "\u0636\u0649": {
27829                 "isolated": "\uFD07",
27830                 "final": "\uFD23"
27831             },
27832             "\u0636\u064A": {
27833                 "isolated": "\uFD08",
27834                 "final": "\uFD24"
27835             },
27836             "\u0634\u062C": {
27837                 "isolated": "\uFD09",
27838                 "final": "\uFD25",
27839                 "initial": "\uFD2D",
27840                 "medial": "\uFD37"
27841             },
27842             "\u0634\u062D": {
27843                 "isolated": "\uFD0A",
27844                 "final": "\uFD26",
27845                 "initial": "\uFD2E",
27846                 "medial": "\uFD38"
27847             },
27848             "\u0634\u062E": {
27849                 "isolated": "\uFD0B",
27850                 "final": "\uFD27",
27851                 "initial": "\uFD2F",
27852                 "medial": "\uFD39"
27853             },
27854             "\u0634\u0631": {
27855                 "isolated": "\uFD0D",
27856                 "final": "\uFD29"
27857             },
27858             "\u0633\u0631": {
27859                 "isolated": "\uFD0E",
27860                 "final": "\uFD2A"
27861             },
27862             "\u0635\u0631": {
27863                 "isolated": "\uFD0F",
27864                 "final": "\uFD2B"
27865             },
27866             "\u0636\u0631": {
27867                 "isolated": "\uFD10",
27868                 "final": "\uFD2C"
27869             },
27870             "\u0633\u0639": {
27871                 "final": "\uFD17"
27872             },
27873             "\u062A\u062C\u0645": {
27874                 "initial": "\uFD50"
27875             },
27876             "\u062A\u062D\u062C": {
27877                 "final": "\uFD51",
27878                 "initial": "\uFD52"
27879             },
27880             "\u062A\u062D\u0645": {
27881                 "initial": "\uFD53"
27882             },
27883             "\u062A\u062E\u0645": {
27884                 "initial": "\uFD54"
27885             },
27886             "\u062A\u0645\u062C": {
27887                 "initial": "\uFD55"
27888             },
27889             "\u062A\u0645\u062D": {
27890                 "initial": "\uFD56"
27891             },
27892             "\u062A\u0645\u062E": {
27893                 "initial": "\uFD57"
27894             },
27895             "\u062C\u0645\u062D": {
27896                 "final": "\uFD58",
27897                 "initial": "\uFD59"
27898             },
27899             "\u062D\u0645\u064A": {
27900                 "final": "\uFD5A"
27901             },
27902             "\u062D\u0645\u0649": {
27903                 "final": "\uFD5B"
27904             },
27905             "\u0633\u062D\u062C": {
27906                 "initial": "\uFD5C"
27907             },
27908             "\u0633\u062C\u062D": {
27909                 "initial": "\uFD5D"
27910             },
27911             "\u0633\u062C\u0649": {
27912                 "final": "\uFD5E"
27913             },
27914             "\u0633\u0645\u062D": {
27915                 "final": "\uFD5F",
27916                 "initial": "\uFD60"
27917             },
27918             "\u0633\u0645\u062C": {
27919                 "initial": "\uFD61"
27920             },
27921             "\u0633\u0645\u0645": {
27922                 "final": "\uFD62",
27923                 "initial": "\uFD63"
27924             },
27925             "\u0635\u062D\u062D": {
27926                 "final": "\uFD64",
27927                 "initial": "\uFD65"
27928             },
27929             "\u0635\u0645\u0645": {
27930                 "final": "\uFD66",
27931                 "initial": "\uFDC5"
27932             },
27933             "\u0634\u062D\u0645": {
27934                 "final": "\uFD67",
27935                 "initial": "\uFD68"
27936             },
27937             "\u0634\u062C\u064A": {
27938                 "final": "\uFD69"
27939             },
27940             "\u0634\u0645\u062E": {
27941                 "final": "\uFD6A",
27942                 "initial": "\uFD6B"
27943             },
27944             "\u0634\u0645\u0645": {
27945                 "final": "\uFD6C",
27946                 "initial": "\uFD6D"
27947             },
27948             "\u0636\u062D\u0649": {
27949                 "final": "\uFD6E"
27950             },
27951             "\u0636\u062E\u0645": {
27952                 "final": "\uFD6F",
27953                 "initial": "\uFD70"
27954             },
27955             "\u0636\u0645\u062D": {
27956                 "final": "\uFD71"
27957             },
27958             "\u0637\u0645\u062D": {
27959                 "initial": "\uFD72"
27960             },
27961             "\u0637\u0645\u0645": {
27962                 "initial": "\uFD73"
27963             },
27964             "\u0637\u0645\u064A": {
27965                 "final": "\uFD74"
27966             },
27967             "\u0639\u062C\u0645": {
27968                 "final": "\uFD75",
27969                 "initial": "\uFDC4"
27970             },
27971             "\u0639\u0645\u0645": {
27972                 "final": "\uFD76",
27973                 "initial": "\uFD77"
27974             },
27975             "\u0639\u0645\u0649": {
27976                 "final": "\uFD78"
27977             },
27978             "\u063A\u0645\u0645": {
27979                 "final": "\uFD79"
27980             },
27981             "\u063A\u0645\u064A": {
27982                 "final": "\uFD7A"
27983             },
27984             "\u063A\u0645\u0649": {
27985                 "final": "\uFD7B"
27986             },
27987             "\u0641\u062E\u0645": {
27988                 "final": "\uFD7C",
27989                 "initial": "\uFD7D"
27990             },
27991             "\u0642\u0645\u062D": {
27992                 "final": "\uFD7E",
27993                 "initial": "\uFDB4"
27994             },
27995             "\u0642\u0645\u0645": {
27996                 "final": "\uFD7F"
27997             },
27998             "\u0644\u062D\u0645": {
27999                 "final": "\uFD80",
28000                 "initial": "\uFDB5"
28001             },
28002             "\u0644\u062D\u064A": {
28003                 "final": "\uFD81"
28004             },
28005             "\u0644\u062D\u0649": {
28006                 "final": "\uFD82"
28007             },
28008             "\u0644\u062C\u062C": {
28009                 "initial": "\uFD83",
28010                 "final": "\uFD84"
28011             },
28012             "\u0644\u062E\u0645": {
28013                 "final": "\uFD85",
28014                 "initial": "\uFD86"
28015             },
28016             "\u0644\u0645\u062D": {
28017                 "final": "\uFD87",
28018                 "initial": "\uFD88"
28019             },
28020             "\u0645\u062D\u062C": {
28021                 "initial": "\uFD89"
28022             },
28023             "\u0645\u062D\u0645": {
28024                 "initial": "\uFD8A"
28025             },
28026             "\u0645\u062D\u064A": {
28027                 "final": "\uFD8B"
28028             },
28029             "\u0645\u062C\u062D": {
28030                 "initial": "\uFD8C"
28031             },
28032             "\u0645\u062C\u0645": {
28033                 "initial": "\uFD8D"
28034             },
28035             "\u0645\u062E\u062C": {
28036                 "initial": "\uFD8E"
28037             },
28038             "\u0645\u062E\u0645": {
28039                 "initial": "\uFD8F"
28040             },
28041             "\u0645\u062C\u062E": {
28042                 "initial": "\uFD92"
28043             },
28044             "\u0647\u0645\u062C": {
28045                 "initial": "\uFD93"
28046             },
28047             "\u0647\u0645\u0645": {
28048                 "initial": "\uFD94"
28049             },
28050             "\u0646\u062D\u0645": {
28051                 "initial": "\uFD95"
28052             },
28053             "\u0646\u062D\u0649": {
28054                 "final": "\uFD96"
28055             },
28056             "\u0646\u062C\u0645": {
28057                 "final": "\uFD97",
28058                 "initial": "\uFD98"
28059             },
28060             "\u0646\u062C\u0649": {
28061                 "final": "\uFD99"
28062             },
28063             "\u0646\u0645\u064A": {
28064                 "final": "\uFD9A"
28065             },
28066             "\u0646\u0645\u0649": {
28067                 "final": "\uFD9B"
28068             },
28069             "\u064A\u0645\u0645": {
28070                 "final": "\uFD9C",
28071                 "initial": "\uFD9D"
28072             },
28073             "\u0628\u062E\u064A": {
28074                 "final": "\uFD9E"
28075             },
28076             "\u062A\u062C\u064A": {
28077                 "final": "\uFD9F"
28078             },
28079             "\u062A\u062C\u0649": {
28080                 "final": "\uFDA0"
28081             },
28082             "\u062A\u062E\u064A": {
28083                 "final": "\uFDA1"
28084             },
28085             "\u062A\u062E\u0649": {
28086                 "final": "\uFDA2"
28087             },
28088             "\u062A\u0645\u064A": {
28089                 "final": "\uFDA3"
28090             },
28091             "\u062A\u0645\u0649": {
28092                 "final": "\uFDA4"
28093             },
28094             "\u062C\u0645\u064A": {
28095                 "final": "\uFDA5"
28096             },
28097             "\u062C\u062D\u0649": {
28098                 "final": "\uFDA6"
28099             },
28100             "\u062C\u0645\u0649": {
28101                 "final": "\uFDA7"
28102             },
28103             "\u0633\u062E\u0649": {
28104                 "final": "\uFDA8"
28105             },
28106             "\u0635\u062D\u064A": {
28107                 "final": "\uFDA9"
28108             },
28109             "\u0634\u062D\u064A": {
28110                 "final": "\uFDAA"
28111             },
28112             "\u0636\u062D\u064A": {
28113                 "final": "\uFDAB"
28114             },
28115             "\u0644\u062C\u064A": {
28116                 "final": "\uFDAC"
28117             },
28118             "\u0644\u0645\u064A": {
28119                 "final": "\uFDAD"
28120             },
28121             "\u064A\u062D\u064A": {
28122                 "final": "\uFDAE"
28123             },
28124             "\u064A\u062C\u064A": {
28125                 "final": "\uFDAF"
28126             },
28127             "\u064A\u0645\u064A": {
28128                 "final": "\uFDB0"
28129             },
28130             "\u0645\u0645\u064A": {
28131                 "final": "\uFDB1"
28132             },
28133             "\u0642\u0645\u064A": {
28134                 "final": "\uFDB2"
28135             },
28136             "\u0646\u062D\u064A": {
28137                 "final": "\uFDB3"
28138             },
28139             "\u0639\u0645\u064A": {
28140                 "final": "\uFDB6"
28141             },
28142             "\u0643\u0645\u064A": {
28143                 "final": "\uFDB7"
28144             },
28145             "\u0646\u062C\u062D": {
28146                 "initial": "\uFDB8",
28147                 "final": "\uFDBD"
28148             },
28149             "\u0645\u062E\u064A": {
28150                 "final": "\uFDB9"
28151             },
28152             "\u0644\u062C\u0645": {
28153                 "initial": "\uFDBA",
28154                 "final": "\uFDBC"
28155             },
28156             "\u0643\u0645\u0645": {
28157                 "final": "\uFDBB",
28158                 "initial": "\uFDC3"
28159             },
28160             "\u062C\u062D\u064A": {
28161                 "final": "\uFDBE"
28162             },
28163             "\u062D\u062C\u064A": {
28164                 "final": "\uFDBF"
28165             },
28166             "\u0645\u062C\u064A": {
28167                 "final": "\uFDC0"
28168             },
28169             "\u0641\u0645\u064A": {
28170                 "final": "\uFDC1"
28171             },
28172             "\u0628\u062D\u064A": {
28173                 "final": "\uFDC2"
28174             },
28175             "\u0633\u062E\u064A": {
28176                 "final": "\uFDC6"
28177             },
28178             "\u0646\u062C\u064A": {
28179                 "final": "\uFDC7"
28180             },
28181             "\u0644\u0622": {
28182                 "isolated": "\uFEF5",
28183                 "final": "\uFEF6"
28184             },
28185             "\u0644\u0623": {
28186                 "isolated": "\uFEF7",
28187                 "final": "\uFEF8"
28188             },
28189             "\u0644\u0625": {
28190                 "isolated": "\uFEF9",
28191                 "final": "\uFEFA"
28192             },
28193             "\u0644\u0627": {
28194                 "isolated": "\uFEFB",
28195                 "final": "\uFEFC"
28196             },
28197             "words": {
28198                 "\u0635\u0644\u06D2": "\uFDF0",
28199                 "\u0642\u0644\u06D2": "\uFDF1",
28200                 "\u0627\u0644\u0644\u0647": "\uFDF2",
28201                 "\u0627\u0643\u0628\u0631": "\uFDF3",
28202                 "\u0645\u062D\u0645\u062F": "\uFDF4",
28203                 "\u0635\u0644\u0639\u0645": "\uFDF5",
28204                 "\u0631\u0633\u0648\u0644": "\uFDF6",
28205                 "\u0639\u0644\u064A\u0647": "\uFDF7",
28206                 "\u0648\u0633\u0644\u0645": "\uFDF8",
28207                 "\u0635\u0644\u0649": "\uFDF9",
28208                 "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
28209                 "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
28210                 "\u0631\u06CC\u0627\u0644": "\uFDFC"
28211             }
28212         };
28213         exports.default = ligatureReference;
28214         });
28215
28216         unwrapExports(unicodeLigatures);
28217
28218         var reference = createCommonjsModule(function (module, exports) {
28219         Object.defineProperty(exports, "__esModule", { value: true });
28220
28221
28222         var letterList = Object.keys(unicodeArabic.default);
28223         exports.letterList = letterList;
28224         var ligatureList = Object.keys(unicodeLigatures.default);
28225         exports.ligatureList = ligatureList;
28226         var ligatureWordList = Object.keys(unicodeLigatures.default.words);
28227         exports.ligatureWordList = ligatureWordList;
28228         var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
28229         exports.lams = lams;
28230         var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
28231         exports.alefs = alefs;
28232         // for (var l = 1; l < lams.length; l++) {
28233         //   console.log('-');
28234         //   for (var a = 0; a < alefs.length; a++) {
28235         //     console.log(a + ': ' + lams[l] + alefs[a]);
28236         //   }
28237         // }
28238         var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
28239         exports.tashkeel = tashkeel;
28240         function addToTashkeel(start, finish) {
28241             for (var i = start; i <= finish; i++) {
28242                 exports.tashkeel = tashkeel += String.fromCharCode(i);
28243             }
28244         }
28245         addToTashkeel(0x0610, 0x061A);
28246         addToTashkeel(0x064B, 0x065F);
28247         addToTashkeel(0x06D6, 0x06DC);
28248         addToTashkeel(0x06E0, 0x06E4);
28249         addToTashkeel(0x06EA, 0x06ED);
28250         addToTashkeel(0x08D3, 0x08E1);
28251         addToTashkeel(0x08E3, 0x08FF);
28252         addToTashkeel(0xFE70, 0xFE7F);
28253         var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
28254         exports.lineBreakers = lineBreakers;
28255         function addToLineBreakers(start, finish) {
28256             for (var i = start; i <= finish; i++) {
28257                 exports.lineBreakers = lineBreakers += String.fromCharCode(i);
28258             }
28259         }
28260         addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
28261         addToLineBreakers(0x0621, 0x0625);
28262         addToLineBreakers(0x062F, 0x0632);
28263         addToLineBreakers(0x0660, 0x066D); // numerals, math
28264         addToLineBreakers(0x0671, 0x0677);
28265         addToLineBreakers(0x0688, 0x0699);
28266         addToLineBreakers(0x06C3, 0x06CB);
28267         addToLineBreakers(0x06D2, 0x06F9);
28268         addToLineBreakers(0x0759, 0x075B);
28269         addToLineBreakers(0x08AA, 0x08AE);
28270         addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
28271         // Presentation Forms A includes diacritics but they are meant to stand alone
28272         addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
28273         // numerals, math
28274         addToLineBreakers(0x10E60, 0x10E7F);
28275         addToLineBreakers(0x1EC70, 0x1ECBF);
28276         addToLineBreakers(0x1EE00, 0x1EEFF);
28277         });
28278
28279         unwrapExports(reference);
28280         var reference_1 = reference.letterList;
28281         var reference_2 = reference.ligatureList;
28282         var reference_3 = reference.ligatureWordList;
28283         var reference_4 = reference.lams;
28284         var reference_5 = reference.alefs;
28285         var reference_6 = reference.tashkeel;
28286         var reference_7 = reference.lineBreakers;
28287
28288         var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
28289         Object.defineProperty(exports, "__esModule", { value: true });
28290
28291
28292         function GlyphSplitter(word) {
28293             var letters = [];
28294             var lastLetter = '';
28295             word.split('').forEach(function (letter) {
28296                 if (isArabic_1.isArabic(letter)) {
28297                     if (reference.tashkeel.indexOf(letter) > -1) {
28298                         letters[letters.length - 1] += letter;
28299                     }
28300                     else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) {
28301                         // valid LA forms
28302                         letters[letters.length - 1] += letter;
28303                     }
28304                     else {
28305                         letters.push(letter);
28306                     }
28307                 }
28308                 else {
28309                     letters.push(letter);
28310                 }
28311                 if (reference.tashkeel.indexOf(letter) === -1) {
28312                     lastLetter = letter;
28313                 }
28314             });
28315             return letters;
28316         }
28317         exports.GlyphSplitter = GlyphSplitter;
28318         });
28319
28320         unwrapExports(GlyphSplitter_1);
28321         var GlyphSplitter_2 = GlyphSplitter_1.GlyphSplitter;
28322
28323         var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
28324         Object.defineProperty(exports, "__esModule", { value: true });
28325
28326
28327         function BaselineSplitter(word) {
28328             var letters = [];
28329             var lastLetter = '';
28330             word.split('').forEach(function (letter) {
28331                 if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
28332                     if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
28333                         letters[letters.length - 1] += letter;
28334                     }
28335                     else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
28336                         letters.push(letter);
28337                     }
28338                     else {
28339                         letters[letters.length - 1] += letter;
28340                     }
28341                 }
28342                 else {
28343                     letters.push(letter);
28344                 }
28345                 if (reference.tashkeel.indexOf(letter) === -1) {
28346                     // don't allow tashkeel to hide line break
28347                     lastLetter = letter;
28348                 }
28349             });
28350             return letters;
28351         }
28352         exports.BaselineSplitter = BaselineSplitter;
28353         });
28354
28355         unwrapExports(BaselineSplitter_1);
28356         var BaselineSplitter_2 = BaselineSplitter_1.BaselineSplitter;
28357
28358         var Normalization = createCommonjsModule(function (module, exports) {
28359         Object.defineProperty(exports, "__esModule", { value: true });
28360
28361
28362
28363
28364         function Normal(word, breakPresentationForm) {
28365             // default is to turn initial/isolated/medial/final presentation form to generic
28366             if (typeof breakPresentationForm === 'undefined') {
28367                 breakPresentationForm = true;
28368             }
28369             var returnable = '';
28370             word.split('').forEach(function (letter) {
28371                 if (!isArabic_1.isArabic(letter)) {
28372                     returnable += letter;
28373                     return;
28374                 }
28375                 for (var w = 0; w < reference.letterList.length; w++) {
28376                     // ok so we are checking this potential lettertron
28377                     var letterForms = unicodeArabic.default[reference.letterList[w]];
28378                     var versions = Object.keys(letterForms);
28379                     for (var v = 0; v < versions.length; v++) {
28380                         var localVersion = letterForms[versions[v]];
28381                         if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28382                             // look at this embedded object
28383                             var embeddedForms = Object.keys(localVersion);
28384                             for (var ef = 0; ef < embeddedForms.length; ef++) {
28385                                 var form = localVersion[embeddedForms[ef]];
28386                                 if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28387                                     // match
28388                                     // console.log('embedded match');
28389                                     if (form === letter) {
28390                                         // match exact
28391                                         if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
28392                                             // replace presentation form
28393                                             // console.log('keeping normal form of the letter');
28394                                             if (typeof localVersion['normal'] === 'object') {
28395                                                 returnable += localVersion['normal'][0];
28396                                             }
28397                                             else {
28398                                                 returnable += localVersion['normal'];
28399                                             }
28400                                             return;
28401                                         }
28402                                         // console.log('keeping this letter');
28403                                         returnable += letter;
28404                                         return;
28405                                     }
28406                                     else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) {
28407                                         // match
28408                                         returnable += form[0];
28409                                         // console.log('added the first letter from the same array');
28410                                         return;
28411                                     }
28412                                 }
28413                             }
28414                         }
28415                         else if (localVersion === letter) {
28416                             // match exact
28417                             if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
28418                                 // replace presentation form
28419                                 // console.log('keeping normal form of the letter');
28420                                 if (typeof letterForms['normal'] === 'object') {
28421                                     returnable += letterForms['normal'][0];
28422                                 }
28423                                 else {
28424                                     returnable += letterForms['normal'];
28425                                 }
28426                                 return;
28427                             }
28428                             // console.log('keeping this letter');
28429                             returnable += letter;
28430                             return;
28431                         }
28432                         else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
28433                             // match
28434                             returnable += localVersion[0];
28435                             // console.log('added the first letter from the same array');
28436                             return;
28437                         }
28438                     }
28439                 }
28440                 // try ligatures
28441                 for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
28442                     var normalForm = reference.ligatureList[v2];
28443                     if (normalForm !== 'words') {
28444                         var ligForms = Object.keys(unicodeLigatures.default[normalForm]);
28445                         for (var f = 0; f < ligForms.length; f++) {
28446                             if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) {
28447                                 returnable += normalForm;
28448                                 return;
28449                             }
28450                         }
28451                     }
28452                 }
28453                 // try words ligatures
28454                 for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
28455                     var normalForm = reference.ligatureWordList[v3];
28456                     if (unicodeLigatures.default.words[normalForm] === letter) {
28457                         returnable += normalForm;
28458                         return;
28459                     }
28460                 }
28461                 returnable += letter;
28462                 // console.log('kept the letter')
28463             });
28464             return returnable;
28465         }
28466         exports.Normal = Normal;
28467         });
28468
28469         unwrapExports(Normalization);
28470         var Normalization_1 = Normalization.Normal;
28471
28472         var CharShaper_1 = createCommonjsModule(function (module, exports) {
28473         Object.defineProperty(exports, "__esModule", { value: true });
28474
28475
28476
28477         function CharShaper(letter, form) {
28478             if (!isArabic_1.isArabic(letter)) {
28479                 // fail not Arabic
28480                 throw new Error('Not Arabic');
28481             }
28482             if (letter === "\u0621") {
28483                 // hamza alone
28484                 return "\u0621";
28485             }
28486             for (var w = 0; w < reference.letterList.length; w++) {
28487                 // ok so we are checking this potential lettertron
28488                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28489                 var versions = Object.keys(letterForms);
28490                 for (var v = 0; v < versions.length; v++) {
28491                     var localVersion = letterForms[versions[v]];
28492                     if ((localVersion === letter) ||
28493                         (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28494                         if (versions.indexOf(form) > -1) {
28495                             return letterForms[form];
28496                         }
28497                     }
28498                     else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28499                         // check embedded
28500                         var embeddedVersions = Object.keys(localVersion);
28501                         for (var ev = 0; ev < embeddedVersions.length; ev++) {
28502                             if ((localVersion[embeddedVersions[ev]] === letter) ||
28503                                 (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) {
28504                                 if (embeddedVersions.indexOf(form) > -1) {
28505                                     return localVersion[form];
28506                                 }
28507                             }
28508                         }
28509                     }
28510                 }
28511             }
28512         }
28513         exports.CharShaper = CharShaper;
28514         });
28515
28516         unwrapExports(CharShaper_1);
28517         var CharShaper_2 = CharShaper_1.CharShaper;
28518
28519         var WordShaper_1 = createCommonjsModule(function (module, exports) {
28520         Object.defineProperty(exports, "__esModule", { value: true });
28521
28522
28523
28524
28525         function WordShaper(word) {
28526             var state = 'initial';
28527             var output = '';
28528             for (var w = 0; w < word.length; w++) {
28529                 var nextLetter = ' ';
28530                 for (var nxw = w + 1; nxw < word.length; nxw++) {
28531                     if (!isArabic_1.isArabic(word[nxw])) {
28532                         break;
28533                     }
28534                     if (reference.tashkeel.indexOf(word[nxw]) === -1) {
28535                         nextLetter = word[nxw];
28536                         break;
28537                     }
28538                 }
28539                 if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
28540                     // space or other non-Arabic
28541                     output += word[w];
28542                     state = 'initial';
28543                 }
28544                 else if (reference.tashkeel.indexOf(word[w]) > -1) {
28545                     // tashkeel - add without changing state
28546                     output += word[w];
28547                 }
28548                 else if ((nextLetter === ' ') // last Arabic letter in this word
28549                     || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines
28550                     output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
28551                     state = 'initial';
28552                 }
28553                 else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
28554                     // LA letters - advance an additional letter after this
28555                     output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')];
28556                     while (word[w] !== nextLetter) {
28557                         w++;
28558                     }
28559                     state = 'initial';
28560                 }
28561                 else {
28562                     output += CharShaper_1.CharShaper(word[w], state);
28563                     state = 'medial';
28564                 }
28565             }
28566             return output;
28567         }
28568         exports.WordShaper = WordShaper;
28569         });
28570
28571         unwrapExports(WordShaper_1);
28572         var WordShaper_2 = WordShaper_1.WordShaper;
28573
28574         var ParentLetter_1 = createCommonjsModule(function (module, exports) {
28575         Object.defineProperty(exports, "__esModule", { value: true });
28576
28577
28578
28579         function ParentLetter(letter) {
28580             if (!isArabic_1.isArabic(letter)) {
28581                 throw new Error('Not an Arabic letter');
28582             }
28583             for (var w = 0; w < reference.letterList.length; w++) {
28584                 // ok so we are checking this potential lettertron
28585                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28586                 var versions = Object.keys(letterForms);
28587                 for (var v = 0; v < versions.length; v++) {
28588                     var localVersion = letterForms[versions[v]];
28589                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28590                         // look at this embedded object
28591                         var embeddedForms = Object.keys(localVersion);
28592                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28593                             var form = localVersion[embeddedForms[ef]];
28594                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28595                                 // match
28596                                 return localVersion;
28597                             }
28598                         }
28599                     }
28600                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28601                         // match
28602                         return letterForms;
28603                     }
28604                 }
28605                 return null;
28606             }
28607         }
28608         exports.ParentLetter = ParentLetter;
28609         function GrandparentLetter(letter) {
28610             if (!isArabic_1.isArabic(letter)) {
28611                 throw new Error('Not an Arabic letter');
28612             }
28613             for (var w = 0; w < reference.letterList.length; w++) {
28614                 // ok so we are checking this potential lettertron
28615                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28616                 var versions = Object.keys(letterForms);
28617                 for (var v = 0; v < versions.length; v++) {
28618                     var localVersion = letterForms[versions[v]];
28619                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28620                         // look at this embedded object
28621                         var embeddedForms = Object.keys(localVersion);
28622                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28623                             var form = localVersion[embeddedForms[ef]];
28624                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28625                                 // match
28626                                 return letterForms;
28627                             }
28628                         }
28629                     }
28630                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28631                         // match
28632                         return letterForms;
28633                     }
28634                 }
28635                 return null;
28636             }
28637         }
28638         exports.GrandparentLetter = GrandparentLetter;
28639         });
28640
28641         unwrapExports(ParentLetter_1);
28642         var ParentLetter_2 = ParentLetter_1.ParentLetter;
28643         var ParentLetter_3 = ParentLetter_1.GrandparentLetter;
28644
28645         var lib$1 = createCommonjsModule(function (module, exports) {
28646         Object.defineProperty(exports, "__esModule", { value: true });
28647
28648         exports.isArabic = isArabic_1.isArabic;
28649
28650         exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
28651
28652         exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
28653
28654         exports.Normal = Normalization.Normal;
28655
28656         exports.CharShaper = CharShaper_1.CharShaper;
28657
28658         exports.WordShaper = WordShaper_1.WordShaper;
28659
28660         exports.ParentLetter = ParentLetter_1.ParentLetter;
28661         exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
28662         });
28663
28664         unwrapExports(lib$1);
28665         var lib_1 = lib$1.isArabic;
28666         var lib_2 = lib$1.GlyphSplitter;
28667         var lib_3 = lib$1.BaselineSplitter;
28668         var lib_4 = lib$1.Normal;
28669         var lib_5 = lib$1.CharShaper;
28670         var lib_6 = lib$1.WordShaper;
28671         var lib_7 = lib$1.ParentLetter;
28672         var lib_8 = lib$1.GrandparentLetter;
28673
28674         // see https://github.com/openstreetmap/iD/pull/3707
28675
28676         var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
28677
28678         function fixRTLTextForSvg(inputText) {
28679             var ret = '', rtlBuffer = [];
28680             var arabicRegex = /[\u0600-\u06FF]/g;
28681             var arabicMath = /[\u0660-\u066C]+/g;
28682             var thaanaVowel = /[\u07A6-\u07B0]/;
28683             var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
28684
28685             if (!arabicRegex.test(inputText)) {
28686                 // Hebrew or Thaana RTL script
28687                 for (var n = 0; n < inputText.length; n++) {
28688                     var c = inputText[n];
28689                     if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
28690                         rtlBuffer[rtlBuffer.length - 1] += c;
28691                     } else if (rtlRegex.test(c)) {
28692                         rtlBuffer.push(c);
28693                     } else if (c === ' ' && rtlBuffer.length) {
28694                         // whitespace within RTL text
28695                         rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
28696                     } else {
28697                         // non-RTL character
28698                         ret += rtlBuffer.reverse().join('') + c;
28699                         rtlBuffer = [];
28700                     }
28701                 }
28702                 ret += rtlBuffer.reverse().join('');
28703                 return ret;
28704             } else {
28705                 var label = lib_6(inputText).split('').reverse().join('');
28706                 // prevent Arabic numbers from being reversed
28707                 var numericSwaps = label.match(arabicMath) || [];
28708                 for (var i = 0; i < numericSwaps.length; i++) {
28709                     if (numericSwaps[i].length > 1) {
28710                         label = label.replace(numericSwaps[i], numericSwaps[i].split('').reverse().join(''));
28711                     }
28712                 }
28713                 return label;
28714             }
28715         }
28716
28717         var translations = Object.create(null);
28718
28719         var currentLocale = 'en';
28720         var textDirection = 'ltr';
28721
28722         function setLocale(val) {
28723             if (translations[val] !== undefined) {
28724                 currentLocale = val;
28725             } else if (translations[val.split('-')[0]]) {
28726                 currentLocale = val.split('-')[0];
28727             }
28728         }
28729
28730         function addTranslation(id, value) {
28731             translations[id] = value;
28732         }
28733
28734         /**
28735          * Given a string identifier, try to find that string in the current
28736          * language, and return it.  This function will be called recursively
28737          * with locale `en` if a string can not be found in the requested language.
28738          *
28739          * @param {string}   s   string identifier
28740          * @param {object?}  o   object of token replacements and default string
28741          * @param {string?}  loc locale to use
28742          * @returns {string?} locale string
28743          */
28744         function t(s, o, loc) {
28745             loc = loc || currentLocale;
28746
28747             var path = s
28748                 .split('.')
28749                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28750                 .reverse();
28751
28752             var rep = translations[loc];
28753
28754             while (rep !== undefined && path.length) {
28755                 rep = rep[path.pop()];
28756             }
28757
28758             if (rep !== undefined) {
28759                 if (o) {
28760                     for (var k in o) {
28761                         var variable = '{' + k + '}';
28762                         var re = new RegExp(variable, 'g'); // check globally for variables
28763                         rep = rep.replace(re, o[k]);
28764                     }
28765                 }
28766                 return rep;
28767             }
28768
28769             if (loc !== 'en') {
28770                 return t(s, o, 'en');
28771             }
28772
28773             if (o && 'default' in o) {
28774                 return o.default;
28775             }
28776
28777             var missing = 'Missing ' + loc + ' translation: ' + s;
28778             if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28779
28780             return missing;
28781         }
28782
28783         /**
28784          * Given string 'ltr' or 'rtl', save that setting
28785          *
28786          * @param {string} dir ltr or rtl
28787          */
28788
28789         function setTextDirection(dir) {
28790             textDirection = dir;
28791         }
28792
28793         var detected;
28794
28795         function utilDetect(force) {
28796             if (detected && !force) return detected;
28797             detected = {};
28798
28799             var ua = navigator.userAgent,
28800                 m = null,
28801                 q = utilStringQs(window.location.hash.substring(1));
28802
28803             m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
28804             if (m !== null) {
28805                 detected.browser = m[1];
28806                 detected.version = m[2];
28807             }
28808             if (!detected.browser) {
28809                 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
28810                 if (m !== null) {
28811                     detected.browser = 'msie';
28812                     detected.version = m[1];
28813                 }
28814             }
28815             if (!detected.browser) {
28816                 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
28817                 if (m !== null) {
28818                     detected.browser = 'Opera';
28819                     detected.version = m[2];
28820                 }
28821             }
28822             if (!detected.browser) {
28823                 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
28824                 if (m !== null) {
28825                     detected.browser = m[1];
28826                     detected.version = m[2];
28827                     m = ua.match(/version\/([\.\d]+)/i);
28828                     if (m !== null) detected.version = m[1];
28829                 }
28830             }
28831             if (!detected.browser) {
28832                 detected.browser = navigator.appName;
28833                 detected.version = navigator.appVersion;
28834             }
28835
28836             // keep major.minor version only..
28837             detected.version = detected.version.split(/\W/).slice(0,2).join('.');
28838
28839             if (detected.browser.toLowerCase() === 'msie') {
28840                 detected.ie = true;
28841                 detected.browser = 'Internet Explorer';
28842                 detected.support = parseFloat(detected.version) >= 11;
28843             } else {
28844                 detected.ie = false;
28845                 detected.support = true;
28846             }
28847
28848             // Added due to incomplete svg style support. See #715
28849             detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
28850
28851             // Set locale based on url param (format 'en-US') or browser lang (default)
28852             if (q.hasOwnProperty('locale')) {
28853                 detected.locale = q.locale;
28854                 detected.language = q.locale.split('-')[0];
28855             } else {
28856                 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
28857                 detected.language = detected.locale.split('-')[0];
28858
28859                 // Search `navigator.languages` for a better locale. Prefer the first language,
28860                 // unless the second language is a culture-specific version of the first one, see #3842
28861                 if (navigator.languages && navigator.languages.length > 0) {
28862                     var code0 = navigator.languages[0],
28863                         parts0 = code0.split('-');
28864
28865                     detected.locale = code0;
28866                     detected.language = parts0[0];
28867
28868                     if (navigator.languages.length > 1 && parts0.length === 1) {
28869                         var code1 = navigator.languages[1],
28870                             parts1 = code1.split('-');
28871
28872                         if (parts1[0] === parts0[0]) {
28873                             detected.locale = code1;
28874                         }
28875                     }
28876                 }
28877             }
28878
28879             // Loaded locale is stored in currentLocale
28880             // return that instead (except in the situation where 'en' might override 'en-US')
28881             var loadedLocale = currentLocale || 'en';
28882             if (loadedLocale !== 'en') {
28883                 detected.locale = loadedLocale;
28884                 detected.language = detected.locale.split('-')[0];
28885             }
28886
28887             // detect text direction
28888             var lang = dataLocales[detected.locale];
28889             if ((lang && lang.rtl) || (q.rtl === 'true')) {
28890                 detected.textDirection = 'rtl';
28891             } else {
28892                 detected.textDirection = 'ltr';
28893             }
28894             setTextDirection(detected.textDirection);
28895
28896             // detect host
28897             var loc = window.top.location;
28898             var origin = loc.origin;
28899             if (!origin) {  // for unpatched IE11
28900                 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
28901             }
28902
28903             detected.host = origin + loc.pathname;
28904
28905             detected.filedrop = (window.FileReader && 'ondrop' in window);
28906
28907             detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28908
28909             detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28910
28911             function nav(x) {
28912                 return navigator.userAgent.indexOf(x) !== -1;
28913             }
28914
28915             if (nav('Win')) {
28916                 detected.os = 'win';
28917                 detected.platform = 'Windows';
28918             }
28919             else if (nav('Mac')) {
28920                 detected.os = 'mac';
28921                 detected.platform = 'Macintosh';
28922             }
28923             else if (nav('X11') || nav('Linux')) {
28924                 detected.os = 'linux';
28925                 detected.platform = 'Linux';
28926             }
28927             else {
28928                 detected.os = 'win';
28929                 detected.platform = 'Unknown';
28930             }
28931
28932             return detected;
28933         }
28934
28935         function utilTagText(entity) {
28936             var obj = (entity && entity.tags) || {};
28937             return Object.keys(obj)
28938                 .map(function(k) { return k + '=' + obj[k]; })
28939                 .join(', ');
28940         }
28941
28942
28943         function utilTagDiff(oldTags, newTags) {
28944             var tagDiff = [];
28945             var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
28946             keys.forEach(function(k) {
28947                 var oldVal = oldTags[k];
28948                 var newVal = newTags[k];
28949
28950                 if (oldVal && (!newVal || newVal !== oldVal)) {
28951                     tagDiff.push({
28952                         type: '-',
28953                         key: k,
28954                         oldVal: oldVal,
28955                         newVal: newVal,
28956                         display: '- ' + k + '=' + oldVal
28957                     });
28958                 }
28959                 if (newVal && (!oldVal || newVal !== oldVal)) {
28960                     tagDiff.push({
28961                         type: '+',
28962                         key: k,
28963                         oldVal: oldVal,
28964                         newVal: newVal,
28965                         display: '+ ' + k + '=' + newVal
28966                     });
28967                 }
28968             });
28969             return tagDiff;
28970         }
28971
28972
28973         function utilEntitySelector(ids) {
28974             return ids.length ? '.' + ids.join(',.') : 'nothing';
28975         }
28976
28977
28978         // returns an selector to select entity ids for:
28979         //  - entityIDs passed in
28980         //  - shallow descendant entityIDs for any of those entities that are relations
28981         function utilEntityOrMemberSelector(ids, graph) {
28982             var seen = new Set(ids);
28983             ids.forEach(collectShallowDescendants);
28984             return utilEntitySelector(Array.from(seen));
28985
28986             function collectShallowDescendants(id) {
28987                 var entity = graph.hasEntity(id);
28988                 if (!entity || entity.type !== 'relation') return;
28989
28990                 entity.members
28991                     .map(function(member) { return member.id; })
28992                     .forEach(function(id) { seen.add(id); });
28993             }
28994         }
28995
28996
28997         // returns an selector to select entity ids for:
28998         //  - entityIDs passed in
28999         //  - deep descendant entityIDs for any of those entities that are relations
29000         function utilEntityOrDeepMemberSelector(ids, graph) {
29001             var seen = new Set();
29002             ids.forEach(collectDeepDescendants);
29003             return utilEntitySelector(Array.from(seen));
29004
29005             function collectDeepDescendants(id) {
29006                 if (seen.has(id)) return;
29007                 seen.add(id);
29008
29009                 var entity = graph.hasEntity(id);
29010                 if (!entity || entity.type !== 'relation') return;
29011
29012                 entity.members
29013                     .map(function(member) { return member.id; })
29014                     .forEach(collectDeepDescendants);   // recurse
29015             }
29016         }
29017
29018
29019         // Adds or removes highlight styling for the specified entities
29020         function utilHighlightEntities(ids, highlighted, context) {
29021             context.surface()
29022                 .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
29023                 .classed('highlighted', highlighted);
29024         }
29025
29026
29027         // returns an Array that is the union of:
29028         //  - nodes for any nodeIDs passed in
29029         //  - child nodes of any wayIDs passed in
29030         //  - descendant member and child nodes of relationIDs passed in
29031         function utilGetAllNodes(ids, graph) {
29032             var seen = new Set();
29033             var nodes = new Set();
29034
29035             ids.forEach(collectNodes);
29036             return Array.from(nodes);
29037
29038             function collectNodes(id) {
29039                 if (seen.has(id)) return;
29040                 seen.add(id);
29041
29042                 var entity = graph.hasEntity(id);
29043                 if (!entity) return;
29044
29045                 if (entity.type === 'node') {
29046                     nodes.add(entity);
29047                 } else if (entity.type === 'way') {
29048                     entity.nodes.forEach(collectNodes);
29049                 } else {
29050                     entity.members
29051                         .map(function(member) { return member.id; })
29052                         .forEach(collectNodes);   // recurse
29053                 }
29054             }
29055         }
29056
29057
29058         function utilDisplayName(entity) {
29059             var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29060             var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29061             var network = entity.tags.cycle_network || entity.tags.network;
29062
29063             if (!name && entity.tags.ref) {
29064                 name = entity.tags.ref;
29065                 if (network) {
29066                     name = network + ' ' + name;
29067                 }
29068             }
29069
29070             return name;
29071         }
29072
29073
29074         function utilDisplayNameForPath(entity) {
29075             var name = utilDisplayName(entity);
29076             var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29077
29078             if (!isFirefox && name && rtlRegex.test(name)) {
29079                 name = fixRTLTextForSvg(name);
29080             }
29081
29082             return name;
29083         }
29084
29085
29086         function utilDisplayType(id) {
29087             return {
29088                 n: t('inspector.node'),
29089                 w: t('inspector.way'),
29090                 r: t('inspector.relation')
29091             }[id.charAt(0)];
29092         }
29093
29094
29095         function utilDisplayLabel(entity, context) {
29096             var displayName = utilDisplayName(entity);
29097             if (displayName) {
29098                 // use the display name if there is one
29099                 return displayName;
29100             }
29101             var preset = utilPreset(entity, context);
29102             if (preset && preset.name()) {
29103                 // use the preset name if there is a match
29104                 return preset.name();
29105             }
29106             // fallback to the display type (node/way/relation)
29107             return utilDisplayType(entity.id);
29108         }
29109
29110
29111         function utilPreset(entity, context) {
29112             return context.presets().match(entity, context.graph());
29113         }
29114
29115
29116         function utilEntityRoot(entityType) {
29117             return {
29118                 node: 'n',
29119                 way: 'w',
29120                 relation: 'r'
29121             }[entityType];
29122         }
29123
29124
29125         function utilStringQs(str) {
29126             return str.split('&').reduce(function(obj, pair){
29127                 var parts = pair.split('=');
29128                 if (parts.length === 2) {
29129                     obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29130                 }
29131                 return obj;
29132             }, {});
29133         }
29134
29135
29136         function utilQsString(obj, noencode) {
29137             // encode everything except special characters used in certain hash parameters:
29138             // "/" in map states, ":", ",", {" and "}" in background
29139             function softEncode(s) {
29140                 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29141             }
29142
29143             return Object.keys(obj).sort().map(function(key) {
29144                 return encodeURIComponent(key) + '=' + (
29145                     noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29146             }).join('&');
29147         }
29148
29149
29150         function utilPrefixDOMProperty(property) {
29151             var prefixes = ['webkit', 'ms', 'moz', 'o'];
29152             var i = -1;
29153             var n = prefixes.length;
29154             var s = document.body;
29155
29156             if (property in s)
29157                 return property;
29158
29159             property = property.substr(0, 1).toUpperCase() + property.substr(1);
29160
29161             while (++i < n) {
29162                 if (prefixes[i] + property in s) {
29163                     return prefixes[i] + property;
29164                 }
29165             }
29166
29167             return false;
29168         }
29169
29170
29171         function utilPrefixCSSProperty(property) {
29172             var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29173             var i = -1;
29174             var n = prefixes.length;
29175             var s = document.body.style;
29176
29177             if (property.toLowerCase() in s) {
29178                 return property.toLowerCase();
29179             }
29180
29181             while (++i < n) {
29182                 if (prefixes[i] + property in s) {
29183                     return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29184                 }
29185             }
29186
29187             return false;
29188         }
29189
29190
29191         var transformProperty;
29192         function utilSetTransform(el, x, y, scale) {
29193             var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29194             var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29195                 : 'translate3d(' + x + 'px,' + y + 'px,0)';
29196             return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29197         }
29198
29199
29200         // Calculates Levenshtein distance between two strings
29201         // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29202         // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29203         function utilEditDistance(a, b) {
29204             a = remove$1(a.toLowerCase());
29205             b = remove$1(b.toLowerCase());
29206             if (a.length === 0) return b.length;
29207             if (b.length === 0) return a.length;
29208             var matrix = [];
29209             for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
29210             for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
29211             for (i = 1; i <= b.length; i++) {
29212                 for (j = 1; j <= a.length; j++) {
29213                     if (b.charAt(i-1) === a.charAt(j-1)) {
29214                         matrix[i][j] = matrix[i-1][j-1];
29215                     } else {
29216                         matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
29217                             Math.min(matrix[i][j-1] + 1, // insertion
29218                             matrix[i-1][j] + 1)); // deletion
29219                     }
29220                 }
29221             }
29222             return matrix[b.length][a.length];
29223         }
29224
29225
29226         // a d3.mouse-alike which
29227         // 1. Only works on HTML elements, not SVG
29228         // 2. Does not cause style recalculation
29229         function utilFastMouse(container) {
29230             var rect = container.getBoundingClientRect();
29231             var rectLeft = rect.left;
29232             var rectTop = rect.top;
29233             var clientLeft = +container.clientLeft;
29234             var clientTop = +container.clientTop;
29235
29236             if (textDirection === 'rtl') {
29237                 rectLeft = 0;
29238             }
29239             return function(e) {
29240                 return [
29241                     e.clientX - rectLeft - clientLeft,
29242                     e.clientY - rectTop - clientTop];
29243             };
29244         }
29245
29246
29247         function utilAsyncMap(inputs, func, callback) {
29248             var remaining = inputs.length;
29249             var results = [];
29250             var errors = [];
29251
29252             inputs.forEach(function(d, i) {
29253                 func(d, function done(err, data) {
29254                     errors[i] = err;
29255                     results[i] = data;
29256                     remaining--;
29257                     if (!remaining) callback(errors, results);
29258                 });
29259             });
29260         }
29261
29262
29263         // wraps an index to an interval [0..length-1]
29264         function utilWrap(index, length) {
29265             if (index < 0) {
29266                 index += Math.ceil(-index/length)*length;
29267             }
29268             return index % length;
29269         }
29270
29271
29272         /**
29273          * a replacement for functor
29274          *
29275          * @param {*} value any value
29276          * @returns {Function} a function that returns that value or the value if it's a function
29277          */
29278         function utilFunctor(value) {
29279             if (typeof value === 'function') return value;
29280             return function() {
29281                 return value;
29282             };
29283         }
29284
29285
29286         function utilNoAuto(selection) {
29287             var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
29288
29289             return selection
29290                 // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
29291                 .attr('autocomplete', 'new-password')
29292                 .attr('autocorrect', 'off')
29293                 .attr('autocapitalize', 'off')
29294                 .attr('spellcheck', isText ? 'true' : 'false');
29295         }
29296
29297
29298         // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
29299         // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
29300         function utilHashcode(str) {
29301             var hash = 0;
29302             if (str.length === 0) {
29303                 return hash;
29304             }
29305             for (var i = 0; i < str.length; i++) {
29306                 var char = str.charCodeAt(i);
29307                 hash = ((hash << 5) - hash) + char;
29308                 hash = hash & hash; // Convert to 32bit integer
29309             }
29310             return hash;
29311         }
29312
29313         function utilCleanTags(tags) {
29314             var out = {};
29315             for (var k in tags) {
29316                 if (!k) continue;
29317                 var v = tags[k];
29318                 if (v !== undefined) {
29319                     out[k] = cleanValue(k, v);
29320                 }
29321             }
29322
29323             return out;
29324
29325
29326             function cleanValue(k, v) {
29327                 function keepSpaces(k) {
29328                     return /_hours|_times|:conditional$/.test(k);
29329                 }
29330
29331                 function skip(k) {
29332                     return /^(description|note|fixme)$/.test(k);
29333                 }
29334
29335                 if (skip(k)) return v;
29336
29337                 var cleaned = v
29338                     .split(';')
29339                     .map(function(s) { return s.trim(); })
29340                     .join(keepSpaces(k) ? '; ' : ';');
29341
29342                 // The code below is not intended to validate websites and emails.
29343                 // It is only intended to prevent obvious copy-paste errors. (#2323)
29344                 // clean website- and email-like tags
29345                 if (k.indexOf('website') !== -1 ||
29346                     k.indexOf('email') !== -1 ||
29347                     cleaned.indexOf('http') === 0) {
29348                     cleaned = cleaned
29349                         .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
29350
29351                 }
29352
29353                 return cleaned;
29354             }
29355         }
29356
29357         // Like selection.property('value', ...), but avoids no-op value sets,
29358         // which can result in layout/repaint thrashing in some situations.
29359         function utilGetSetValue(selection, value) {
29360             function d3_selection_value(value) {
29361                 function valueNull() {
29362                     delete this.value;
29363                 }
29364
29365                 function valueConstant() {
29366                     if (this.value !== value) {
29367                         this.value = value;
29368                     }
29369                 }
29370
29371                 function valueFunction() {
29372                     var x = value.apply(this, arguments);
29373                     if (x == null) {
29374                         delete this.value;
29375                     } else if (this.value !== x) {
29376                         this.value = x;
29377                     }
29378                 }
29379
29380                 return value == null
29381                     ? valueNull : (typeof value === 'function'
29382                     ? valueFunction : valueConstant);
29383             }
29384
29385             if (arguments.length === 1) {
29386                 return selection.property('value');
29387             }
29388
29389             return selection.each(d3_selection_value(value));
29390         }
29391
29392         function utilKeybinding(namespace) {
29393             var _keybindings = {};
29394
29395
29396             function testBindings(isCapturing) {
29397                 var didMatch = false;
29398                 var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
29399                 var i, binding;
29400
29401                 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29402                 // so we don't strictly match on the shift key, but we prioritize
29403                 // shifted keybindings first, and fallback to unshifted only if no match.
29404                 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29405
29406                 // priority match shifted keybindings first
29407                 for (i = 0; i < bindings.length; i++) {
29408                     binding = bindings[i];
29409                     if (!binding.event.modifiers.shiftKey) continue;  // no shift
29410                     if (!!binding.capture !== isCapturing) continue;
29411                     if (matches(binding, true)) {
29412                         binding.callback();
29413                         didMatch = true;
29414                     }
29415                 }
29416
29417                 // then unshifted keybindings
29418                 if (didMatch) return;
29419                 for (i = 0; i < bindings.length; i++) {
29420                     binding = bindings[i];
29421                     if (binding.event.modifiers.shiftKey) continue;   // shift
29422                     if (!!binding.capture !== isCapturing) continue;
29423                     if (matches(binding, false)) {
29424                         binding.callback();
29425                     }
29426                 }
29427
29428
29429                 function matches(binding, testShift) {
29430                     var event$1 = event;
29431                     var isMatch = false;
29432                     var tryKeyCode = true;
29433
29434                     // Prefer a match on `KeyboardEvent.key`
29435                     if (event$1.key !== undefined) {
29436                         tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29437                         isMatch = true;
29438
29439                         if (binding.event.key === undefined) {
29440                             isMatch = false;
29441                         } else if (Array.isArray(binding.event.key)) {
29442                             if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
29443                                 isMatch = false;
29444                         } else {
29445                             if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29446                                 isMatch = false;
29447                         }
29448                     }
29449
29450                     // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29451                     // - browser doesn't support `KeyboardEvent.key`
29452                     // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29453                     if (!isMatch && tryKeyCode) {
29454                         isMatch = (event$1.keyCode === binding.event.keyCode);
29455                     }
29456
29457                     if (!isMatch) return false;
29458
29459                     // test modifier keys
29460                     if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29461                         if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29462                         if (event$1.altKey !== binding.event.modifiers.altKey) return false;
29463                     }
29464                     if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
29465                     if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29466
29467                     return true;
29468                 }
29469             }
29470
29471
29472             function capture() {
29473                 testBindings(true);
29474             }
29475
29476
29477             function bubble() {
29478                 var tagName = d3_select(event.target).node().tagName;
29479                 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29480                     return;
29481                 }
29482                 testBindings(false);
29483             }
29484
29485
29486             function keybinding(selection) {
29487                 selection = selection || d3_select(document);
29488                 selection.on('keydown.capture.' + namespace, capture, true);
29489                 selection.on('keydown.bubble.' + namespace, bubble, false);
29490                 return keybinding;
29491             }
29492
29493             // was: keybinding.off()
29494             keybinding.unbind = function(selection) {
29495                 _keybindings = [];
29496                 selection = selection || d3_select(document);
29497                 selection.on('keydown.capture.' + namespace, null);
29498                 selection.on('keydown.bubble.' + namespace, null);
29499                 return keybinding;
29500             };
29501
29502
29503             keybinding.clear = function() {
29504                 _keybindings = {};
29505                 return keybinding;
29506             };
29507
29508
29509             // Remove one or more keycode bindings.
29510             keybinding.off = function(codes, capture) {
29511                 var arr = utilArrayUniq([].concat(codes));
29512
29513                 for (var i = 0; i < arr.length; i++) {
29514                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29515                     delete _keybindings[id];
29516                 }
29517                 return keybinding;
29518             };
29519
29520
29521             // Add one or more keycode bindings.
29522             keybinding.on = function(codes, callback, capture) {
29523                 if (typeof callback !== 'function') {
29524                     return keybinding.off(codes, capture);
29525                 }
29526
29527                 var arr = utilArrayUniq([].concat(codes));
29528
29529                 for (var i = 0; i < arr.length; i++) {
29530                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29531                     var binding = {
29532                         id: id,
29533                         capture: capture,
29534                         callback: callback,
29535                         event: {
29536                             key: undefined,  // preferred
29537                             keyCode: 0,      // fallback
29538                             modifiers: {
29539                                 shiftKey: false,
29540                                 ctrlKey: false,
29541                                 altKey: false,
29542                                 metaKey: false
29543                             }
29544                         }
29545                     };
29546
29547                     if (_keybindings[id]) {
29548                         console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
29549                     }
29550
29551                     _keybindings[id] = binding;
29552
29553                     var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29554                     for (var j = 0; j < matches.length; j++) {
29555                         // Normalise matching errors
29556                         if (matches[j] === '++') matches[j] = '+';
29557
29558                         if (matches[j] in utilKeybinding.modifierCodes) {
29559                             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
29560                             binding.event.modifiers[prop] = true;
29561                         } else {
29562                             binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
29563                             if (matches[j] in utilKeybinding.keyCodes) {
29564                                 binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
29565                             }
29566                         }
29567                     }
29568                 }
29569
29570                 return keybinding;
29571             };
29572
29573
29574             return keybinding;
29575         }
29576
29577
29578         /*
29579          * See https://github.com/keithamus/jwerty
29580          */
29581
29582         utilKeybinding.modifierCodes = {
29583             // Shift key, ⇧
29584             '⇧': 16, shift: 16,
29585             // CTRL key, on Mac: ⌃
29586             '⌃': 17, ctrl: 17,
29587             // ALT key, on Mac: ⌥ (Alt)
29588             '⌥': 18, alt: 18, option: 18,
29589             // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29590             '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29591         };
29592
29593         utilKeybinding.modifierProperties = {
29594             16: 'shiftKey',
29595             17: 'ctrlKey',
29596             18: 'altKey',
29597             91: 'metaKey'
29598         };
29599
29600         utilKeybinding.keys = {
29601             // Backspace key, on Mac: ⌫ (Backspace)
29602             '⌫': 'Backspace', backspace: 'Backspace',
29603             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29604             '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29605             // Return key, ↩
29606             '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29607             // Pause/Break key
29608             'pause': 'Pause', 'pause-break': 'Pause',
29609             // Caps Lock key, ⇪
29610             '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29611             // Escape key, on Mac: ⎋, on Windows: Esc
29612             '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29613             // Space key
29614             space: [' ', 'Spacebar'],
29615             // Page-Up key, or pgup, on Mac: ↖
29616             '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29617             // Page-Down key, or pgdown, on Mac: ↘
29618             '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29619             // END key, on Mac: ⇟
29620             '⇟': 'End', end: 'End',
29621             // HOME key, on Mac: ⇞
29622             '⇞': 'Home', home: 'Home',
29623             // Insert key, or ins
29624             ins: 'Insert', insert: 'Insert',
29625             // Delete key, on Mac: ⌦ (Delete)
29626             '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29627             // Left Arrow Key, or ←
29628             '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29629             // Up Arrow Key, or ↑
29630             '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29631             // Right Arrow Key, or →
29632             '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29633             // Up Arrow Key, or ↓
29634             '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29635             // odities, stuff for backward compatibility (browsers and code):
29636             // Num-Multiply, or *
29637             '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29638             // Num-Plus or +
29639             '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29640             // Num-Subtract, or -
29641             '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29642             // Semicolon
29643             semicolon: ';',
29644             // = or equals
29645             equals: '=',
29646             // Comma, or ,
29647             comma: ',',
29648             // Period, or ., or full-stop
29649             period: '.', 'full-stop': '.',
29650             // Slash, or /, or forward-slash
29651             slash: '/', 'forward-slash': '/',
29652             // Tick, or `, or back-quote
29653             tick: '`', 'back-quote': '`',
29654             // Open bracket, or [
29655             'open-bracket': '[',
29656             // Back slash, or \
29657             'back-slash': '\\',
29658             // Close backet, or ]
29659             'close-bracket': ']',
29660             // Apostrophe, or Quote, or '
29661             quote: '\'', apostrophe: '\'',
29662             // NUMPAD 0-9
29663             'num-0': '0',
29664             'num-1': '1',
29665             'num-2': '2',
29666             'num-3': '3',
29667             'num-4': '4',
29668             'num-5': '5',
29669             'num-6': '6',
29670             'num-7': '7',
29671             'num-8': '8',
29672             'num-9': '9',
29673             // F1-F25
29674             f1: 'F1',
29675             f2: 'F2',
29676             f3: 'F3',
29677             f4: 'F4',
29678             f5: 'F5',
29679             f6: 'F6',
29680             f7: 'F7',
29681             f8: 'F8',
29682             f9: 'F9',
29683             f10: 'F10',
29684             f11: 'F11',
29685             f12: 'F12',
29686             f13: 'F13',
29687             f14: 'F14',
29688             f15: 'F15',
29689             f16: 'F16',
29690             f17: 'F17',
29691             f18: 'F18',
29692             f19: 'F19',
29693             f20: 'F20',
29694             f21: 'F21',
29695             f22: 'F22',
29696             f23: 'F23',
29697             f24: 'F24',
29698             f25: 'F25'
29699         };
29700
29701         utilKeybinding.keyCodes = {
29702             // Backspace key, on Mac: ⌫ (Backspace)
29703             '⌫': 8, backspace: 8,
29704             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29705             '⇥': 9, '⇆': 9, tab: 9,
29706             // Return key, ↩
29707             '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29708             // Pause/Break key
29709             'pause': 19, 'pause-break': 19,
29710             // Caps Lock key, ⇪
29711             '⇪': 20, caps: 20, 'caps-lock': 20,
29712             // Escape key, on Mac: ⎋, on Windows: Esc
29713             '⎋': 27, escape: 27, esc: 27,
29714             // Space key
29715             space: 32,
29716             // Page-Up key, or pgup, on Mac: ↖
29717             '↖': 33, pgup: 33, 'page-up': 33,
29718             // Page-Down key, or pgdown, on Mac: ↘
29719             '↘': 34, pgdown: 34, 'page-down': 34,
29720             // END key, on Mac: ⇟
29721             '⇟': 35, end: 35,
29722             // HOME key, on Mac: ⇞
29723             '⇞': 36, home: 36,
29724             // Insert key, or ins
29725             ins: 45, insert: 45,
29726             // Delete key, on Mac: ⌦ (Delete)
29727             '⌦': 46, del: 46, 'delete': 46,
29728             // Left Arrow Key, or ←
29729             '←': 37, left: 37, 'arrow-left': 37,
29730             // Up Arrow Key, or ↑
29731             '↑': 38, up: 38, 'arrow-up': 38,
29732             // Right Arrow Key, or →
29733             '→': 39, right: 39, 'arrow-right': 39,
29734             // Up Arrow Key, or ↓
29735             '↓': 40, down: 40, 'arrow-down': 40,
29736             // odities, printing characters that come out wrong:
29737             // Firefox Equals
29738             'ffequals': 61,
29739             // Num-Multiply, or *
29740             '*': 106, star: 106, asterisk: 106, multiply: 106,
29741             // Num-Plus or +
29742             '+': 107, 'plus': 107,
29743             // Num-Subtract, or -
29744             '-': 109, subtract: 109,
29745             // Firefox Plus
29746             'ffplus': 171,
29747             // Firefox Minus
29748             'ffminus': 173,
29749             // Semicolon
29750             ';': 186, semicolon: 186,
29751             // = or equals
29752             '=': 187, 'equals': 187,
29753             // Comma, or ,
29754             ',': 188, comma: 188,
29755             // Dash / Underscore key
29756             'dash': 189,
29757             // Period, or ., or full-stop
29758             '.': 190, period: 190, 'full-stop': 190,
29759             // Slash, or /, or forward-slash
29760             '/': 191, slash: 191, 'forward-slash': 191,
29761             // Tick, or `, or back-quote
29762             '`': 192, tick: 192, 'back-quote': 192,
29763             // Open bracket, or [
29764             '[': 219, 'open-bracket': 219,
29765             // Back slash, or \
29766             '\\': 220, 'back-slash': 220,
29767             // Close backet, or ]
29768             ']': 221, 'close-bracket': 221,
29769             // Apostrophe, or Quote, or '
29770             '\'': 222, quote: 222, apostrophe: 222
29771         };
29772
29773         // NUMPAD 0-9
29774         var i$2 = 95, n = 0;
29775         while (++i$2 < 106) {
29776             utilKeybinding.keyCodes['num-' + n] = i$2;
29777             ++n;
29778         }
29779
29780         // 0-9
29781         i$2 = 47; n = 0;
29782         while (++i$2 < 58) {
29783             utilKeybinding.keyCodes[n] = i$2;
29784             ++n;
29785         }
29786
29787         // F1-F25
29788         i$2 = 111; n = 1;
29789         while (++i$2 < 136) {
29790             utilKeybinding.keyCodes['f' + n] = i$2;
29791             ++n;
29792         }
29793
29794         // a-z
29795         i$2 = 64;
29796         while (++i$2 < 91) {
29797             utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2;
29798         }
29799
29800         function utilObjectOmit(obj, omitKeys) {
29801             return Object.keys(obj).reduce(function(result, key) {
29802                 if (omitKeys.indexOf(key) === -1) {
29803                     result[key] = obj[key];  // keep
29804                 }
29805                 return result;
29806             }, {});
29807         }
29808
29809         // Copies a variable number of methods from source to target.
29810         function utilRebind(target, source) {
29811             var i = 1, n = arguments.length, method;
29812             while (++i < n) {
29813                 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
29814             }
29815             return target;
29816         }
29817
29818         // Method is assumed to be a standard D3 getter-setter:
29819         // If passed with no arguments, gets the value.
29820         // If passed with arguments, sets the value and returns the target.
29821         function d3_rebind(target, source, method) {
29822             return function() {
29823                 var value = method.apply(source, arguments);
29824                 return value === source ? target : value;
29825             };
29826         }
29827
29828         // A per-domain session mutex backed by a cookie and dead man's
29829         // switch. If the session crashes, the mutex will auto-release
29830         // after 5 seconds.
29831
29832         // This accepts a string and returns an object that complies with utilSessionMutexType
29833         function utilSessionMutex(name) {
29834             var mutex = {};
29835             var intervalID;
29836
29837             function renew() {
29838                 var expires = new Date();
29839                 expires.setSeconds(expires.getSeconds() + 5);
29840                 document.cookie = name + '=1; expires=' + expires.toUTCString();
29841             }
29842
29843             mutex.lock = function () {
29844                 if (intervalID) return true;
29845                 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
29846                 if (cookie) return false;
29847                 renew();
29848                 intervalID = window.setInterval(renew, 4000);
29849                 return true;
29850             };
29851
29852             mutex.unlock = function () {
29853                 if (!intervalID) return;
29854                 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
29855                 clearInterval(intervalID);
29856                 intervalID = null;
29857             };
29858
29859             mutex.locked = function () {
29860                 return !!intervalID;
29861             };
29862
29863             return mutex;
29864         }
29865
29866         function utilTiler() {
29867             var _size = [256, 256];
29868             var _scale = 256;
29869             var _tileSize = 256;
29870             var _zoomExtent = [0, 20];
29871             var _translate = [_size[0] / 2, _size[1] / 2];
29872             var _margin = 0;
29873             var _skipNullIsland = false;
29874
29875
29876             function clamp(num, min, max) {
29877                 return Math.max(min, Math.min(num, max));
29878             }
29879
29880
29881             function nearNullIsland(tile) {
29882                 var x = tile[0];
29883                 var y = tile[1];
29884                 var z = tile[2];
29885                 if (z >= 7) {
29886                     var center = Math.pow(2, z - 1);
29887                     var width = Math.pow(2, z - 6);
29888                     var min = center - (width / 2);
29889                     var max = center + (width / 2) - 1;
29890                     return x >= min && x <= max && y >= min && y <= max;
29891                 }
29892                 return false;
29893             }
29894
29895
29896             function tiler() {
29897                 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
29898                 var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
29899                 var tileMin = 0;
29900                 var tileMax = Math.pow(2, z0) - 1;
29901                 var log2ts = Math.log(_tileSize) * Math.LOG2E;
29902                 var k = Math.pow(2, z - z0 + log2ts);
29903                 var origin = [
29904                     (_translate[0] - _scale / 2) / k,
29905                     (_translate[1] - _scale / 2) / k
29906                 ];
29907
29908                 var cols = d3_range(
29909                     clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
29910                     clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
29911                 );
29912                 var rows = d3_range(
29913                     clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
29914                     clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
29915                 );
29916
29917                 var tiles = [];
29918                 for (var i = 0; i < rows.length; i++) {
29919                     var y = rows[i];
29920                     for (var j = 0; j < cols.length; j++) {
29921                         var x = cols[j];
29922
29923                         if (i >= _margin && i <= rows.length - _margin &&
29924                             j >= _margin && j <= cols.length - _margin) {
29925                             tiles.unshift([x, y, z0]);  // tiles in view at beginning
29926                         } else {
29927                             tiles.push([x, y, z0]);     // tiles in margin at the end
29928                         }
29929                     }
29930                 }
29931
29932                 tiles.translate = origin;
29933                 tiles.scale = k;
29934
29935                 return tiles;
29936             }
29937
29938
29939             /**
29940              * getTiles() returns an array of tiles that cover the map view
29941              */
29942             tiler.getTiles = function(projection) {
29943                 var origin = [
29944                     projection.scale() * Math.PI - projection.translate()[0],
29945                     projection.scale() * Math.PI - projection.translate()[1]
29946                 ];
29947
29948                 this
29949                     .size(projection.clipExtent()[1])
29950                     .scale(projection.scale() * 2 * Math.PI)
29951                     .translate(projection.translate());
29952
29953                 var tiles = tiler();
29954                 var ts = tiles.scale;
29955
29956                 return tiles
29957                     .map(function(tile) {
29958                         if (_skipNullIsland && nearNullIsland(tile)) {
29959                             return false;
29960                         }
29961                         var x = tile[0] * ts - origin[0];
29962                         var y = tile[1] * ts - origin[1];
29963                         return {
29964                             id: tile.toString(),
29965                             xyz: tile,
29966                             extent: geoExtent(
29967                                 projection.invert([x, y + ts]),
29968                                 projection.invert([x + ts, y])
29969                             )
29970                         };
29971                     }).filter(Boolean);
29972             };
29973
29974
29975             /**
29976              * getGeoJSON() returns a FeatureCollection for debugging tiles
29977              */
29978             tiler.getGeoJSON = function(projection) {
29979                 var features = tiler.getTiles(projection).map(function(tile) {
29980                     return {
29981                         type: 'Feature',
29982                         properties: {
29983                             id: tile.id,
29984                             name: tile.id
29985                         },
29986                         geometry: {
29987                             type: 'Polygon',
29988                             coordinates: [ tile.extent.polygon() ]
29989                         }
29990                     };
29991                 });
29992
29993                 return {
29994                     type: 'FeatureCollection',
29995                     features: features
29996                 };
29997             };
29998
29999
30000             tiler.tileSize = function(val) {
30001                 if (!arguments.length) return _tileSize;
30002                 _tileSize = val;
30003                 return tiler;
30004             };
30005
30006
30007             tiler.zoomExtent = function(val) {
30008                 if (!arguments.length) return _zoomExtent;
30009                 _zoomExtent = val;
30010                 return tiler;
30011             };
30012
30013
30014             tiler.size = function(val) {
30015                 if (!arguments.length) return _size;
30016                 _size = val;
30017                 return tiler;
30018             };
30019
30020
30021             tiler.scale = function(val) {
30022                 if (!arguments.length) return _scale;
30023                 _scale = val;
30024                 return tiler;
30025             };
30026
30027
30028             tiler.translate = function(val) {
30029                 if (!arguments.length) return _translate;
30030                 _translate = val;
30031                 return tiler;
30032             };
30033
30034
30035             // number to extend the rows/columns beyond those covering the viewport
30036             tiler.margin = function(val) {
30037                 if (!arguments.length) return _margin;
30038                 _margin = +val;
30039                 return tiler;
30040             };
30041
30042
30043             tiler.skipNullIsland = function(val) {
30044                 if (!arguments.length) return _skipNullIsland;
30045                 _skipNullIsland = val;
30046                 return tiler;
30047             };
30048
30049
30050             return tiler;
30051         }
30052
30053         function utilTriggerEvent(target, type) {
30054             target.each(function() {
30055                 var evt = document.createEvent('HTMLEvents');
30056                 evt.initEvent(type, true, true);
30057                 this.dispatchEvent(evt);
30058             });
30059         }
30060
30061         function osmEntity(attrs) {
30062             // For prototypal inheritance.
30063             if (this instanceof osmEntity) return;
30064
30065             // Create the appropriate subtype.
30066             if (attrs && attrs.type) {
30067                 return osmEntity[attrs.type].apply(this, arguments);
30068             } else if (attrs && attrs.id) {
30069                 return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
30070             }
30071
30072             // Initialize a generic Entity (used only in tests).
30073             return (new osmEntity()).initialize(arguments);
30074         }
30075
30076
30077         osmEntity.id = function(type) {
30078             return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
30079         };
30080
30081
30082         osmEntity.id.next = {
30083             changeset: -1, node: -1, way: -1, relation: -1
30084         };
30085
30086
30087         osmEntity.id.fromOSM = function(type, id) {
30088             return type[0] + id;
30089         };
30090
30091
30092         osmEntity.id.toOSM = function(id) {
30093             return id.slice(1);
30094         };
30095
30096
30097         osmEntity.id.type = function(id) {
30098             return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
30099         };
30100
30101
30102         // A function suitable for use as the second argument to d3.selection#data().
30103         osmEntity.key = function(entity) {
30104             return entity.id + 'v' + (entity.v || 0);
30105         };
30106
30107         var _deprecatedTagValuesByKey;
30108
30109         osmEntity.deprecatedTagValuesByKey = function() {
30110             if (!_deprecatedTagValuesByKey) {
30111                 _deprecatedTagValuesByKey = {};
30112                 dataDeprecated.forEach(function(d) {
30113                     var oldKeys = Object.keys(d.old);
30114                     if (oldKeys.length === 1) {
30115                         var oldKey = oldKeys[0];
30116                         var oldValue = d.old[oldKey];
30117                         if (oldValue !== '*') {
30118                             if (!_deprecatedTagValuesByKey[oldKey]) {
30119                                 _deprecatedTagValuesByKey[oldKey] = [oldValue];
30120                             } else {
30121                                 _deprecatedTagValuesByKey[oldKey].push(oldValue);
30122                             }
30123                         }
30124                     }
30125                 });
30126             }
30127             return _deprecatedTagValuesByKey;
30128         };
30129
30130
30131         osmEntity.prototype = {
30132
30133             tags: {},
30134
30135
30136             initialize: function(sources) {
30137                 for (var i = 0; i < sources.length; ++i) {
30138                     var source = sources[i];
30139                     for (var prop in source) {
30140                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
30141                             if (source[prop] === undefined) {
30142                                 delete this[prop];
30143                             } else {
30144                                 this[prop] = source[prop];
30145                             }
30146                         }
30147                     }
30148                 }
30149
30150                 if (!this.id && this.type) {
30151                     this.id = osmEntity.id(this.type);
30152                 }
30153                 if (!this.hasOwnProperty('visible')) {
30154                     this.visible = true;
30155                 }
30156
30157                 return this;
30158             },
30159
30160
30161             copy: function(resolver, copies) {
30162                 if (copies[this.id])
30163                     return copies[this.id];
30164
30165                 var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
30166                 copies[this.id] = copy;
30167
30168                 return copy;
30169             },
30170
30171
30172             osmId: function() {
30173                 return osmEntity.id.toOSM(this.id);
30174             },
30175
30176
30177             isNew: function() {
30178                 return this.osmId() < 0;
30179             },
30180
30181
30182             update: function(attrs) {
30183                 return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
30184             },
30185
30186
30187             mergeTags: function(tags) {
30188                 var merged = Object.assign({}, this.tags);   // shallow copy
30189                 var changed = false;
30190                 for (var k in tags) {
30191                     var t1 = merged[k];
30192                     var t2 = tags[k];
30193                     if (!t1) {
30194                         changed = true;
30195                         merged[k] = t2;
30196                     } else if (t1 !== t2) {
30197                         changed = true;
30198                         merged[k] = utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
30199                     }
30200                 }
30201                 return changed ? this.update({ tags: merged }) : this;
30202             },
30203
30204
30205             intersects: function(extent, resolver) {
30206                 return this.extent(resolver).intersects(extent);
30207             },
30208
30209
30210             hasNonGeometryTags: function() {
30211                 return Object.keys(this.tags).some(function(k) { return k !== 'area'; });
30212             },
30213
30214             hasParentRelations: function(resolver) {
30215                 return resolver.parentRelations(this).length > 0;
30216             },
30217
30218             hasInterestingTags: function() {
30219                 return Object.keys(this.tags).some(osmIsInterestingTag);
30220             },
30221
30222             hasWikidata: function() {
30223                 return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
30224             },
30225
30226             isHighwayIntersection: function() {
30227                 return false;
30228             },
30229
30230             isDegenerate: function() {
30231                 return true;
30232             },
30233
30234             deprecatedTags: function() {
30235                 var tags = this.tags;
30236
30237                 // if there are no tags, none can be deprecated
30238                 if (Object.keys(tags).length === 0) return [];
30239
30240                 var deprecated = [];
30241                 dataDeprecated.forEach(function(d) {
30242                     var matchesDeprecatedTags = Object.keys(d.old).every(function(key) {
30243                         if (!tags[key]) return false;
30244                         if (d.old[key] === '*') return true;
30245
30246                         var vals = tags[key].split(';').filter(Boolean);
30247                         if (vals.length === 0) {
30248                             return false;
30249                         } else if (vals.length > 1) {
30250                             return vals.indexOf(d.old[key]) !== -1;
30251                         } else {
30252                             if (tags[key] === d.old[key]) {
30253                                 if (d.old[key] === d.replace[key]) {
30254                                     return !Object.keys(d.replace).every(function(key) {
30255                                         return tags[key] === d.replace[key];
30256                                     });
30257                                 } else {
30258                                     return true;
30259                                 }
30260                             }
30261                         }
30262                         return false;
30263                     });
30264                     if (matchesDeprecatedTags) {
30265                         deprecated.push(d);
30266                     }
30267                 });
30268
30269                 return deprecated;
30270             }
30271         };
30272
30273         function osmLanes(entity) {
30274             if (entity.type !== 'way') return null;
30275             if (!entity.tags.highway) return null;
30276
30277             var tags = entity.tags;
30278             var isOneWay = entity.isOneWay();
30279             var laneCount = getLaneCount(tags, isOneWay);
30280             var maxspeed = parseMaxspeed(tags);
30281
30282             var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
30283             var forward = laneDirections.forward;
30284             var backward = laneDirections.backward;
30285             var bothways = laneDirections.bothways;
30286
30287             // parse the piped string 'x|y|z' format
30288             var turnLanes = {};
30289             turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
30290             turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
30291             turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
30292
30293             var maxspeedLanes = {};
30294             maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
30295             maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
30296             maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
30297
30298             var psvLanes = {};
30299             psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
30300             psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
30301             psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
30302
30303             var busLanes = {};
30304             busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
30305             busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
30306             busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
30307
30308             var taxiLanes = {};
30309             taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
30310             taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
30311             taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
30312
30313             var hovLanes = {};
30314             hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
30315             hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
30316             hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
30317
30318             var hgvLanes = {};
30319             hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
30320             hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
30321             hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
30322
30323             var bicyclewayLanes = {};
30324             bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
30325             bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
30326             bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
30327
30328             var lanesObj = {
30329                 forward: [],
30330                 backward: [],
30331                 unspecified: []
30332             };
30333
30334             // map forward/backward/unspecified of each lane type to lanesObj
30335             mapToLanesObj(lanesObj, turnLanes, 'turnLane');
30336             mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
30337             mapToLanesObj(lanesObj, psvLanes, 'psv');
30338             mapToLanesObj(lanesObj, busLanes, 'bus');
30339             mapToLanesObj(lanesObj, taxiLanes, 'taxi');
30340             mapToLanesObj(lanesObj, hovLanes, 'hov');
30341             mapToLanesObj(lanesObj, hgvLanes, 'hgv');
30342             mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
30343
30344             return {
30345                 metadata: {
30346                     count: laneCount,
30347                     oneway: isOneWay,
30348                     forward: forward,
30349                     backward: backward,
30350                     bothways: bothways,
30351                     turnLanes: turnLanes,
30352                     maxspeed: maxspeed,
30353                     maxspeedLanes: maxspeedLanes,
30354                     psvLanes: psvLanes,
30355                     busLanes: busLanes,
30356                     taxiLanes: taxiLanes,
30357                     hovLanes: hovLanes,
30358                     hgvLanes: hgvLanes,
30359                     bicyclewayLanes: bicyclewayLanes
30360                 },
30361                 lanes: lanesObj
30362             };
30363         }
30364
30365
30366         function getLaneCount(tags, isOneWay) {
30367             var count;
30368             if (tags.lanes) {
30369                 count = parseInt(tags.lanes, 10);
30370                 if (count > 0) {
30371                     return count;
30372                 }
30373             }
30374
30375
30376             switch (tags.highway) {
30377                 case 'trunk':
30378                 case 'motorway':
30379                     count = isOneWay ? 2 : 4;
30380                     break;
30381                 default:
30382                     count = isOneWay ? 1 : 2;
30383                     break;
30384             }
30385
30386             return count;
30387         }
30388
30389
30390         function parseMaxspeed(tags) {
30391             var maxspeed = tags.maxspeed;
30392             if (!maxspeed) return;
30393
30394             var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
30395             if (!maxspeedRegex.test(maxspeed)) return;
30396
30397             return parseInt(maxspeed, 10);
30398         }
30399
30400
30401         function parseLaneDirections(tags, isOneWay, laneCount) {
30402             var forward = parseInt(tags['lanes:forward'], 10);
30403             var backward = parseInt(tags['lanes:backward'], 10);
30404             var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
30405
30406             if (parseInt(tags.oneway, 10) === -1) {
30407                 forward = 0;
30408                 bothways = 0;
30409                 backward = laneCount;
30410             }
30411             else if (isOneWay) {
30412                 forward = laneCount;
30413                 bothways = 0;
30414                 backward = 0;
30415             }
30416             else if (isNaN(forward) && isNaN(backward)) {
30417                 backward = Math.floor((laneCount - bothways) / 2);
30418                 forward = laneCount - bothways - backward;
30419             }
30420             else if (isNaN(forward)) {
30421                 if (backward > laneCount - bothways) {
30422                     backward = laneCount - bothways;
30423                 }
30424                 forward = laneCount - bothways - backward;
30425             }
30426             else if (isNaN(backward)) {
30427                 if (forward > laneCount - bothways) {
30428                     forward = laneCount - bothways;
30429                 }
30430                 backward = laneCount - bothways - forward;
30431             }
30432             return {
30433                 forward: forward,
30434                 backward: backward,
30435                 bothways: bothways
30436             };
30437         }
30438
30439
30440         function parseTurnLanes(tag){
30441             if (!tag) return;
30442
30443             var validValues = [
30444                 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
30445                 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
30446             ];
30447
30448             return tag.split('|')
30449                 .map(function (s) {
30450                     if (s === '') s = 'none';
30451                     return s.split(';')
30452                         .map(function (d) {
30453                             return validValues.indexOf(d) === -1 ? 'unknown': d;
30454                         });
30455                 });
30456         }
30457
30458
30459         function parseMaxspeedLanes(tag, maxspeed) {
30460             if (!tag) return;
30461
30462             return tag.split('|')
30463                 .map(function (s) {
30464                     if (s === 'none') return s;
30465                     var m = parseInt(s, 10);
30466                     if (s === '' || m === maxspeed) return null;
30467                     return isNaN(m) ? 'unknown': m;
30468                 });
30469         }
30470
30471
30472         function parseMiscLanes(tag) {
30473             if (!tag) return;
30474
30475             var validValues = [
30476                 'yes', 'no', 'designated'
30477             ];
30478
30479             return tag.split('|')
30480                 .map(function (s) {
30481                     if (s === '') s = 'no';
30482                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30483                 });
30484         }
30485
30486
30487         function parseBicycleWay(tag) {
30488             if (!tag) return;
30489
30490             var validValues = [
30491                 'yes', 'no', 'designated', 'lane'
30492             ];
30493
30494             return tag.split('|')
30495                 .map(function (s) {
30496                     if (s === '') s = 'no';
30497                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30498                 });
30499         }
30500
30501
30502         function mapToLanesObj(lanesObj, data, key) {
30503             if (data.forward) data.forward.forEach(function(l, i) {
30504                 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
30505                 lanesObj.forward[i][key] = l;
30506             });
30507             if (data.backward) data.backward.forEach(function(l, i) {
30508                 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
30509                 lanesObj.backward[i][key] = l;
30510             });
30511             if (data.unspecified) data.unspecified.forEach(function(l, i) {
30512                 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
30513                 lanesObj.unspecified[i][key] = l;
30514             });
30515         }
30516
30517         function osmWay() {
30518             if (!(this instanceof osmWay)) {
30519                 return (new osmWay()).initialize(arguments);
30520             } else if (arguments.length) {
30521                 this.initialize(arguments);
30522             }
30523         }
30524
30525
30526         osmEntity.way = osmWay;
30527
30528         osmWay.prototype = Object.create(osmEntity.prototype);
30529
30530
30531         Object.assign(osmWay.prototype, {
30532             type: 'way',
30533             nodes: [],
30534
30535
30536             copy: function(resolver, copies) {
30537                 if (copies[this.id]) return copies[this.id];
30538
30539                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
30540
30541                 var nodes = this.nodes.map(function(id) {
30542                     return resolver.entity(id).copy(resolver, copies).id;
30543                 });
30544
30545                 copy = copy.update({ nodes: nodes });
30546                 copies[this.id] = copy;
30547
30548                 return copy;
30549             },
30550
30551
30552             extent: function(resolver) {
30553                 return resolver.transient(this, 'extent', function() {
30554                     var extent = geoExtent();
30555                     for (var i = 0; i < this.nodes.length; i++) {
30556                         var node = resolver.hasEntity(this.nodes[i]);
30557                         if (node) {
30558                             extent._extend(node.extent());
30559                         }
30560                     }
30561                     return extent;
30562                 });
30563             },
30564
30565
30566             first: function() {
30567                 return this.nodes[0];
30568             },
30569
30570
30571             last: function() {
30572                 return this.nodes[this.nodes.length - 1];
30573             },
30574
30575
30576             contains: function(node) {
30577                 return this.nodes.indexOf(node) >= 0;
30578             },
30579
30580
30581             affix: function(node) {
30582                 if (this.nodes[0] === node) return 'prefix';
30583                 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
30584             },
30585
30586
30587             layer: function() {
30588                 // explicit layer tag, clamp between -10, 10..
30589                 if (isFinite(this.tags.layer)) {
30590                     return Math.max(-10, Math.min(+(this.tags.layer), 10));
30591                 }
30592
30593                 // implied layer tag..
30594                 if (this.tags.covered === 'yes') return -1;
30595                 if (this.tags.location === 'overground') return 1;
30596                 if (this.tags.location === 'underground') return -1;
30597                 if (this.tags.location === 'underwater') return -10;
30598
30599                 if (this.tags.power === 'line') return 10;
30600                 if (this.tags.power === 'minor_line') return 10;
30601                 if (this.tags.aerialway) return 10;
30602                 if (this.tags.bridge) return 1;
30603                 if (this.tags.cutting) return -1;
30604                 if (this.tags.tunnel) return -1;
30605                 if (this.tags.waterway) return -1;
30606                 if (this.tags.man_made === 'pipeline') return -10;
30607                 if (this.tags.boundary) return -10;
30608                 return 0;
30609             },
30610
30611
30612             isOneWay: function() {
30613                 // explicit oneway tag..
30614                 var values = {
30615                     'yes': true,
30616                     '1': true,
30617                     '-1': true,
30618                     'reversible': true,
30619                     'alternating': true,
30620                     'no': false,
30621                     '0': false
30622                 };
30623                 if (values[this.tags.oneway] !== undefined) {
30624                     return values[this.tags.oneway];
30625                 }
30626
30627                 // implied oneway tag..
30628                 for (var key in this.tags) {
30629                     if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
30630                         return true;
30631                 }
30632                 return false;
30633             },
30634
30635             // Some identifier for tag that implies that this way is "sided",
30636             // i.e. the right side is the 'inside' (e.g. the right side of a
30637             // natural=cliff is lower).
30638             sidednessIdentifier: function() {
30639                 for (var key in this.tags) {
30640                     var value = this.tags[key];
30641                     if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
30642                         if (osmRightSideIsInsideTags[key][value] === true) {
30643                             return key;
30644                         } else {
30645                             // if the map's value is something other than a
30646                             // literal true, we should use it so we can
30647                             // special case some keys (e.g. natural=coastline
30648                             // is handled differently to other naturals).
30649                             return osmRightSideIsInsideTags[key][value];
30650                         }
30651                     }
30652                 }
30653
30654                 return null;
30655             },
30656
30657             isSided: function() {
30658                 if (this.tags.two_sided === 'yes') {
30659                     return false;
30660                 }
30661
30662                 return this.sidednessIdentifier() !== null;
30663             },
30664
30665             lanes: function() {
30666                 return osmLanes(this);
30667             },
30668
30669
30670             isClosed: function() {
30671                 return this.nodes.length > 1 && this.first() === this.last();
30672             },
30673
30674
30675             isConvex: function(resolver) {
30676                 if (!this.isClosed() || this.isDegenerate()) return null;
30677
30678                 var nodes = utilArrayUniq(resolver.childNodes(this));
30679                 var coords = nodes.map(function(n) { return n.loc; });
30680                 var curr = 0;
30681                 var prev = 0;
30682
30683                 for (var i = 0; i < coords.length; i++) {
30684                     var o = coords[(i+1) % coords.length];
30685                     var a = coords[i];
30686                     var b = coords[(i+2) % coords.length];
30687                     var res = geoVecCross(a, b, o);
30688
30689                     curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
30690                     if (curr === 0) {
30691                         continue;
30692                     } else if (prev && curr !== prev) {
30693                         return false;
30694                     }
30695                     prev = curr;
30696                 }
30697                 return true;
30698             },
30699
30700             // returns an object with the tag that implies this is an area, if any
30701             tagSuggestingArea: function() {
30702                 if (this.tags.area === 'yes') return { area: 'yes' };
30703                 if (this.tags.area === 'no') return null;
30704
30705                 // `highway` and `railway` are typically linear features, but there
30706                 // are a few exceptions that should be treated as areas, even in the
30707                 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
30708                 var lineKeys = {
30709                     highway: {
30710                         rest_area: true,
30711                         services: true
30712                     },
30713                     railway: {
30714                         roundhouse: true,
30715                         station: true,
30716                         traverser: true,
30717                         turntable: true,
30718                         wash: true
30719                     }
30720                 };
30721                 var returnTags = {};
30722                 for (var key in this.tags) {
30723                     if (key in osmAreaKeys && !(this.tags[key] in osmAreaKeys[key])) {
30724                         returnTags[key] = this.tags[key];
30725                         return returnTags;
30726                     }
30727                     if (key in lineKeys && this.tags[key] in lineKeys[key]) {
30728                         returnTags[key] = this.tags[key];
30729                         return returnTags;
30730                     }
30731                 }
30732                 return null;
30733             },
30734
30735             isArea: function() {
30736                 if (this.tags.area === 'yes')
30737                     return true;
30738                 if (!this.isClosed() || this.tags.area === 'no')
30739                     return false;
30740                 return this.tagSuggestingArea() !== null;
30741             },
30742
30743
30744             isDegenerate: function() {
30745                 return (new Set(this.nodes).size < (this.isArea() ? 3 : 2));
30746             },
30747
30748
30749             areAdjacent: function(n1, n2) {
30750                 for (var i = 0; i < this.nodes.length; i++) {
30751                     if (this.nodes[i] === n1) {
30752                         if (this.nodes[i - 1] === n2) return true;
30753                         if (this.nodes[i + 1] === n2) return true;
30754                     }
30755                 }
30756                 return false;
30757             },
30758
30759
30760             geometry: function(graph) {
30761                 return graph.transient(this, 'geometry', function() {
30762                     return this.isArea() ? 'area' : 'line';
30763                 });
30764             },
30765
30766
30767             // If this way is not closed, append the beginning node to the end of the nodelist to close it.
30768             close: function() {
30769                 if (this.isClosed() || !this.nodes.length) return this;
30770
30771                 var nodes = this.nodes.slice();
30772                 nodes = nodes.filter(noRepeatNodes);
30773                 nodes.push(nodes[0]);
30774                 return this.update({ nodes: nodes });
30775             },
30776
30777
30778             // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
30779             unclose: function() {
30780                 if (!this.isClosed()) return this;
30781
30782                 var nodes = this.nodes.slice();
30783                 var connector = this.first();
30784                 var i = nodes.length - 1;
30785
30786                 // remove trailing connectors..
30787                 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30788                     nodes.splice(i, 1);
30789                     i = nodes.length - 1;
30790                 }
30791
30792                 nodes = nodes.filter(noRepeatNodes);
30793                 return this.update({ nodes: nodes });
30794             },
30795
30796
30797             // Adds a node (id) in front of the node which is currently at position index.
30798             // If index is undefined, the node will be added to the end of the way for linear ways,
30799             //   or just before the final connecting node for circular ways.
30800             // Consecutive duplicates are eliminated including existing ones.
30801             // Circularity is always preserved when adding a node.
30802             addNode: function(id, index) {
30803                 var nodes = this.nodes.slice();
30804                 var isClosed = this.isClosed();
30805                 var max = isClosed ? nodes.length - 1 : nodes.length;
30806
30807                 if (index === undefined) {
30808                     index = max;
30809                 }
30810
30811                 if (index < 0 || index > max) {
30812                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30813                 }
30814
30815                 // If this is a closed way, remove all connector nodes except the first one
30816                 // (there may be duplicates) and adjust index if necessary..
30817                 if (isClosed) {
30818                     var connector = this.first();
30819
30820                     // leading connectors..
30821                     var i = 1;
30822                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30823                         nodes.splice(i, 1);
30824                         if (index > i) index--;
30825                     }
30826
30827                     // trailing connectors..
30828                     i = nodes.length - 1;
30829                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30830                         nodes.splice(i, 1);
30831                         if (index > i) index--;
30832                         i = nodes.length - 1;
30833                     }
30834                 }
30835
30836                 nodes.splice(index, 0, id);
30837                 nodes = nodes.filter(noRepeatNodes);
30838
30839                 // If the way was closed before, append a connector node to keep it closed..
30840                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30841                     nodes.push(nodes[0]);
30842                 }
30843
30844                 return this.update({ nodes: nodes });
30845             },
30846
30847
30848             // Replaces the node which is currently at position index with the given node (id).
30849             // Consecutive duplicates are eliminated including existing ones.
30850             // Circularity is preserved when updating a node.
30851             updateNode: function(id, index) {
30852                 var nodes = this.nodes.slice();
30853                 var isClosed = this.isClosed();
30854                 var max = nodes.length - 1;
30855
30856                 if (index === undefined || index < 0 || index > max) {
30857                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30858                 }
30859
30860                 // If this is a closed way, remove all connector nodes except the first one
30861                 // (there may be duplicates) and adjust index if necessary..
30862                 if (isClosed) {
30863                     var connector = this.first();
30864
30865                     // leading connectors..
30866                     var i = 1;
30867                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30868                         nodes.splice(i, 1);
30869                         if (index > i) index--;
30870                     }
30871
30872                     // trailing connectors..
30873                     i = nodes.length - 1;
30874                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30875                         nodes.splice(i, 1);
30876                         if (index === i) index = 0;  // update leading connector instead
30877                         i = nodes.length - 1;
30878                     }
30879                 }
30880
30881                 nodes.splice(index, 1, id);
30882                 nodes = nodes.filter(noRepeatNodes);
30883
30884                 // If the way was closed before, append a connector node to keep it closed..
30885                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30886                     nodes.push(nodes[0]);
30887                 }
30888
30889                 return this.update({nodes: nodes});
30890             },
30891
30892
30893             // Replaces each occurrence of node id needle with replacement.
30894             // Consecutive duplicates are eliminated including existing ones.
30895             // Circularity is preserved.
30896             replaceNode: function(needleID, replacementID) {
30897                 var nodes = this.nodes.slice();
30898                 var isClosed = this.isClosed();
30899
30900                 for (var i = 0; i < nodes.length; i++) {
30901                     if (nodes[i] === needleID) {
30902                         nodes[i] = replacementID;
30903                     }
30904                 }
30905
30906                 nodes = nodes.filter(noRepeatNodes);
30907
30908                 // If the way was closed before, append a connector node to keep it closed..
30909                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30910                     nodes.push(nodes[0]);
30911                 }
30912
30913                 return this.update({nodes: nodes});
30914             },
30915
30916
30917             // Removes each occurrence of node id.
30918             // Consecutive duplicates are eliminated including existing ones.
30919             // Circularity is preserved.
30920             removeNode: function(id) {
30921                 var nodes = this.nodes.slice();
30922                 var isClosed = this.isClosed();
30923
30924                 nodes = nodes
30925                     .filter(function(node) { return node !== id; })
30926                     .filter(noRepeatNodes);
30927
30928                 // If the way was closed before, append a connector node to keep it closed..
30929                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30930                     nodes.push(nodes[0]);
30931                 }
30932
30933                 return this.update({nodes: nodes});
30934             },
30935
30936
30937             asJXON: function(changeset_id) {
30938                 var r = {
30939                     way: {
30940                         '@id': this.osmId(),
30941                         '@version': this.version || 0,
30942                         nd: this.nodes.map(function(id) {
30943                             return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
30944                         }, this),
30945                         tag: Object.keys(this.tags).map(function(k) {
30946                             return { keyAttributes: { k: k, v: this.tags[k] } };
30947                         }, this)
30948                     }
30949                 };
30950                 if (changeset_id) {
30951                     r.way['@changeset'] = changeset_id;
30952                 }
30953                 return r;
30954             },
30955
30956
30957             asGeoJSON: function(resolver) {
30958                 return resolver.transient(this, 'GeoJSON', function() {
30959                     var coordinates = resolver.childNodes(this)
30960                         .map(function(n) { return n.loc; });
30961
30962                     if (this.isArea() && this.isClosed()) {
30963                         return {
30964                             type: 'Polygon',
30965                             coordinates: [coordinates]
30966                         };
30967                     } else {
30968                         return {
30969                             type: 'LineString',
30970                             coordinates: coordinates
30971                         };
30972                     }
30973                 });
30974             },
30975
30976
30977             area: function(resolver) {
30978                 return resolver.transient(this, 'area', function() {
30979                     var nodes = resolver.childNodes(this);
30980
30981                     var json = {
30982                         type: 'Polygon',
30983                         coordinates: [ nodes.map(function(n) { return n.loc; }) ]
30984                     };
30985
30986                     if (!this.isClosed() && nodes.length) {
30987                         json.coordinates[0].push(nodes[0].loc);
30988                     }
30989
30990                     var area = d3_geoArea(json);
30991
30992                     // Heuristic for detecting counterclockwise winding order. Assumes
30993                     // that OpenStreetMap polygons are not hemisphere-spanning.
30994                     if (area > 2 * Math.PI) {
30995                         json.coordinates[0] = json.coordinates[0].reverse();
30996                         area = d3_geoArea(json);
30997                     }
30998
30999                     return isNaN(area) ? 0 : area;
31000                 });
31001             }
31002         });
31003
31004
31005         // Filter function to eliminate consecutive duplicates.
31006         function noRepeatNodes(node, i, arr) {
31007             return i === 0 || node !== arr[i - 1];
31008         }
31009
31010         // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
31011         //
31012         // 1. Relation tagged with `type=multipolygon` and no interesting tags.
31013         // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
31014         // 3. No members without a role.
31015         //
31016         // Old multipolygons are no longer recommended but are still rendered as areas by iD.
31017
31018         function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
31019             if (entity.type !== 'relation' ||
31020                 !entity.isMultipolygon()
31021                 || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
31022                 return false;
31023             }
31024
31025             var outerMember;
31026             for (var memberIndex in entity.members) {
31027                 var member = entity.members[memberIndex];
31028                 if (!member.role || member.role === 'outer') {
31029                     if (outerMember) return false;
31030                     if (member.type !== 'way') return false;
31031                     if (!graph.hasEntity(member.id)) return false;
31032
31033                     outerMember = graph.entity(member.id);
31034
31035                     if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
31036                         return false;
31037                     }
31038                 }
31039             }
31040
31041             return outerMember;
31042         }
31043
31044         // For fixing up rendering of multipolygons with tags on the outer member.
31045         // https://github.com/openstreetmap/iD/issues/613
31046         function osmIsOldMultipolygonOuterMember(entity, graph) {
31047             if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
31048                 return false;
31049
31050             var parents = graph.parentRelations(entity);
31051             if (parents.length !== 1)
31052                 return false;
31053
31054             var parent = parents[0];
31055             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31056                 return false;
31057
31058             var members = parent.members, member;
31059             for (var i = 0; i < members.length; i++) {
31060                 member = members[i];
31061                 if (member.id === entity.id && member.role && member.role !== 'outer')
31062                     return false; // Not outer member
31063                 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
31064                     return false; // Not a simple multipolygon
31065             }
31066
31067             return parent;
31068         }
31069
31070
31071         function osmOldMultipolygonOuterMember(entity, graph) {
31072             if (entity.type !== 'way')
31073                 return false;
31074
31075             var parents = graph.parentRelations(entity);
31076             if (parents.length !== 1)
31077                 return false;
31078
31079             var parent = parents[0];
31080             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31081                 return false;
31082
31083             var members = parent.members, member, outerMember;
31084             for (var i = 0; i < members.length; i++) {
31085                 member = members[i];
31086                 if (!member.role || member.role === 'outer') {
31087                     if (outerMember)
31088                         return false; // Not a simple multipolygon
31089                     outerMember = member;
31090                 }
31091             }
31092
31093             if (!outerMember)
31094                 return false;
31095
31096             var outerEntity = graph.hasEntity(outerMember.id);
31097             if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
31098                 return false;
31099
31100             return outerEntity;
31101         }
31102
31103
31104         // Join `toJoin` array into sequences of connecting ways.
31105
31106         // Segments which share identical start/end nodes will, as much as possible,
31107         // be connected with each other.
31108         //
31109         // The return value is a nested array. Each constituent array contains elements
31110         // of `toJoin` which have been determined to connect.
31111         //
31112         // Each consitituent array also has a `nodes` property whose value is an
31113         // ordered array of member nodes, with appropriate order reversal and
31114         // start/end coordinate de-duplication.
31115         //
31116         // Members of `toJoin` must have, at minimum, `type` and `id` properties.
31117         // Thus either an array of `osmWay`s or a relation member array may be used.
31118         //
31119         // If an member is an `osmWay`, its tags and childnodes may be reversed via
31120         // `actionReverse` in the output.
31121         //
31122         // The returned sequences array also has an `actions` array property, containing
31123         // any reversal actions that should be applied to the graph, should the calling
31124         // code attempt to actually join the given ways.
31125         //
31126         // Incomplete members (those for which `graph.hasEntity(element.id)` returns
31127         // false) and non-way members are ignored.
31128         //
31129         function osmJoinWays(toJoin, graph) {
31130             function resolve(member) {
31131                 return graph.childNodes(graph.entity(member.id));
31132             }
31133
31134             function reverse(item) {
31135                 var action = actionReverse(item.id, { reverseOneway: true });
31136                 sequences.actions.push(action);
31137                 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
31138             }
31139
31140             // make a copy containing only the items to join
31141             toJoin = toJoin.filter(function(member) {
31142                 return member.type === 'way' && graph.hasEntity(member.id);
31143             });
31144
31145             // Are the things we are joining relation members or `osmWays`?
31146             // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
31147             var i;
31148             var joinAsMembers = true;
31149             for (i = 0; i < toJoin.length; i++) {
31150                 if (toJoin[i] instanceof osmWay) {
31151                     joinAsMembers = false;
31152                     break;
31153                 }
31154             }
31155
31156             var sequences = [];
31157             sequences.actions = [];
31158
31159             while (toJoin.length) {
31160                 // start a new sequence
31161                 var item = toJoin.shift();
31162                 var currWays = [item];
31163                 var currNodes = resolve(item).slice();
31164                 var doneSequence = false;
31165
31166                 // add to it
31167                 while (toJoin.length && !doneSequence) {
31168                     var start = currNodes[0];
31169                     var end = currNodes[currNodes.length - 1];
31170                     var fn = null;
31171                     var nodes = null;
31172
31173                     // Find the next way/member to join.
31174                     for (i = 0; i < toJoin.length; i++) {
31175                         item = toJoin[i];
31176                         nodes = resolve(item);
31177
31178                         // (for member ordering only, not way ordering - see #4872)
31179                         // Strongly prefer to generate a forward path that preserves the order
31180                         // of the members array. For multipolygons and most relations, member
31181                         // order does not matter - but for routes, it does. (see #4589)
31182                         // If we started this sequence backwards (i.e. next member way attaches to
31183                         // the start node and not the end node), reverse the initial way before continuing.
31184                         if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
31185                             (nodes[nodes.length - 1] === start || nodes[0] === start)
31186                         ) {
31187                             currWays[0] = reverse(currWays[0]);
31188                             currNodes.reverse();
31189                             start = currNodes[0];
31190                             end = currNodes[currNodes.length - 1];
31191                         }
31192
31193                         if (nodes[0] === end) {
31194                             fn = currNodes.push;               // join to end
31195                             nodes = nodes.slice(1);
31196                             break;
31197                         } else if (nodes[nodes.length - 1] === end) {
31198                             fn = currNodes.push;               // join to end
31199                             nodes = nodes.slice(0, -1).reverse();
31200                             item = reverse(item);
31201                             break;
31202                         } else if (nodes[nodes.length - 1] === start) {
31203                             fn = currNodes.unshift;            // join to beginning
31204                             nodes = nodes.slice(0, -1);
31205                             break;
31206                         } else if (nodes[0] === start) {
31207                             fn = currNodes.unshift;            // join to beginning
31208                             nodes = nodes.slice(1).reverse();
31209                             item = reverse(item);
31210                             break;
31211                         } else {
31212                             fn = nodes = null;
31213                         }
31214                     }
31215
31216                     if (!nodes) {     // couldn't find a joinable way/member
31217                         doneSequence = true;
31218                         break;
31219                     }
31220
31221                     fn.apply(currWays, [item]);
31222                     fn.apply(currNodes, nodes);
31223
31224                     toJoin.splice(i, 1);
31225                 }
31226
31227                 currWays.nodes = currNodes;
31228                 sequences.push(currWays);
31229             }
31230
31231             return sequences;
31232         }
31233
31234         function actionAddMember(relationId, member, memberIndex, insertPair) {
31235
31236             return function action(graph) {
31237                 var relation = graph.entity(relationId);
31238
31239                 // There are some special rules for Public Transport v2 routes.
31240                 var isPTv2 = /stop|platform/.test(member.role);
31241
31242                 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
31243                     // Try to perform sensible inserts based on how the ways join together
31244                     graph = addWayMember(relation, graph);
31245                 } else {
31246                     // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31247                     // Stops and Platforms for PTv2 should be ordered first.
31248                     // hack: We do not currently have the ability to place them in the exactly correct order.
31249                     if (isPTv2 && isNaN(memberIndex)) {
31250                         memberIndex = 0;
31251                     }
31252
31253                     graph = graph.replace(relation.addMember(member, memberIndex));
31254                 }
31255
31256                 return graph;
31257             };
31258
31259
31260             // Add a way member into the relation "wherever it makes sense".
31261             // In this situation we were not supplied a memberIndex.
31262             function addWayMember(relation, graph) {
31263                 var groups, tempWay, item, i, j, k;
31264
31265                 // remove PTv2 stops and platforms before doing anything.
31266                 var PTv2members = [];
31267                 var members = [];
31268                 for (i = 0; i < relation.members.length; i++) {
31269                     var m = relation.members[i];
31270                     if (/stop|platform/.test(m.role)) {
31271                         PTv2members.push(m);
31272                     } else {
31273                         members.push(m);
31274                     }
31275                 }
31276                 relation = relation.update({ members: members });
31277
31278
31279                 if (insertPair) {
31280                     // We're adding a member that must stay paired with an existing member.
31281                     // (This feature is used by `actionSplit`)
31282                     //
31283                     // This is tricky because the members may exist multiple times in the
31284                     // member list, and with different A-B/B-A ordering and different roles.
31285                     // (e.g. a bus route that loops out and back - #4589).
31286                     //
31287                     // Replace the existing member with a temporary way,
31288                     // so that `osmJoinWays` can treat the pair like a single way.
31289                     tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
31290                     graph = graph.replace(tempWay);
31291                     var tempMember = { id: tempWay.id, type: 'way', role: member.role };
31292                     var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
31293                     groups = utilArrayGroupBy(tempRelation.members, 'type');
31294                     groups.way = groups.way || [];
31295
31296                 } else {
31297                     // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
31298                     groups = utilArrayGroupBy(relation.members, 'type');
31299                     groups.way = groups.way || [];
31300                     groups.way.push(member);
31301                 }
31302
31303                 members = withIndex(groups.way);
31304                 var joined = osmJoinWays(members, graph);
31305
31306                 // `joined` might not contain all of the way members,
31307                 // But will contain only the completed (downloaded) members
31308                 for (i = 0; i < joined.length; i++) {
31309                     var segment = joined[i];
31310                     var nodes = segment.nodes.slice();
31311                     var startIndex = segment[0].index;
31312
31313                     // j = array index in `members` where this segment starts
31314                     for (j = 0; j < members.length; j++) {
31315                         if (members[j].index === startIndex) {
31316                             break;
31317                         }
31318                     }
31319
31320                     // k = each member in segment
31321                     for (k = 0; k < segment.length; k++) {
31322                         item = segment[k];
31323                         var way = graph.entity(item.id);
31324
31325                         // If this is a paired item, generate members in correct order and role
31326                         if (tempWay && item.id === tempWay.id) {
31327                             if (nodes[0].id === insertPair.nodes[0]) {
31328                                 item.pair = [
31329                                     { id: insertPair.originalID, type: 'way', role: item.role },
31330                                     { id: insertPair.insertedID, type: 'way', role: item.role }
31331                                 ];
31332                             } else {
31333                                 item.pair = [
31334                                     { id: insertPair.insertedID, type: 'way', role: item.role },
31335                                     { id: insertPair.originalID, type: 'way', role: item.role }
31336                                 ];
31337                             }
31338                         }
31339
31340                         // reorder `members` if necessary
31341                         if (k > 0) {
31342                             if (j+k >= members.length || item.index !== members[j+k].index) {
31343                                 moveMember(members, item.index, j+k);
31344                             }
31345                         }
31346
31347                         nodes.splice(0, way.nodes.length - 1);
31348                     }
31349                 }
31350
31351                 if (tempWay) {
31352                     graph = graph.remove(tempWay);
31353                 }
31354
31355                 // Final pass: skip dead items, split pairs, remove index properties
31356                 var wayMembers = [];
31357                 for (i = 0; i < members.length; i++) {
31358                     item = members[i];
31359                     if (item.index === -1) continue;
31360
31361                     if (item.pair) {
31362                         wayMembers.push(item.pair[0]);
31363                         wayMembers.push(item.pair[1]);
31364                     } else {
31365                         wayMembers.push(utilObjectOmit(item, ['index']));
31366                     }
31367                 }
31368
31369                 // Put stops and platforms first, then nodes, ways, relations
31370                 // This is recommended for Public Transport v2 routes:
31371                 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31372                 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
31373
31374                 return graph.replace(relation.update({ members: newMembers }));
31375
31376
31377                 // `moveMember()` changes the `members` array in place by splicing
31378                 // the item with `.index = findIndex` to where it belongs,
31379                 // and marking the old position as "dead" with `.index = -1`
31380                 //
31381                 // j=5, k=0                jk
31382                 // segment                 5 4 7 6
31383                 // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
31384                 //
31385                 // j=5, k=1                j k
31386                 // segment                 5 4 7 6
31387                 // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
31388                 // members       0 1 2 3 x 5 4 6 7 8 9      moved
31389                 //
31390                 // j=5, k=2                j   k
31391                 // segment                 5 4 7 6
31392                 // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
31393                 // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
31394                 //
31395                 // j=5, k=3                j     k
31396                 // segment                 5 4 7 6
31397                 // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
31398                 //
31399                 function moveMember(arr, findIndex, toIndex) {
31400                     for (var i = 0; i < arr.length; i++) {
31401                         if (arr[i].index === findIndex) {
31402                             break;
31403                         }
31404                     }
31405
31406                     var item = Object.assign({}, arr[i]);   // shallow copy
31407                     arr[i].index = -1;   // mark as dead
31408                     item.index = toIndex;
31409                     arr.splice(toIndex, 0, item);
31410                 }
31411
31412
31413                 // This is the same as `Relation.indexedMembers`,
31414                 // Except we don't want to index all the members, only the ways
31415                 function withIndex(arr) {
31416                     var result = new Array(arr.length);
31417                     for (var i = 0; i < arr.length; i++) {
31418                         result[i] = Object.assign({}, arr[i]);   // shallow copy
31419                         result[i].index = i;
31420                     }
31421                     return result;
31422                 }
31423             }
31424
31425         }
31426
31427         function actionAddMidpoint(midpoint, node) {
31428             return function(graph) {
31429                 graph = graph.replace(node.move(midpoint.loc));
31430
31431                 var parents = utilArrayIntersection(
31432                     graph.parentWays(graph.entity(midpoint.edge[0])),
31433                     graph.parentWays(graph.entity(midpoint.edge[1]))
31434                 );
31435
31436                 parents.forEach(function(way) {
31437                     for (var i = 0; i < way.nodes.length - 1; i++) {
31438                         if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
31439                             graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
31440
31441                             // Add only one midpoint on doubled-back segments,
31442                             // turning them into self-intersections.
31443                             return;
31444                         }
31445                     }
31446                 });
31447
31448                 return graph;
31449             };
31450         }
31451
31452         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
31453         function actionAddVertex(wayId, nodeId, index) {
31454             return function(graph) {
31455                 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
31456             };
31457         }
31458
31459         function actionChangeMember(relationId, member, memberIndex) {
31460             return function(graph) {
31461                 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
31462             };
31463         }
31464
31465         function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
31466             return function action(graph) {
31467                 var entity = graph.entity(entityID);
31468                 var geometry = entity.geometry(graph);
31469                 var tags = entity.tags;
31470
31471                 if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
31472                 if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
31473
31474                 return graph.replace(entity.update({tags: tags}));
31475             };
31476         }
31477
31478         function actionChangeTags(entityId, tags) {
31479             return function(graph) {
31480                 var entity = graph.entity(entityId);
31481                 return graph.replace(entity.update({tags: tags}));
31482             };
31483         }
31484
31485         function osmNode() {
31486             if (!(this instanceof osmNode)) {
31487                 return (new osmNode()).initialize(arguments);
31488             } else if (arguments.length) {
31489                 this.initialize(arguments);
31490             }
31491         }
31492
31493         osmEntity.node = osmNode;
31494
31495         osmNode.prototype = Object.create(osmEntity.prototype);
31496
31497         Object.assign(osmNode.prototype, {
31498             type: 'node',
31499             loc: [9999, 9999],
31500
31501             extent: function() {
31502                 return new geoExtent(this.loc);
31503             },
31504
31505
31506             geometry: function(graph) {
31507                 return graph.transient(this, 'geometry', function() {
31508                     return graph.isPoi(this) ? 'point' : 'vertex';
31509                 });
31510             },
31511
31512
31513             move: function(loc) {
31514                 return this.update({loc: loc});
31515             },
31516
31517
31518             isDegenerate: function() {
31519                 return !(
31520                     Array.isArray(this.loc) && this.loc.length === 2 &&
31521                     this.loc[0] >= -180 && this.loc[0] <= 180 &&
31522                     this.loc[1] >= -90 && this.loc[1] <= 90
31523                 );
31524             },
31525
31526
31527             // Inspect tags and geometry to determine which direction(s) this node/vertex points
31528             directions: function(resolver, projection) {
31529                 var val;
31530                 var i;
31531
31532                 // which tag to use?
31533                 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
31534                     // all-way stop tag on a highway intersection
31535                     val = 'all';
31536                 } else {
31537                     // generic direction tag
31538                     val = (this.tags.direction || '').toLowerCase();
31539
31540                     // better suffix-style direction tag
31541                     var re = /:direction$/i;
31542                     var keys = Object.keys(this.tags);
31543                     for (i = 0; i < keys.length; i++) {
31544                         if (re.test(keys[i])) {
31545                             val = this.tags[keys[i]].toLowerCase();
31546                             break;
31547                         }
31548                     }
31549                 }
31550
31551                 if (val === '') return [];
31552
31553                 var cardinal = {
31554                     north: 0,               n: 0,
31555                     northnortheast: 22,     nne: 22,
31556                     northeast: 45,          ne: 45,
31557                     eastnortheast: 67,      ene: 67,
31558                     east: 90,               e: 90,
31559                     eastsoutheast: 112,     ese: 112,
31560                     southeast: 135,         se: 135,
31561                     southsoutheast: 157,    sse: 157,
31562                     south: 180,             s: 180,
31563                     southsouthwest: 202,    ssw: 202,
31564                     southwest: 225,         sw: 225,
31565                     westsouthwest: 247,     wsw: 247,
31566                     west: 270,              w: 270,
31567                     westnorthwest: 292,     wnw: 292,
31568                     northwest: 315,         nw: 315,
31569                     northnorthwest: 337,    nnw: 337
31570                 };
31571
31572
31573                 var values = val.split(';');
31574                 var results = [];
31575
31576                 values.forEach(function(v) {
31577                     // swap cardinal for numeric directions
31578                     if (cardinal[v] !== undefined) {
31579                         v = cardinal[v];
31580                     }
31581
31582                     // numeric direction - just add to results
31583                     if (v !== '' && !isNaN(+v)) {
31584                         results.push(+v);
31585                         return;
31586                     }
31587
31588                     // string direction - inspect parent ways
31589                     var lookBackward =
31590                         (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
31591                     var lookForward =
31592                         (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
31593
31594                     if (!lookForward && !lookBackward) return;
31595
31596                     var nodeIds = {};
31597                     resolver.parentWays(this).forEach(function(parent) {
31598                         var nodes = parent.nodes;
31599                         for (i = 0; i < nodes.length; i++) {
31600                             if (nodes[i] === this.id) {  // match current entity
31601                                 if (lookForward && i > 0) {
31602                                     nodeIds[nodes[i - 1]] = true;  // look back to prev node
31603                                 }
31604                                 if (lookBackward && i < nodes.length - 1) {
31605                                     nodeIds[nodes[i + 1]] = true;  // look ahead to next node
31606                                 }
31607                             }
31608                         }
31609                     }, this);
31610
31611                     Object.keys(nodeIds).forEach(function(nodeId) {
31612                         // +90 because geoAngle returns angle from X axis, not Y (north)
31613                         results.push(
31614                             (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
31615                         );
31616                     }, this);
31617
31618                 }, this);
31619
31620                 return utilArrayUniq(results);
31621             },
31622
31623
31624             isEndpoint: function(resolver) {
31625                 return resolver.transient(this, 'isEndpoint', function() {
31626                     var id = this.id;
31627                     return resolver.parentWays(this).filter(function(parent) {
31628                         return !parent.isClosed() && !!parent.affix(id);
31629                     }).length > 0;
31630                 });
31631             },
31632
31633
31634             isConnected: function(resolver) {
31635                 return resolver.transient(this, 'isConnected', function() {
31636                     var parents = resolver.parentWays(this);
31637
31638                     function isLine(entity) {
31639                         return entity.geometry(resolver) === 'line' &&
31640                             entity.hasInterestingTags();
31641                     }
31642
31643                     // vertex is connected to multiple parent lines
31644                     if (parents.length > 1 && parents.some(isLine)) {
31645                         return true;
31646
31647                     } else if (parents.length === 1) {
31648                         var way = parents[0];
31649                         var nodes = way.nodes.slice();
31650                         if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
31651
31652                         // return true if vertex appears multiple times (way is self intersecting)
31653                         return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
31654                     }
31655
31656                     return false;
31657                 });
31658             },
31659
31660
31661             isIntersection: function(resolver) {
31662                 return resolver.transient(this, 'isIntersection', function() {
31663                     return resolver.parentWays(this).filter(function(parent) {
31664                         return (parent.tags.highway ||
31665                             parent.tags.waterway ||
31666                             parent.tags.railway ||
31667                             parent.tags.aeroway) &&
31668                             parent.geometry(resolver) === 'line';
31669                     }).length > 1;
31670                 });
31671             },
31672
31673
31674             isHighwayIntersection: function(resolver) {
31675                 return resolver.transient(this, 'isHighwayIntersection', function() {
31676                     return resolver.parentWays(this).filter(function(parent) {
31677                         return parent.tags.highway && parent.geometry(resolver) === 'line';
31678                     }).length > 1;
31679                 });
31680             },
31681
31682
31683             isOnAddressLine: function(resolver) {
31684                 return resolver.transient(this, 'isOnAddressLine', function() {
31685                     return resolver.parentWays(this).filter(function(parent) {
31686                         return parent.tags.hasOwnProperty('addr:interpolation') &&
31687                             parent.geometry(resolver) === 'line';
31688                     }).length > 0;
31689                 });
31690             },
31691
31692
31693             asJXON: function(changeset_id) {
31694                 var r = {
31695                     node: {
31696                         '@id': this.osmId(),
31697                         '@lon': this.loc[0],
31698                         '@lat': this.loc[1],
31699                         '@version': (this.version || 0),
31700                         tag: Object.keys(this.tags).map(function(k) {
31701                             return { keyAttributes: { k: k, v: this.tags[k] } };
31702                         }, this)
31703                     }
31704                 };
31705                 if (changeset_id) r.node['@changeset'] = changeset_id;
31706                 return r;
31707             },
31708
31709
31710             asGeoJSON: function() {
31711                 return {
31712                     type: 'Point',
31713                     coordinates: this.loc
31714                 };
31715             }
31716         });
31717
31718         function actionCircularize(wayId, projection, maxAngle) {
31719             maxAngle = (maxAngle || 20) * Math.PI / 180;
31720
31721
31722             var action = function(graph, t) {
31723                 if (t === null || !isFinite(t)) t = 1;
31724                 t = Math.min(Math.max(+t, 0), 1);
31725
31726                 var way = graph.entity(wayId);
31727                 var origNodes = {};
31728
31729                 graph.childNodes(way).forEach(function(node) {
31730                     if (!origNodes[node.id]) origNodes[node.id] = node;
31731                 });
31732
31733                 if (!way.isConvex(graph)) {
31734                     graph = action.makeConvex(graph);
31735                 }
31736
31737                 var nodes = utilArrayUniq(graph.childNodes(way));
31738                 var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; });
31739                 var points = nodes.map(function(n) { return projection(n.loc); });
31740                 var keyPoints = keyNodes.map(function(n) { return projection(n.loc); });
31741                 var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
31742                 var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); });
31743                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31744                 var ids, i, j, k;
31745
31746                 // we need atleast two key nodes for the algorithm to work
31747                 if (!keyNodes.length) {
31748                     keyNodes = [nodes[0]];
31749                     keyPoints = [points[0]];
31750                 }
31751
31752                 if (keyNodes.length === 1) {
31753                     var index = nodes.indexOf(keyNodes[0]);
31754                     var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
31755
31756                     keyNodes.push(nodes[oppositeIndex]);
31757                     keyPoints.push(points[oppositeIndex]);
31758                 }
31759
31760                 // key points and nodes are those connected to the ways,
31761                 // they are projected onto the circle, inbetween nodes are moved
31762                 // to constant intervals between key nodes, extra inbetween nodes are
31763                 // added if necessary.
31764                 for (i = 0; i < keyPoints.length; i++) {
31765                     var nextKeyNodeIndex = (i + 1) % keyNodes.length;
31766                     var startNode = keyNodes[i];
31767                     var endNode = keyNodes[nextKeyNodeIndex];
31768                     var startNodeIndex = nodes.indexOf(startNode);
31769                     var endNodeIndex = nodes.indexOf(endNode);
31770                     var numberNewPoints = -1;
31771                     var indexRange = endNodeIndex - startNodeIndex;
31772                     var nearNodes = {};
31773                     var inBetweenNodes = [];
31774                     var startAngle, endAngle, totalAngle, eachAngle;
31775                     var angle, loc, node, origNode;
31776
31777                     if (indexRange < 0) {
31778                         indexRange += nodes.length;
31779                     }
31780
31781                     // position this key node
31782                     var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
31783                     keyPoints[i] = [
31784                         centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
31785                         centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
31786                     ];
31787                     loc = projection.invert(keyPoints[i]);
31788                     node = keyNodes[i];
31789                     origNode = origNodes[node.id];
31790                     node = node.move(geoVecInterp(origNode.loc, loc, t));
31791                     graph = graph.replace(node);
31792
31793                     // figure out the between delta angle we want to match to
31794                     startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
31795                     endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
31796                     totalAngle = endAngle - startAngle;
31797
31798                     // detects looping around -pi/pi
31799                     if (totalAngle * sign > 0) {
31800                         totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
31801                     }
31802
31803                     do {
31804                         numberNewPoints++;
31805                         eachAngle = totalAngle / (indexRange + numberNewPoints);
31806                     } while (Math.abs(eachAngle) > maxAngle);
31807
31808
31809                     // move existing nodes
31810                     for (j = 1; j < indexRange; j++) {
31811                         angle = startAngle + j * eachAngle;
31812                         loc = projection.invert([
31813                             centroid[0] + Math.cos(angle) * radius,
31814                             centroid[1] + Math.sin(angle) * radius
31815                         ]);
31816
31817                         node = nodes[(j + startNodeIndex) % nodes.length];
31818                         origNode = origNodes[node.id];
31819                         nearNodes[node.id] = angle;
31820
31821                         node = node.move(geoVecInterp(origNode.loc, loc, t));
31822                         graph = graph.replace(node);
31823                     }
31824
31825                     // add new inbetween nodes if necessary
31826                     for (j = 0; j < numberNewPoints; j++) {
31827                         angle = startAngle + (indexRange + j) * eachAngle;
31828                         loc = projection.invert([
31829                             centroid[0] + Math.cos(angle) * radius,
31830                             centroid[1] + Math.sin(angle) * radius
31831                         ]);
31832
31833                         // choose a nearnode to use as the original
31834                         var min = Infinity;
31835                         for (var nodeId in nearNodes) {
31836                             var nearAngle = nearNodes[nodeId];
31837                             var dist = Math.abs(nearAngle - angle);
31838                             if (dist < min) {
31839                                 dist = min;
31840                                 origNode = origNodes[nodeId];
31841                             }
31842                         }
31843
31844                         node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
31845                         graph = graph.replace(node);
31846
31847                         nodes.splice(endNodeIndex + j, 0, node);
31848                         inBetweenNodes.push(node.id);
31849                     }
31850
31851                     // Check for other ways that share these keyNodes..
31852                     // If keyNodes are adjacent in both ways,
31853                     // we can add inBetween nodes to that shared way too..
31854                     if (indexRange === 1 && inBetweenNodes.length) {
31855                         var startIndex1 = way.nodes.lastIndexOf(startNode.id);
31856                         var endIndex1 = way.nodes.lastIndexOf(endNode.id);
31857                         var wayDirection1 = (endIndex1 - startIndex1);
31858                         if (wayDirection1 < -1) { wayDirection1 = 1; }
31859
31860                         var parentWays = graph.parentWays(keyNodes[i]);
31861                         for (j = 0; j < parentWays.length; j++) {
31862                             var sharedWay = parentWays[j];
31863                             if (sharedWay === way) continue;
31864
31865                             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
31866                                 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
31867                                 var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
31868                                 var wayDirection2 = (endIndex2 - startIndex2);
31869                                 var insertAt = endIndex2;
31870                                 if (wayDirection2 < -1) { wayDirection2 = 1; }
31871
31872                                 if (wayDirection1 !== wayDirection2) {
31873                                     inBetweenNodes.reverse();
31874                                     insertAt = startIndex2;
31875                                 }
31876                                 for (k = 0; k < inBetweenNodes.length; k++) {
31877                                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
31878                                 }
31879                                 graph = graph.replace(sharedWay);
31880                             }
31881                         }
31882                     }
31883
31884                 }
31885
31886                 // update the way to have all the new nodes
31887                 ids = nodes.map(function(n) { return n.id; });
31888                 ids.push(ids[0]);
31889
31890                 way = way.update({nodes: ids});
31891                 graph = graph.replace(way);
31892
31893                 return graph;
31894             };
31895
31896
31897             action.makeConvex = function(graph) {
31898                 var way = graph.entity(wayId);
31899                 var nodes = utilArrayUniq(graph.childNodes(way));
31900                 var points = nodes.map(function(n) { return projection(n.loc); });
31901                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31902                 var hull = d3_polygonHull(points);
31903                 var i, j;
31904
31905                 // D3 convex hulls go counterclockwise..
31906                 if (sign === -1) {
31907                     nodes.reverse();
31908                     points.reverse();
31909                 }
31910
31911                 for (i = 0; i < hull.length - 1; i++) {
31912                     var startIndex = points.indexOf(hull[i]);
31913                     var endIndex = points.indexOf(hull[i+1]);
31914                     var indexRange = (endIndex - startIndex);
31915
31916                     if (indexRange < 0) {
31917                         indexRange += nodes.length;
31918                     }
31919
31920                     // move interior nodes to the surface of the convex hull..
31921                     for (j = 1; j < indexRange; j++) {
31922                         var point = geoVecInterp(hull[i], hull[i+1], j / indexRange);
31923                         var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
31924                         graph = graph.replace(node);
31925                     }
31926                 }
31927                 return graph;
31928             };
31929
31930
31931             action.disabled = function(graph) {
31932                 if (!graph.entity(wayId).isClosed()) {
31933                     return 'not_closed';
31934                 }
31935             };
31936
31937
31938             action.transitionable = true;
31939
31940
31941             return action;
31942         }
31943
31944         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
31945         function actionDeleteWay(wayID) {
31946
31947             function canDeleteNode(node, graph) {
31948                 // don't delete nodes still attached to ways or relations
31949                 if (graph.parentWays(node).length ||
31950                     graph.parentRelations(node).length) return false;
31951
31952                 var geometries = osmNodeGeometriesForTags(node.tags);
31953                 // don't delete if this node can be a standalone point
31954                 if (geometries.point) return false;
31955                 // delete if this node only be a vertex
31956                 if (geometries.vertex) return true;
31957
31958                 // iD doesn't know if this should be a point or vertex,
31959                 // so only delete if there are no interesting tags
31960                 return !node.hasInterestingTags();
31961             }
31962
31963
31964             var action = function(graph) {
31965                 var way = graph.entity(wayID);
31966
31967                 graph.parentRelations(way).forEach(function(parent) {
31968                     parent = parent.removeMembersWithID(wayID);
31969                     graph = graph.replace(parent);
31970
31971                     if (parent.isDegenerate()) {
31972                         graph = actionDeleteRelation(parent.id)(graph);
31973                     }
31974                 });
31975
31976                 (new Set(way.nodes)).forEach(function(nodeID) {
31977                     graph = graph.replace(way.removeNode(nodeID));
31978
31979                     var node = graph.entity(nodeID);
31980                     if (canDeleteNode(node, graph)) {
31981                         graph = graph.remove(node);
31982                     }
31983                 });
31984
31985                 return graph.remove(way);
31986             };
31987
31988
31989             return action;
31990         }
31991
31992         function actionDeleteMultiple(ids) {
31993             var actions = {
31994                 way: actionDeleteWay,
31995                 node: actionDeleteNode,
31996                 relation: actionDeleteRelation
31997             };
31998
31999
32000             var action = function(graph) {
32001                 ids.forEach(function(id) {
32002                     if (graph.hasEntity(id)) { // It may have been deleted aready.
32003                         graph = actions[graph.entity(id).type](id)(graph);
32004                     }
32005                 });
32006
32007                 return graph;
32008             };
32009
32010
32011             return action;
32012         }
32013
32014         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
32015         function actionDeleteRelation(relationID, allowUntaggedMembers) {
32016
32017             function canDeleteEntity(entity, graph) {
32018                 return !graph.parentWays(entity).length &&
32019                     !graph.parentRelations(entity).length &&
32020                     (!entity.hasInterestingTags() && !allowUntaggedMembers);
32021             }
32022
32023
32024             var action = function(graph) {
32025                 var relation = graph.entity(relationID);
32026
32027                 graph.parentRelations(relation)
32028                     .forEach(function(parent) {
32029                         parent = parent.removeMembersWithID(relationID);
32030                         graph = graph.replace(parent);
32031
32032                         if (parent.isDegenerate()) {
32033                             graph = actionDeleteRelation(parent.id)(graph);
32034                         }
32035                     });
32036
32037                 var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; }));
32038                 memberIDs.forEach(function(memberID) {
32039                     graph = graph.replace(relation.removeMembersWithID(memberID));
32040
32041                     var entity = graph.entity(memberID);
32042                     if (canDeleteEntity(entity, graph)) {
32043                         graph = actionDeleteMultiple([memberID])(graph);
32044                     }
32045                 });
32046
32047                 return graph.remove(relation);
32048             };
32049
32050
32051             return action;
32052         }
32053
32054         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
32055         function actionDeleteNode(nodeId) {
32056             var action = function(graph) {
32057                 var node = graph.entity(nodeId);
32058
32059                 graph.parentWays(node)
32060                     .forEach(function(parent) {
32061                         parent = parent.removeNode(nodeId);
32062                         graph = graph.replace(parent);
32063
32064                         if (parent.isDegenerate()) {
32065                             graph = actionDeleteWay(parent.id)(graph);
32066                         }
32067                     });
32068
32069                 graph.parentRelations(node)
32070                     .forEach(function(parent) {
32071                         parent = parent.removeMembersWithID(nodeId);
32072                         graph = graph.replace(parent);
32073
32074                         if (parent.isDegenerate()) {
32075                             graph = actionDeleteRelation(parent.id)(graph);
32076                         }
32077                     });
32078
32079                 return graph.remove(node);
32080             };
32081
32082
32083             return action;
32084         }
32085
32086         // Connect the ways at the given nodes.
32087         //
32088         // First choose a node to be the survivor, with preference given
32089         // to an existing (not new) node.
32090         //
32091         // Tags and relation memberships of of non-surviving nodes are merged
32092         // to the survivor.
32093         //
32094         // This is the inverse of `iD.actionDisconnect`.
32095         //
32096         // Reference:
32097         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
32098         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
32099         //
32100         function actionConnect(nodeIDs) {
32101             var action = function(graph) {
32102                 var survivor;
32103                 var node;
32104                 var parents;
32105                 var i, j;
32106
32107                 // Choose a survivor node, prefer an existing (not new) node - #4974
32108                 for (i = 0; i < nodeIDs.length; i++) {
32109                     survivor = graph.entity(nodeIDs[i]);
32110                     if (survivor.version) break;  // found one
32111                 }
32112
32113                 // Replace all non-surviving nodes with the survivor and merge tags.
32114                 for (i = 0; i < nodeIDs.length; i++) {
32115                     node = graph.entity(nodeIDs[i]);
32116                     if (node.id === survivor.id) continue;
32117
32118                     parents = graph.parentWays(node);
32119                     for (j = 0; j < parents.length; j++) {
32120                         if (!parents[j].areAdjacent(node.id, survivor.id)) {
32121                             graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
32122                         }
32123                     }
32124
32125                     parents = graph.parentRelations(node);
32126                     for (j = 0; j < parents.length; j++) {
32127                         graph = graph.replace(parents[j].replaceMember(node, survivor));
32128                     }
32129
32130                     survivor = survivor.mergeTags(node.tags);
32131                     graph = actionDeleteNode(node.id)(graph);
32132                 }
32133
32134                 graph = graph.replace(survivor);
32135
32136                 return graph;
32137             };
32138
32139
32140             action.disabled = function(graph) {
32141                 var seen = {};
32142                 var restrictionIDs = [];
32143                 var survivor;
32144                 var node, way;
32145                 var relations, relation, role;
32146                 var i, j, k;
32147
32148                 // Choose a survivor node, prefer an existing (not new) node - #4974
32149                 for (i = 0; i < nodeIDs.length; i++) {
32150                     survivor = graph.entity(nodeIDs[i]);
32151                     if (survivor.version) break;  // found one
32152                 }
32153
32154                 // 1. disable if the nodes being connected have conflicting relation roles
32155                 for (i = 0; i < nodeIDs.length; i++) {
32156                     node = graph.entity(nodeIDs[i]);
32157                     relations = graph.parentRelations(node);
32158
32159                     for (j = 0; j < relations.length; j++) {
32160                         relation = relations[j];
32161                         role = relation.memberById(node.id).role || '';
32162
32163                         // if this node is a via node in a restriction, remember for later
32164                         if (relation.hasFromViaTo()) {
32165                             restrictionIDs.push(relation.id);
32166                         }
32167
32168                         if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
32169                             return 'relation';
32170                         } else {
32171                             seen[relation.id] = role;
32172                         }
32173                     }
32174                 }
32175
32176                 // gather restrictions for parent ways
32177                 for (i = 0; i < nodeIDs.length; i++) {
32178                     node = graph.entity(nodeIDs[i]);
32179
32180                     var parents = graph.parentWays(node);
32181                     for (j = 0; j < parents.length; j++) {
32182                         var parent = parents[j];
32183                         relations = graph.parentRelations(parent);
32184
32185                         for (k = 0; k < relations.length; k++) {
32186                             relation = relations[k];
32187                             if (relation.hasFromViaTo()) {
32188                                 restrictionIDs.push(relation.id);
32189                             }
32190                         }
32191                     }
32192                 }
32193
32194
32195                 // test restrictions
32196                 restrictionIDs = utilArrayUniq(restrictionIDs);
32197                 for (i = 0; i < restrictionIDs.length; i++) {
32198                     relation = graph.entity(restrictionIDs[i]);
32199                     if (!relation.isComplete(graph)) continue;
32200
32201                     var memberWays = relation.members
32202                         .filter(function(m) { return m.type === 'way'; })
32203                         .map(function(m) { return graph.entity(m.id); });
32204
32205                     memberWays = utilArrayUniq(memberWays);
32206                     var f = relation.memberByRole('from');
32207                     var t = relation.memberByRole('to');
32208                     var isUturn = (f.id === t.id);
32209
32210                     // 2a. disable if connection would damage a restriction
32211                     // (a key node is a node at the junction of ways)
32212                     var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
32213                     for (j = 0; j < relation.members.length; j++) {
32214                         collectNodes(relation.members[j], nodes);
32215                     }
32216
32217                     nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
32218                     nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
32219
32220                     var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
32221                     nodes.from = nodes.from.filter(filter);
32222                     nodes.via = nodes.via.filter(filter);
32223                     nodes.to = nodes.to.filter(filter);
32224
32225                     var connectFrom = false;
32226                     var connectVia = false;
32227                     var connectTo = false;
32228                     var connectKeyFrom = false;
32229                     var connectKeyTo = false;
32230
32231                     for (j = 0; j < nodeIDs.length; j++) {
32232                         var n = nodeIDs[j];
32233                         if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
32234                         if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
32235                         if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
32236                         if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
32237                         if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
32238                     }
32239                     if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
32240                     if (connectFrom && connectVia) { return 'restriction'; }
32241                     if (connectTo   && connectVia) { return 'restriction'; }
32242
32243                     // connecting to a key node -
32244                     // if both nodes are on a member way (i.e. part of the turn restriction),
32245                     // the connecting node must be adjacent to the key node.
32246                     if (connectKeyFrom || connectKeyTo) {
32247                         if (nodeIDs.length !== 2) { return 'restriction'; }
32248
32249                         var n0 = null;
32250                         var n1 = null;
32251                         for (j = 0; j < memberWays.length; j++) {
32252                             way = memberWays[j];
32253                             if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
32254                             if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
32255                         }
32256
32257                         if (n0 && n1) {    // both nodes are part of the restriction
32258                             var ok = false;
32259                             for (j = 0; j < memberWays.length; j++) {
32260                                 way = memberWays[j];
32261                                 if (way.areAdjacent(n0, n1)) {
32262                                     ok = true;
32263                                     break;
32264                                 }
32265                             }
32266                             if (!ok) {
32267                                 return 'restriction';
32268                             }
32269                         }
32270                     }
32271
32272                     // 2b. disable if nodes being connected will destroy a member way in a restriction
32273                     // (to test, make a copy and try actually connecting the nodes)
32274                     for (j = 0; j < memberWays.length; j++) {
32275                         way = memberWays[j].update({});   // make copy
32276                         for (k = 0; k < nodeIDs.length; k++) {
32277                             if (nodeIDs[k] === survivor.id) continue;
32278
32279                             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
32280                                 way = way.removeNode(nodeIDs[k]);
32281                             } else {
32282                                 way = way.replaceNode(nodeIDs[k], survivor.id);
32283                             }
32284                         }
32285                         if (way.isDegenerate()) {
32286                             return 'restriction';
32287                         }
32288                     }
32289                 }
32290
32291                 return false;
32292
32293
32294                 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
32295                 function hasDuplicates(n, i, arr) {
32296                     return arr.indexOf(n) !== arr.lastIndexOf(n);
32297                 }
32298
32299                 function keyNodeFilter(froms, tos) {
32300                     return function(n) {
32301                         return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
32302                     };
32303                 }
32304
32305                 function collectNodes(member, collection) {
32306                     var entity = graph.hasEntity(member.id);
32307                     if (!entity) return;
32308
32309                     var role = member.role || '';
32310                     if (!collection[role]) {
32311                         collection[role] = [];
32312                     }
32313
32314                     if (member.type === 'node') {
32315                         collection[role].push(member.id);
32316                         if (role === 'via') {
32317                             collection.keyfrom.push(member.id);
32318                             collection.keyto.push(member.id);
32319                         }
32320
32321                     } else if (member.type === 'way') {
32322                         collection[role].push.apply(collection[role], entity.nodes);
32323                         if (role === 'from' || role === 'via') {
32324                             collection.keyfrom.push(entity.first());
32325                             collection.keyfrom.push(entity.last());
32326                         }
32327                         if (role === 'to' || role === 'via') {
32328                             collection.keyto.push(entity.first());
32329                             collection.keyto.push(entity.last());
32330                         }
32331                     }
32332                 }
32333             };
32334
32335
32336             return action;
32337         }
32338
32339         function actionCopyEntities(ids, fromGraph) {
32340             var _copies = {};
32341
32342
32343             var action = function(graph) {
32344                 ids.forEach(function(id) {
32345                     fromGraph.entity(id).copy(fromGraph, _copies);
32346                 });
32347
32348                 for (var id in _copies) {
32349                     graph = graph.replace(_copies[id]);
32350                 }
32351
32352                 return graph;
32353             };
32354
32355
32356             action.copies = function() {
32357                 return _copies;
32358             };
32359
32360
32361             return action;
32362         }
32363
32364         function actionDeleteMember(relationId, memberIndex) {
32365             return function(graph) {
32366                 var relation = graph.entity(relationId)
32367                     .removeMember(memberIndex);
32368
32369                 graph = graph.replace(relation);
32370
32371                 if (relation.isDegenerate())
32372                     graph = actionDeleteRelation(relation.id)(graph);
32373
32374                 return graph;
32375             };
32376         }
32377
32378         function actionDiscardTags(difference) {
32379
32380             return function(graph) {
32381                 function discardTags(entity) {
32382                     var tags = {};
32383                     var keys = Object.keys(entity.tags);
32384                     var discarded = false;
32385
32386                     for (var i = 0; i < keys.length; i++) {
32387                         var k = keys[i];
32388                         if (dataDiscarded[k] || !entity.tags[k]) {
32389                             discarded = true;
32390                         } else {
32391                             tags[k] = entity.tags[k];
32392                         }
32393                     }
32394
32395                     if (discarded) {
32396                         graph = graph.replace(entity.update({ tags: tags }));
32397                     }
32398                 }
32399
32400                 difference.modified().forEach(discardTags);
32401                 difference.created().forEach(discardTags);
32402
32403                 return graph;
32404             };
32405         }
32406
32407         // Disconect the ways at the given node.
32408         //
32409         // Optionally, disconnect only the given ways.
32410         //
32411         // For testing convenience, accepts an ID to assign to the (first) new node.
32412         // Normally, this will be undefined and the way will automatically
32413         // be assigned a new ID.
32414         //
32415         // This is the inverse of `iD.actionConnect`.
32416         //
32417         // Reference:
32418         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
32419         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
32420         //
32421         function actionDisconnect(nodeId, newNodeId) {
32422             var wayIds;
32423
32424
32425             var action = function(graph) {
32426                 var node = graph.entity(nodeId);
32427                 var connections = action.connections(graph);
32428
32429                 connections.forEach(function(connection) {
32430                     var way = graph.entity(connection.wayID);
32431                     var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
32432
32433                     graph = graph.replace(newNode);
32434                     if (connection.index === 0 && way.isArea()) {
32435                         // replace shared node with shared node..
32436                         graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
32437                     } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
32438                         // replace closing node with new new node..
32439                         graph = graph.replace(way.unclose().addNode(newNode.id));
32440                     } else {
32441                         // replace shared node with multiple new nodes..
32442                         graph = graph.replace(way.updateNode(newNode.id, connection.index));
32443                     }
32444                 });
32445
32446                 return graph;
32447             };
32448
32449
32450             action.connections = function(graph) {
32451                 var candidates = [];
32452                 var keeping = false;
32453                 var parentWays = graph.parentWays(graph.entity(nodeId));
32454
32455                 parentWays.forEach(function(way) {
32456                     if (wayIds && wayIds.indexOf(way.id) === -1) {
32457                         keeping = true;
32458                         return;
32459                     }
32460                     if (way.isArea() && (way.nodes[0] === nodeId)) {
32461                         candidates.push({ wayID: way.id, index: 0 });
32462                     } else {
32463                         way.nodes.forEach(function(waynode, index) {
32464                             if (waynode === nodeId) {
32465                                 if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && index === way.nodes.length-1) {
32466                                     return;
32467                                 }
32468                                 candidates.push({ wayID: way.id, index: index });
32469                             }
32470                         });
32471                     }
32472                 });
32473
32474                 return keeping ? candidates : candidates.slice(1);
32475             };
32476
32477
32478             action.disabled = function(graph) {
32479                 var connections = action.connections(graph);
32480                 if (connections.length === 0)
32481                     return 'not_connected';
32482
32483                 var parentWays = graph.parentWays(graph.entity(nodeId));
32484                 var seenRelationIds = {};
32485                 var sharedRelation;
32486
32487                 parentWays.forEach(function(way) {
32488                     var relations = graph.parentRelations(way);
32489                     relations.forEach(function(relation) {
32490                         if (relation.id in seenRelationIds) {
32491                             if (wayIds) {
32492                                 if (wayIds.indexOf(way.id) !== -1 ||
32493                                     wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
32494                                     sharedRelation = relation;
32495                                 }
32496                             } else {
32497                                 sharedRelation = relation;
32498                             }
32499                         } else {
32500                             seenRelationIds[relation.id] = way.id;
32501                         }
32502                     });
32503                 });
32504
32505                 if (sharedRelation)
32506                     return 'relation';
32507             };
32508
32509
32510             action.limitWays = function(val) {
32511                 if (!arguments.length) return wayIds;
32512                 wayIds = val;
32513                 return action;
32514             };
32515
32516
32517             return action;
32518         }
32519
32520         function actionExtract(entityID, projection) {
32521
32522             var extractedNodeID;
32523
32524             var action = function(graph) {
32525                 var entity = graph.entity(entityID);
32526
32527                 if (entity.type === 'node') {
32528                     return extractFromNode(entity, graph);
32529                 }
32530
32531                 return extractFromArea(entity, graph);
32532             };
32533
32534             function extractFromNode(node, graph) {
32535
32536                 extractedNodeID = node.id;
32537
32538                 // Create a new node to replace the one we will detach
32539                 var replacement = osmNode({ loc: node.loc });
32540                 graph = graph.replace(replacement);
32541
32542                 // Process each way in turn, updating the graph as we go
32543                 graph = graph.parentWays(node)
32544                     .reduce(function(accGraph, parentWay) {
32545                         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
32546                     }, graph);
32547
32548                 // Process any relations too
32549                 return graph.parentRelations(node)
32550                     .reduce(function(accGraph, parentRel) {
32551                         return accGraph.replace(parentRel.replaceMember(node, replacement));
32552                     }, graph);
32553             }
32554
32555             function extractFromArea(entity, graph) {
32556
32557                 var keysToCopyAndRetain = ['source', 'wheelchair'];
32558                 var keysToRetain = ['type'];
32559                 var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
32560
32561                 var centroid = d3_geoPath(projection).centroid(entity.asGeoJSON(graph, true));
32562
32563                 var isBuilding = entity.tags.building;
32564
32565                 var areaTags = Object.assign({}, entity.tags);  // shallow copy
32566                 var pointTags = {};
32567                 for (var key in areaTags) {
32568
32569                     if (keysToRetain.indexOf(key) !== -1) {
32570                         continue;
32571                     }
32572
32573                     if (isBuilding) {
32574                         // don't transfer building-related tags
32575                         if (buildingKeysToRetain.indexOf(key) !== -1 ||
32576                             key.match(/^building:.{1,}/) ||
32577                             key.match(/^roof:.{1,}/)) continue;
32578                     }
32579
32580                     // copy the tag from the area to the point
32581                     pointTags[key] = areaTags[key];
32582
32583                     // leave addresses and some other tags so they're on both features
32584                     if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
32585                         continue;
32586                     }
32587
32588                     // remove the tag from the area
32589                     delete areaTags[key];
32590                 }
32591
32592                 if (!isBuilding) {
32593                     // ensure that the area keeps the area geometry
32594                     areaTags.area = 'yes';
32595                 }
32596
32597                 var replacement = osmNode({ loc: centroid, tags: pointTags });
32598                 graph = graph.replace(replacement);
32599
32600                 extractedNodeID = replacement.id;
32601
32602                 return graph.replace(entity.update({tags: areaTags}));
32603             }
32604
32605             action.getExtractedNodeID = function() {
32606                 return extractedNodeID;
32607             };
32608
32609             action.disabled = function(graph) {
32610                 var entity = graph.entity(entityID);
32611
32612                 if (entity.type === 'node') {
32613                     var parentRels = graph.parentRelations(entity);
32614                     for (var i = 0; i < parentRels.length; i++) {
32615                         var relation = parentRels[i];
32616                         if (!relation.hasFromViaTo()) continue;
32617
32618                         for (var j = 0; j < relation.members.length; j++) {
32619                             var m = relation.members[j];
32620                             if (m.id === entityID && (m.role === 'via' || m.role === 'location_hint')) {
32621                                 return 'restriction';
32622                             }
32623                         }
32624                     }
32625                 }
32626
32627                 return false;
32628             };
32629
32630
32631             return action;
32632         }
32633
32634         // Join ways at the end node they share.
32635         //
32636         // This is the inverse of `iD.actionSplit`.
32637         //
32638         // Reference:
32639         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
32640         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
32641         //
32642         function actionJoin(ids) {
32643
32644             function groupEntitiesByGeometry(graph) {
32645                 var entities = ids.map(function(id) { return graph.entity(id); });
32646                 return Object.assign(
32647                     { line: [] },
32648                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32649                 );
32650             }
32651
32652
32653             var action = function(graph) {
32654                 var ways = ids.map(graph.entity, graph);
32655                 var survivorID = ways[0].id;
32656
32657                 // if any of the ways are sided (e.g. coastline, cliff, kerb)
32658                 // sort them first so they establish the overall order - #6033
32659                 ways.sort(function(a, b) {
32660                     var aSided = a.isSided();
32661                     var bSided = b.isSided();
32662                     return (aSided && !bSided) ? -1
32663                         : (bSided && !aSided) ? 1
32664                         : 0;
32665                 });
32666
32667                 // Prefer to keep an existing way.
32668                 for (var i = 0; i < ways.length; i++) {
32669                     if (!ways[i].isNew()) {
32670                         survivorID = ways[i].id;
32671                         break;
32672                     }
32673                 }
32674
32675                 var sequences = osmJoinWays(ways, graph);
32676                 var joined = sequences[0];
32677
32678                 // We might need to reverse some of these ways before joining them.  #4688
32679                 // `joined.actions` property will contain any actions we need to apply.
32680                 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
32681
32682                 var survivor = graph.entity(survivorID);
32683                 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
32684                 graph = graph.replace(survivor);
32685
32686                 joined.forEach(function(way) {
32687                     if (way.id === survivorID) return;
32688
32689                     graph.parentRelations(way).forEach(function(parent) {
32690                         graph = graph.replace(parent.replaceMember(way, survivor));
32691                     });
32692
32693                     survivor = survivor.mergeTags(way.tags);
32694
32695                     graph = graph.replace(survivor);
32696                     graph = actionDeleteWay(way.id)(graph);
32697                 });
32698
32699                 return graph;
32700             };
32701
32702
32703             action.disabled = function(graph) {
32704                 var geometries = groupEntitiesByGeometry(graph);
32705                 if (ids.length < 2 || ids.length !== geometries.line.length) {
32706                     return 'not_eligible';
32707                 }
32708
32709                 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
32710                 if (joined.length > 1) {
32711                     return 'not_adjacent';
32712                 }
32713
32714                 // Loop through all combinations of path-pairs
32715                 // to check potential intersections between all pairs
32716                 for (var i = 0; i < ids.length - 1; i++) {
32717                     for (var j = i + 1; j < ids.length; j++) {
32718                         var path1 = graph.childNodes(graph.entity(ids[i]))
32719                             .map(function(e) { return e.loc; });
32720                         var path2 = graph.childNodes(graph.entity(ids[j]))
32721                             .map(function(e) { return e.loc; });
32722                         var intersections = geoPathIntersections(path1, path2);
32723
32724                         // Check if intersections are just nodes lying on top of
32725                         // each other/the line, as opposed to crossing it
32726                         var common = utilArrayIntersection(
32727                             joined[0].nodes.map(function(n) { return n.loc.toString(); }),
32728                             intersections.map(function(n) { return n.toString(); })
32729                         );
32730                         if (common.length !== intersections.length) {
32731                             return 'paths_intersect';
32732                         }
32733                     }
32734                 }
32735
32736                 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
32737                 var relation;
32738                 var tags = {};
32739                 var conflicting = false;
32740
32741                 joined[0].forEach(function(way) {
32742                     var parents = graph.parentRelations(way);
32743                     parents.forEach(function(parent) {
32744                         if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) {
32745                             relation = parent;
32746                         }
32747                     });
32748
32749                     for (var k in way.tags) {
32750                         if (!(k in tags)) {
32751                             tags[k] = way.tags[k];
32752                         } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
32753                             conflicting = true;
32754                         }
32755                     }
32756                 });
32757
32758                 if (relation) {
32759                     return 'restriction';
32760                 }
32761
32762                 if (conflicting) {
32763                     return 'conflicting_tags';
32764                 }
32765             };
32766
32767
32768             return action;
32769         }
32770
32771         function actionMerge(ids) {
32772
32773             function groupEntitiesByGeometry(graph) {
32774                 var entities = ids.map(function(id) { return graph.entity(id); });
32775                 return Object.assign(
32776                     { point: [], area: [], line: [], relation: [] },
32777                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32778                 );
32779             }
32780
32781
32782             var action = function(graph) {
32783                 var geometries = groupEntitiesByGeometry(graph);
32784                 var target = geometries.area[0] || geometries.line[0];
32785                 var points = geometries.point;
32786
32787                 points.forEach(function(point) {
32788                     target = target.mergeTags(point.tags);
32789                     graph = graph.replace(target);
32790
32791                     graph.parentRelations(point).forEach(function(parent) {
32792                         graph = graph.replace(parent.replaceMember(point, target));
32793                     });
32794
32795                     var nodes = utilArrayUniq(graph.childNodes(target));
32796                     var removeNode = point;
32797
32798                     for (var i = 0; i < nodes.length; i++) {
32799                         var node = nodes[i];
32800                         if (graph.parentWays(node).length > 1 ||
32801                             graph.parentRelations(node).length ||
32802                             node.hasInterestingTags()) {
32803                             continue;
32804                         }
32805
32806                         // Found an uninteresting child node on the target way.
32807                         // Move orig point into its place to preserve point's history. #3683
32808                         graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
32809                         target = target.replaceNode(node.id, point.id);
32810                         graph = graph.replace(target);
32811                         removeNode = node;
32812                         break;
32813                     }
32814
32815                     graph = graph.remove(removeNode);
32816                 });
32817
32818                 return graph;
32819             };
32820
32821
32822             action.disabled = function(graph) {
32823                 var geometries = groupEntitiesByGeometry(graph);
32824                 if (geometries.point.length === 0 ||
32825                     (geometries.area.length + geometries.line.length) !== 1 ||
32826                     geometries.relation.length !== 0) {
32827                     return 'not_eligible';
32828                 }
32829             };
32830
32831
32832             return action;
32833         }
32834
32835         // `actionMergeNodes` is just a combination of:
32836         //
32837         // 1. move all the nodes to a common location
32838         // 2. `actionConnect` them
32839
32840         function actionMergeNodes(nodeIDs, loc) {
32841
32842             // If there is a single "interesting" node, use that as the location.
32843             // Otherwise return the average location of all the nodes.
32844             function chooseLoc(graph) {
32845                 if (!nodeIDs.length) return null;
32846                 var sum = [0,0];
32847                 var interestingCount = 0;
32848                 var interestingLoc;
32849
32850                 for (var i = 0; i < nodeIDs.length; i++) {
32851                     var node = graph.entity(nodeIDs[i]);
32852                     if (node.hasInterestingTags()) {
32853                         interestingLoc = (++interestingCount === 1) ? node.loc : null;
32854                     }
32855                     sum = geoVecAdd(sum, node.loc);
32856                 }
32857
32858                 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
32859             }
32860
32861
32862             var action = function(graph) {
32863                 if (nodeIDs.length < 2) return graph;
32864                 var toLoc = loc;
32865                 if (!toLoc) {
32866                     toLoc = chooseLoc(graph);
32867                 }
32868
32869                 for (var i = 0; i < nodeIDs.length; i++) {
32870                     var node = graph.entity(nodeIDs[i]);
32871                     if (node.loc !== toLoc) {
32872                         graph = graph.replace(node.move(toLoc));
32873                     }
32874                 }
32875
32876                 return actionConnect(nodeIDs)(graph);
32877             };
32878
32879
32880             action.disabled = function(graph) {
32881                 if (nodeIDs.length < 2) return 'not_eligible';
32882
32883                 for (var i = 0; i < nodeIDs.length; i++) {
32884                     var entity = graph.entity(nodeIDs[i]);
32885                     if (entity.type !== 'node') return 'not_eligible';
32886                 }
32887
32888                 return actionConnect(nodeIDs).disabled(graph);
32889             };
32890
32891             return action;
32892         }
32893
32894         function osmChangeset() {
32895             if (!(this instanceof osmChangeset)) {
32896                 return (new osmChangeset()).initialize(arguments);
32897             } else if (arguments.length) {
32898                 this.initialize(arguments);
32899             }
32900         }
32901
32902
32903         osmEntity.changeset = osmChangeset;
32904
32905         osmChangeset.prototype = Object.create(osmEntity.prototype);
32906
32907         Object.assign(osmChangeset.prototype, {
32908
32909             type: 'changeset',
32910
32911
32912             extent: function() {
32913                 return new geoExtent();
32914             },
32915
32916
32917             geometry: function() {
32918                 return 'changeset';
32919             },
32920
32921
32922             asJXON: function() {
32923                 return {
32924                     osm: {
32925                         changeset: {
32926                             tag: Object.keys(this.tags).map(function(k) {
32927                                 return { '@k': k, '@v': this.tags[k] };
32928                             }, this),
32929                             '@version': 0.6,
32930                             '@generator': 'iD'
32931                         }
32932                     }
32933                 };
32934             },
32935
32936
32937             // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
32938             // XML. Returns a string.
32939             osmChangeJXON: function(changes) {
32940                 var changeset_id = this.id;
32941
32942                 function nest(x, order) {
32943                     var groups = {};
32944                     for (var i = 0; i < x.length; i++) {
32945                         var tagName = Object.keys(x[i])[0];
32946                         if (!groups[tagName]) groups[tagName] = [];
32947                         groups[tagName].push(x[i][tagName]);
32948                     }
32949                     var ordered = {};
32950                     order.forEach(function(o) {
32951                         if (groups[o]) ordered[o] = groups[o];
32952                     });
32953                     return ordered;
32954                 }
32955
32956
32957                 // sort relations in a changeset by dependencies
32958                 function sort(changes) {
32959
32960                     // find a referenced relation in the current changeset
32961                     function resolve(item) {
32962                         return relations.find(function(relation) {
32963                             return item.keyAttributes.type === 'relation'
32964                                 && item.keyAttributes.ref === relation['@id'];
32965                         });
32966                     }
32967
32968                     // a new item is an item that has not been already processed
32969                     function isNew(item) {
32970                         return !sorted[ item['@id'] ] && !processing.find(function(proc) {
32971                             return proc['@id'] === item['@id'];
32972                         });
32973                     }
32974
32975                     var processing = [];
32976                     var sorted = {};
32977                     var relations = changes.relation;
32978
32979                     if (!relations) return changes;
32980
32981                     for (var i = 0; i < relations.length; i++) {
32982                         var relation = relations[i];
32983
32984                         // skip relation if already sorted
32985                         if (!sorted[relation['@id']]) {
32986                             processing.push(relation);
32987                         }
32988
32989                         while (processing.length > 0) {
32990                             var next = processing[0],
32991                             deps = next.member.map(resolve).filter(Boolean).filter(isNew);
32992                             if (deps.length === 0) {
32993                                 sorted[next['@id']] = next;
32994                                 processing.shift();
32995                             } else {
32996                                 processing = deps.concat(processing);
32997                             }
32998                         }
32999                     }
33000
33001                     changes.relation = Object.values(sorted);
33002                     return changes;
33003                 }
33004
33005                 function rep(entity) {
33006                     return entity.asJXON(changeset_id);
33007                 }
33008
33009                 return {
33010                     osmChange: {
33011                         '@version': 0.6,
33012                         '@generator': 'iD',
33013                         'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
33014                         'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
33015                         'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
33016                     }
33017                 };
33018             },
33019
33020
33021             asGeoJSON: function() {
33022                 return {};
33023             }
33024
33025         });
33026
33027         function osmNote() {
33028             if (!(this instanceof osmNote)) {
33029                 return (new osmNote()).initialize(arguments);
33030             } else if (arguments.length) {
33031                 this.initialize(arguments);
33032             }
33033         }
33034
33035
33036         osmNote.id = function() {
33037             return osmNote.id.next--;
33038         };
33039
33040
33041         osmNote.id.next = -1;
33042
33043
33044         Object.assign(osmNote.prototype, {
33045
33046             type: 'note',
33047
33048             initialize: function(sources) {
33049                 for (var i = 0; i < sources.length; ++i) {
33050                     var source = sources[i];
33051                     for (var prop in source) {
33052                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33053                             if (source[prop] === undefined) {
33054                                 delete this[prop];
33055                             } else {
33056                                 this[prop] = source[prop];
33057                             }
33058                         }
33059                     }
33060                 }
33061
33062                 if (!this.id) {
33063                     this.id = osmNote.id() + '';  // as string
33064                 }
33065
33066                 return this;
33067             },
33068
33069             extent: function() {
33070                 return new geoExtent(this.loc);
33071             },
33072
33073             update: function(attrs) {
33074                 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
33075             },
33076
33077             isNew: function() {
33078                 return this.id < 0;
33079             },
33080
33081             move: function(loc) {
33082                 return this.update({ loc: loc });
33083             }
33084
33085         });
33086
33087         function osmRelation() {
33088             if (!(this instanceof osmRelation)) {
33089                 return (new osmRelation()).initialize(arguments);
33090             } else if (arguments.length) {
33091                 this.initialize(arguments);
33092             }
33093         }
33094
33095
33096         osmEntity.relation = osmRelation;
33097
33098         osmRelation.prototype = Object.create(osmEntity.prototype);
33099
33100
33101         osmRelation.creationOrder = function(a, b) {
33102             var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
33103             var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
33104
33105             if (aId < 0 || bId < 0) return aId - bId;
33106             return bId - aId;
33107         };
33108
33109
33110         Object.assign(osmRelation.prototype, {
33111             type: 'relation',
33112             members: [],
33113
33114
33115             copy: function(resolver, copies) {
33116                 if (copies[this.id]) return copies[this.id];
33117
33118                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
33119
33120                 var members = this.members.map(function(member) {
33121                     return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
33122                 });
33123
33124                 copy = copy.update({members: members});
33125                 copies[this.id] = copy;
33126
33127                 return copy;
33128             },
33129
33130
33131             extent: function(resolver, memo) {
33132                 return resolver.transient(this, 'extent', function() {
33133                     if (memo && memo[this.id]) return geoExtent();
33134                     memo = memo || {};
33135                     memo[this.id] = true;
33136
33137                     var extent = geoExtent();
33138                     for (var i = 0; i < this.members.length; i++) {
33139                         var member = resolver.hasEntity(this.members[i].id);
33140                         if (member) {
33141                             extent._extend(member.extent(resolver, memo));
33142                         }
33143                     }
33144                     return extent;
33145                 });
33146             },
33147
33148
33149             geometry: function(graph) {
33150                 return graph.transient(this, 'geometry', function() {
33151                     return this.isMultipolygon() ? 'area' : 'relation';
33152                 });
33153             },
33154
33155
33156             isDegenerate: function() {
33157                 return this.members.length === 0;
33158             },
33159
33160
33161             // Return an array of members, each extended with an 'index' property whose value
33162             // is the member index.
33163             indexedMembers: function() {
33164                 var result = new Array(this.members.length);
33165                 for (var i = 0; i < this.members.length; i++) {
33166                     result[i] = Object.assign({}, this.members[i], {index: i});
33167                 }
33168                 return result;
33169             },
33170
33171
33172             // Return the first member with the given role. A copy of the member object
33173             // is returned, extended with an 'index' property whose value is the member index.
33174             memberByRole: function(role) {
33175                 for (var i = 0; i < this.members.length; i++) {
33176                     if (this.members[i].role === role) {
33177                         return Object.assign({}, this.members[i], {index: i});
33178                     }
33179                 }
33180             },
33181
33182             // Same as memberByRole, but returns all members with the given role
33183             membersByRole: function(role) {
33184                 var result = [];
33185                 for (var i = 0; i < this.members.length; i++) {
33186                     if (this.members[i].role === role) {
33187                         result.push(Object.assign({}, this.members[i], {index: i}));
33188                     }
33189                 }
33190                 return result;
33191             },
33192
33193             // Return the first member with the given id. A copy of the member object
33194             // is returned, extended with an 'index' property whose value is the member index.
33195             memberById: function(id) {
33196                 for (var i = 0; i < this.members.length; i++) {
33197                     if (this.members[i].id === id) {
33198                         return Object.assign({}, this.members[i], {index: i});
33199                     }
33200                 }
33201             },
33202
33203
33204             // Return the first member with the given id and role. A copy of the member object
33205             // is returned, extended with an 'index' property whose value is the member index.
33206             memberByIdAndRole: function(id, role) {
33207                 for (var i = 0; i < this.members.length; i++) {
33208                     if (this.members[i].id === id && this.members[i].role === role) {
33209                         return Object.assign({}, this.members[i], {index: i});
33210                     }
33211                 }
33212             },
33213
33214
33215             addMember: function(member, index) {
33216                 var members = this.members.slice();
33217                 members.splice(index === undefined ? members.length : index, 0, member);
33218                 return this.update({members: members});
33219             },
33220
33221
33222             updateMember: function(member, index) {
33223                 var members = this.members.slice();
33224                 members.splice(index, 1, Object.assign({}, members[index], member));
33225                 return this.update({members: members});
33226             },
33227
33228
33229             removeMember: function(index) {
33230                 var members = this.members.slice();
33231                 members.splice(index, 1);
33232                 return this.update({members: members});
33233             },
33234
33235
33236             removeMembersWithID: function(id) {
33237                 var members = this.members.filter(function(m) { return m.id !== id; });
33238                 return this.update({members: members});
33239             },
33240
33241             moveMember: function(fromIndex, toIndex) {
33242                 var members = this.members.slice();
33243                 members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
33244                 return this.update({members: members});
33245             },
33246
33247
33248             // Wherever a member appears with id `needle.id`, replace it with a member
33249             // with id `replacement.id`, type `replacement.type`, and the original role,
33250             // By default, adding a duplicate member (by id and role) is prevented.
33251             // Return an updated relation.
33252             replaceMember: function(needle, replacement, keepDuplicates) {
33253                 if (!this.memberById(needle.id)) return this;
33254
33255                 var members = [];
33256
33257                 for (var i = 0; i < this.members.length; i++) {
33258                     var member = this.members[i];
33259                     if (member.id !== needle.id) {
33260                         members.push(member);
33261                     } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
33262                         members.push({ id: replacement.id, type: replacement.type, role: member.role });
33263                     }
33264                 }
33265
33266                 return this.update({ members: members });
33267             },
33268
33269
33270             asJXON: function(changeset_id) {
33271                 var r = {
33272                     relation: {
33273                         '@id': this.osmId(),
33274                         '@version': this.version || 0,
33275                         member: this.members.map(function(member) {
33276                             return {
33277                                 keyAttributes: {
33278                                     type: member.type,
33279                                     role: member.role,
33280                                     ref: osmEntity.id.toOSM(member.id)
33281                                 }
33282                             };
33283                         }, this),
33284                         tag: Object.keys(this.tags).map(function(k) {
33285                             return { keyAttributes: { k: k, v: this.tags[k] } };
33286                         }, this)
33287                     }
33288                 };
33289                 if (changeset_id) {
33290                     r.relation['@changeset'] = changeset_id;
33291                 }
33292                 return r;
33293             },
33294
33295
33296             asGeoJSON: function(resolver) {
33297                 return resolver.transient(this, 'GeoJSON', function () {
33298                     if (this.isMultipolygon()) {
33299                         return {
33300                             type: 'MultiPolygon',
33301                             coordinates: this.multipolygon(resolver)
33302                         };
33303                     } else {
33304                         return {
33305                             type: 'FeatureCollection',
33306                             properties: this.tags,
33307                             features: this.members.map(function (member) {
33308                                 return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
33309                             })
33310                         };
33311                     }
33312                 });
33313             },
33314
33315
33316             area: function(resolver) {
33317                 return resolver.transient(this, 'area', function() {
33318                     return d3_geoArea(this.asGeoJSON(resolver));
33319                 });
33320             },
33321
33322
33323             isMultipolygon: function() {
33324                 return this.tags.type === 'multipolygon';
33325             },
33326
33327
33328             isComplete: function(resolver) {
33329                 for (var i = 0; i < this.members.length; i++) {
33330                     if (!resolver.hasEntity(this.members[i].id)) {
33331                         return false;
33332                     }
33333                 }
33334                 return true;
33335             },
33336
33337
33338             hasFromViaTo: function() {
33339                 return (
33340                     this.members.some(function(m) { return m.role === 'from'; }) &&
33341                     this.members.some(function(m) { return m.role === 'via'; }) &&
33342                     this.members.some(function(m) { return m.role === 'to'; })
33343                 );
33344             },
33345
33346
33347             isRestriction: function() {
33348                 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
33349             },
33350
33351
33352             isValidRestriction: function() {
33353                 if (!this.isRestriction()) return false;
33354
33355                 var froms = this.members.filter(function(m) { return m.role === 'from'; });
33356                 var vias = this.members.filter(function(m) { return m.role === 'via'; });
33357                 var tos = this.members.filter(function(m) { return m.role === 'to'; });
33358
33359                 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
33360                 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
33361
33362                 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
33363                 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
33364
33365                 if (vias.length === 0) return false;
33366                 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
33367
33368                 return true;
33369             },
33370
33371
33372             // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
33373             // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
33374             //
33375             // This corresponds to the structure needed for rendering a multipolygon path using a
33376             // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
33377             //
33378             // In the case of invalid geometries, this function will still return a result which
33379             // includes the nodes of all way members, but some Nds may be unclosed and some inner
33380             // rings not matched with the intended outer ring.
33381             //
33382             multipolygon: function(resolver) {
33383                 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
33384                 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
33385
33386                 outers = osmJoinWays(outers, resolver);
33387                 inners = osmJoinWays(inners, resolver);
33388
33389                 outers = outers.map(function(outer) {
33390                     return outer.nodes.map(function(node) { return node.loc; });
33391                 });
33392                 inners = inners.map(function(inner) {
33393                     return inner.nodes.map(function(node) { return node.loc; });
33394                 });
33395
33396                 var result = outers.map(function(o) {
33397                     // Heuristic for detecting counterclockwise winding order. Assumes
33398                     // that OpenStreetMap polygons are not hemisphere-spanning.
33399                     return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
33400                 });
33401
33402                 function findOuter(inner) {
33403                     var o, outer;
33404
33405                     for (o = 0; o < outers.length; o++) {
33406                         outer = outers[o];
33407                         if (geoPolygonContainsPolygon(outer, inner))
33408                             return o;
33409                     }
33410
33411                     for (o = 0; o < outers.length; o++) {
33412                         outer = outers[o];
33413                         if (geoPolygonIntersectsPolygon(outer, inner, false))
33414                             return o;
33415                     }
33416                 }
33417
33418                 for (var i = 0; i < inners.length; i++) {
33419                     var inner = inners[i];
33420
33421                     if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
33422                         inner = inner.reverse();
33423                     }
33424
33425                     var o = findOuter(inners[i]);
33426                     if (o !== undefined) {
33427                         result[o].push(inners[i]);
33428                     } else {
33429                         result.push([inners[i]]); // Invalid geometry
33430                     }
33431                 }
33432
33433                 return result;
33434             }
33435         });
33436
33437         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:{}}};
33438
33439         function qaError() {
33440             if (!(this instanceof qaError)) {
33441                 return (new qaError()).initialize(arguments);
33442             } else if (arguments.length) {
33443                 this.initialize(arguments);
33444             }
33445         }
33446
33447         // Generic handling for services without nice IDs
33448         qaError.id = function() {
33449             return qaError.id.next--;
33450         };
33451
33452         qaError.id.next = -1;
33453
33454         Object.assign(qaError.prototype, {
33455             type: 'qaError',
33456
33457             // All errors need a position
33458             loc: [0, 0],
33459
33460             // These should be passed in, used to retrieve from qa_errors.json
33461             service: '',
33462             error_type: '',
33463
33464             initialize: function(sources) {
33465                 for (var i = 0; i < sources.length; ++i) {
33466                     var source = sources[i];
33467                     for (var prop in source) {
33468                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33469                             if (source[prop] === undefined) {
33470                                 delete this[prop];
33471                             } else {
33472                                 this[prop] = source[prop];
33473                             }
33474                         }
33475                     }
33476                 }
33477
33478                 // Extract common error information from data
33479                 if (this.service && this.error_type) {
33480                     var serviceInfo = services[this.service];
33481
33482                     if (serviceInfo) {
33483                         var errInfo = serviceInfo.errorTypes[this.error_type];
33484
33485                         if (errInfo) {
33486                             this.icon = errInfo.icon;
33487                             this.category = errInfo.category;
33488                         }
33489                     }
33490                 }
33491
33492                 // All errors must have an ID for selection
33493                 if (!this.id) {
33494                     this.id = qaError.id() + '';  // as string
33495                 }
33496
33497                 return this;
33498             },
33499
33500             update: function(attrs) {
33501                 return qaError(this, attrs); // {v: 1 + (this.v || 0)}
33502             }
33503         });
33504
33505         // Split a way at the given node.
33506         //
33507         // Optionally, split only the given ways, if multiple ways share
33508         // the given node.
33509         //
33510         // This is the inverse of `iD.actionJoin`.
33511         //
33512         // For testing convenience, accepts an ID to assign to the new way.
33513         // Normally, this will be undefined and the way will automatically
33514         // be assigned a new ID.
33515         //
33516         // Reference:
33517         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
33518         //
33519         function actionSplit(nodeId, newWayIds) {
33520             var _wayIDs;
33521
33522             // If the way is closed, we need to search for a partner node
33523             // to split the way at.
33524             //
33525             // The following looks for a node that is both far away from
33526             // the initial node in terms of way segment length and nearby
33527             // in terms of beeline-distance. This assures that areas get
33528             // split on the most "natural" points (independent of the number
33529             // of nodes).
33530             // For example: bone-shaped areas get split across their waist
33531             // line, circles across the diameter.
33532             function splitArea(nodes, idxA, graph) {
33533                 var lengths = new Array(nodes.length);
33534                 var length;
33535                 var i;
33536                 var best = 0;
33537                 var idxB;
33538
33539                 function wrap(index) {
33540                     return utilWrap(index, nodes.length);
33541                 }
33542
33543                 function dist(nA, nB) {
33544                     var locA = graph.entity(nA).loc;
33545                     var locB = graph.entity(nB).loc;
33546                     var epsilon = 1e-6;
33547                     return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
33548                 }
33549
33550                 // calculate lengths
33551                 length = 0;
33552                 for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
33553                     length += dist(nodes[i], nodes[wrap(i - 1)]);
33554                     lengths[i] = length;
33555                 }
33556
33557                 length = 0;
33558                 for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
33559                     length += dist(nodes[i], nodes[wrap(i + 1)]);
33560                     if (length < lengths[i]) {
33561                         lengths[i] = length;
33562                     }
33563                 }
33564
33565                 // determine best opposite node to split
33566                 for (i = 0; i < nodes.length; i++) {
33567                     var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
33568                     if (cost > best) {
33569                         idxB = i;
33570                         best = cost;
33571                     }
33572                 }
33573
33574                 return idxB;
33575             }
33576
33577
33578             function split(graph, wayA, newWayId) {
33579                 var wayB = osmWay({ id: newWayId, tags: wayA.tags });   // `wayB` is the NEW way
33580                 var origNodes = wayA.nodes.slice();
33581                 var nodesA;
33582                 var nodesB;
33583                 var isArea = wayA.isArea();
33584                 var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
33585
33586                 if (wayA.isClosed()) {
33587                     var nodes = wayA.nodes.slice(0, -1);
33588                     var idxA = nodes.indexOf(nodeId);
33589                     var idxB = splitArea(nodes, idxA, graph);
33590
33591                     if (idxB < idxA) {
33592                         nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
33593                         nodesB = nodes.slice(idxB, idxA + 1);
33594                     } else {
33595                         nodesA = nodes.slice(idxA, idxB + 1);
33596                         nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
33597                     }
33598                 } else {
33599                     var idx = wayA.nodes.indexOf(nodeId, 1);
33600                     nodesA = wayA.nodes.slice(0, idx + 1);
33601                     nodesB = wayA.nodes.slice(idx);
33602                 }
33603
33604                 wayA = wayA.update({ nodes: nodesA });
33605                 wayB = wayB.update({ nodes: nodesB });
33606
33607                 graph = graph.replace(wayA);
33608                 graph = graph.replace(wayB);
33609
33610                 graph.parentRelations(wayA).forEach(function(relation) {
33611                     var member;
33612
33613                     // Turn restrictions - make sure:
33614                     // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
33615                     //    (whichever one is connected to the VIA node/ways)
33616                     // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
33617                     if (relation.hasFromViaTo()) {
33618                         var f = relation.memberByRole('from');
33619                         var v = relation.membersByRole('via');
33620                         var t = relation.memberByRole('to');
33621                         var i;
33622
33623                         // 1. split a FROM/TO
33624                         if (f.id === wayA.id || t.id === wayA.id) {
33625                             var keepB = false;
33626                             if (v.length === 1 && v[0].type === 'node') {   // check via node
33627                                 keepB = wayB.contains(v[0].id);
33628                             } else {                                        // check via way(s)
33629                                 for (i = 0; i < v.length; i++) {
33630                                     if (v[i].type === 'way') {
33631                                         var wayVia = graph.hasEntity(v[i].id);
33632                                         if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
33633                                             keepB = true;
33634                                             break;
33635                                         }
33636                                     }
33637                                 }
33638                             }
33639
33640                             if (keepB) {
33641                                 relation = relation.replaceMember(wayA, wayB);
33642                                 graph = graph.replace(relation);
33643                             }
33644
33645                         // 2. split a VIA
33646                         } else {
33647                             for (i = 0; i < v.length; i++) {
33648                                 if (v[i].type === 'way' && v[i].id === wayA.id) {
33649                                     member = {
33650                                         id: wayB.id,
33651                                         type: 'way',
33652                                         role: 'via'
33653                                     };
33654                                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
33655                                     break;
33656                                 }
33657                             }
33658                         }
33659
33660                     // All other relations (Routes, Multipolygons, etc):
33661                     // 1. Both `wayA` and `wayB` remain in the relation
33662                     // 2. But must be inserted as a pair (see `actionAddMember` for details)
33663                     } else {
33664                         if (relation === isOuter) {
33665                             graph = graph.replace(relation.mergeTags(wayA.tags));
33666                             graph = graph.replace(wayA.update({ tags: {} }));
33667                             graph = graph.replace(wayB.update({ tags: {} }));
33668                         }
33669
33670                         member = {
33671                             id: wayB.id,
33672                             type: 'way',
33673                             role: relation.memberById(wayA.id).role
33674                         };
33675
33676                         var insertPair = {
33677                             originalID: wayA.id,
33678                             insertedID: wayB.id,
33679                             nodes: origNodes
33680                         };
33681
33682                         graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
33683                     }
33684                 });
33685
33686                 if (!isOuter && isArea) {
33687                     var multipolygon = osmRelation({
33688                         tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }),
33689                         members: [
33690                             { id: wayA.id, role: 'outer', type: 'way' },
33691                             { id: wayB.id, role: 'outer', type: 'way' }
33692                         ]
33693                     });
33694
33695                     graph = graph.replace(multipolygon);
33696                     graph = graph.replace(wayA.update({ tags: {} }));
33697                     graph = graph.replace(wayB.update({ tags: {} }));
33698                 }
33699
33700                 return graph;
33701             }
33702
33703
33704             var action = function(graph) {
33705                 var candidates = action.ways(graph);
33706                 for (var i = 0; i < candidates.length; i++) {
33707                     graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
33708                 }
33709                 return graph;
33710             };
33711
33712
33713             action.ways = function(graph) {
33714                 var node = graph.entity(nodeId);
33715                 var parents = graph.parentWays(node);
33716                 var hasLines = parents.some(function(parent) {
33717                     return parent.geometry(graph) === 'line';
33718                 });
33719
33720                 return parents.filter(function(parent) {
33721                     if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
33722                         return false;
33723
33724                     if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
33725                         return false;
33726
33727                     if (parent.isClosed()) {
33728                         return true;
33729                     }
33730
33731                     for (var i = 1; i < parent.nodes.length - 1; i++) {
33732                         if (parent.nodes[i] === nodeId) {
33733                             return true;
33734                         }
33735                     }
33736
33737                     return false;
33738                 });
33739             };
33740
33741
33742             action.disabled = function(graph) {
33743                 var candidates = action.ways(graph);
33744                 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) {
33745                     return 'not_eligible';
33746                 }
33747             };
33748
33749
33750             action.limitWays = function(val) {
33751                 if (!arguments.length) return _wayIDs;
33752                 _wayIDs = val;
33753                 return action;
33754             };
33755
33756
33757             return action;
33758         }
33759
33760         function coreGraph(other, mutable) {
33761             if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
33762
33763             if (other instanceof coreGraph) {
33764                 var base = other.base();
33765                 this.entities = Object.assign(Object.create(base.entities), other.entities);
33766                 this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
33767                 this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
33768
33769             } else {
33770                 this.entities = Object.create({});
33771                 this._parentWays = Object.create({});
33772                 this._parentRels = Object.create({});
33773                 this.rebase(other || [], [this]);
33774             }
33775
33776             this.transients = {};
33777             this._childNodes = {};
33778             this.frozen = !mutable;
33779         }
33780
33781
33782         coreGraph.prototype = {
33783
33784             hasEntity: function(id) {
33785                 return this.entities[id];
33786             },
33787
33788
33789             entity: function(id) {
33790                 var entity = this.entities[id];
33791
33792                 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
33793                 if (!entity) {
33794                     entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
33795                 }
33796
33797                 if (!entity) {
33798                     throw new Error('entity ' + id + ' not found');
33799                 }
33800                 return entity;
33801             },
33802
33803
33804             transient: function(entity, key, fn) {
33805                 var id = entity.id;
33806                 var transients = this.transients[id] || (this.transients[id] = {});
33807
33808                 if (transients[key] !== undefined) {
33809                     return transients[key];
33810                 }
33811
33812                 transients[key] = fn.call(entity);
33813
33814                 return transients[key];
33815             },
33816
33817
33818             parentWays: function(entity) {
33819                 var parents = this._parentWays[entity.id];
33820                 var result = [];
33821                 if (parents) {
33822                     parents.forEach(function(id) {
33823                         result.push(this.entity(id));
33824                     }, this);
33825                 }
33826                 return result;
33827             },
33828
33829
33830             isPoi: function(entity) {
33831                 var parents = this._parentWays[entity.id];
33832                 return !parents || parents.size === 0;
33833             },
33834
33835
33836             isShared: function(entity) {
33837                 var parents = this._parentWays[entity.id];
33838                 return parents && parents.size > 1;
33839             },
33840
33841
33842             parentRelations: function(entity) {
33843                 var parents = this._parentRels[entity.id];
33844                 var result = [];
33845                 if (parents) {
33846                     parents.forEach(function(id) {
33847                         result.push(this.entity(id));
33848                     }, this);
33849                 }
33850                 return result;
33851             },
33852
33853             parentMultipolygons: function(entity) {
33854                 return this.parentRelations(entity).filter(function(relation) {
33855                     return relation.isMultipolygon();
33856                 });
33857             },
33858
33859
33860             childNodes: function(entity) {
33861                 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
33862                 if (!entity.nodes) return [];
33863
33864                 var nodes = [];
33865                 for (var i = 0; i < entity.nodes.length; i++) {
33866                     nodes[i] = this.entity(entity.nodes[i]);
33867                 }
33868
33869                 this._childNodes[entity.id] = nodes;
33870                 return this._childNodes[entity.id];
33871             },
33872
33873
33874             base: function() {
33875                 return {
33876                     'entities': Object.getPrototypeOf(this.entities),
33877                     'parentWays': Object.getPrototypeOf(this._parentWays),
33878                     'parentRels': Object.getPrototypeOf(this._parentRels)
33879                 };
33880             },
33881
33882
33883             // Unlike other graph methods, rebase mutates in place. This is because it
33884             // is used only during the history operation that merges newly downloaded
33885             // data into each state. To external consumers, it should appear as if the
33886             // graph always contained the newly downloaded data.
33887             rebase: function(entities, stack, force) {
33888                 var base = this.base();
33889                 var i, j, k, id;
33890
33891                 for (i = 0; i < entities.length; i++) {
33892                     var entity = entities[i];
33893
33894                     if (!entity.visible || (!force && base.entities[entity.id]))
33895                         continue;
33896
33897                     // Merging data into the base graph
33898                     base.entities[entity.id] = entity;
33899                     this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
33900
33901                     // Restore provisionally-deleted nodes that are discovered to have an extant parent
33902                     if (entity.type === 'way') {
33903                         for (j = 0; j < entity.nodes.length; j++) {
33904                             id = entity.nodes[j];
33905                             for (k = 1; k < stack.length; k++) {
33906                                 var ents = stack[k].entities;
33907                                 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
33908                                     delete ents[id];
33909                                 }
33910                             }
33911                         }
33912                     }
33913                 }
33914
33915                 for (i = 0; i < stack.length; i++) {
33916                     stack[i]._updateRebased();
33917                 }
33918             },
33919
33920
33921             _updateRebased: function() {
33922                 var base = this.base();
33923
33924                 Object.keys(this._parentWays).forEach(function(child) {
33925                     if (base.parentWays[child]) {
33926                         base.parentWays[child].forEach(function(id) {
33927                             if (!this.entities.hasOwnProperty(id)) {
33928                                 this._parentWays[child].add(id);
33929                             }
33930                         }, this);
33931                     }
33932                 }, this);
33933
33934                 Object.keys(this._parentRels).forEach(function(child) {
33935                     if (base.parentRels[child]) {
33936                         base.parentRels[child].forEach(function(id) {
33937                             if (!this.entities.hasOwnProperty(id)) {
33938                                 this._parentRels[child].add(id);
33939                             }
33940                         }, this);
33941                     }
33942                 }, this);
33943
33944                 this.transients = {};
33945
33946                 // this._childNodes is not updated, under the assumption that
33947                 // ways are always downloaded with their child nodes.
33948             },
33949
33950
33951             // Updates calculated properties (parentWays, parentRels) for the specified change
33952             _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
33953                 parentWays = parentWays || this._parentWays;
33954                 parentRels = parentRels || this._parentRels;
33955
33956                 var type = entity && entity.type || oldentity && oldentity.type;
33957                 var removed, added, i;
33958
33959                 if (type === 'way') {   // Update parentWays
33960                     if (oldentity && entity) {
33961                         removed = utilArrayDifference(oldentity.nodes, entity.nodes);
33962                         added = utilArrayDifference(entity.nodes, oldentity.nodes);
33963                     } else if (oldentity) {
33964                         removed = oldentity.nodes;
33965                         added = [];
33966                     } else if (entity) {
33967                         removed = [];
33968                         added = entity.nodes;
33969                     }
33970                     for (i = 0; i < removed.length; i++) {
33971                         // make a copy of prototype property, store as own property, and update..
33972                         parentWays[removed[i]] = new Set(parentWays[removed[i]]);
33973                         parentWays[removed[i]].delete(oldentity.id);
33974                     }
33975                     for (i = 0; i < added.length; i++) {
33976                         // make a copy of prototype property, store as own property, and update..
33977                         parentWays[added[i]] = new Set(parentWays[added[i]]);
33978                         parentWays[added[i]].add(entity.id);
33979                     }
33980
33981                 } else if (type === 'relation') {   // Update parentRels
33982
33983                     // diff only on the IDs since the same entity can be a member multiple times with different roles
33984                     var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : [];
33985                     var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : [];
33986
33987                     if (oldentity && entity) {
33988                         removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
33989                         added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
33990                     } else if (oldentity) {
33991                         removed = oldentityMemberIDs;
33992                         added = [];
33993                     } else if (entity) {
33994                         removed = [];
33995                         added = entityMemberIDs;
33996                     }
33997                     for (i = 0; i < removed.length; i++) {
33998                         // make a copy of prototype property, store as own property, and update..
33999                         parentRels[removed[i]] = new Set(parentRels[removed[i]]);
34000                         parentRels[removed[i]].delete(oldentity.id);
34001                     }
34002                     for (i = 0; i < added.length; i++) {
34003                         // make a copy of prototype property, store as own property, and update..
34004                         parentRels[added[i]] = new Set(parentRels[added[i]]);
34005                         parentRels[added[i]].add(entity.id);
34006                     }
34007                 }
34008             },
34009
34010
34011             replace: function(entity) {
34012                 if (this.entities[entity.id] === entity) return this;
34013
34014                 return this.update(function() {
34015                     this._updateCalculated(this.entities[entity.id], entity);
34016                     this.entities[entity.id] = entity;
34017                 });
34018             },
34019
34020
34021             remove: function(entity) {
34022                 return this.update(function() {
34023                     this._updateCalculated(entity, undefined);
34024                     this.entities[entity.id] = undefined;
34025                 });
34026             },
34027
34028
34029             revert: function(id) {
34030                 var baseEntity = this.base().entities[id];
34031                 var headEntity = this.entities[id];
34032                 if (headEntity === baseEntity) return this;
34033
34034                 return this.update(function() {
34035                     this._updateCalculated(headEntity, baseEntity);
34036                     delete this.entities[id];
34037                 });
34038             },
34039
34040
34041             update: function() {
34042                 var graph = this.frozen ? coreGraph(this, true) : this;
34043                 for (var i = 0; i < arguments.length; i++) {
34044                     arguments[i].call(graph, graph);
34045                 }
34046
34047                 if (this.frozen) graph.frozen = true;
34048
34049                 return graph;
34050             },
34051
34052
34053             // Obliterates any existing entities
34054             load: function(entities) {
34055                 var base = this.base();
34056                 this.entities = Object.create(base.entities);
34057
34058                 for (var i in entities) {
34059                     this.entities[i] = entities[i];
34060                     this._updateCalculated(base.entities[i], this.entities[i]);
34061                 }
34062
34063                 return this;
34064             }
34065         };
34066
34067         function osmTurn(turn) {
34068             if (!(this instanceof osmTurn)) {
34069                 return new osmTurn(turn);
34070             }
34071             Object.assign(this, turn);
34072         }
34073
34074
34075         function osmIntersection(graph, startVertexId, maxDistance) {
34076             maxDistance = maxDistance || 30;    // in meters
34077             var vgraph = coreGraph();           // virtual graph
34078             var i, j, k;
34079
34080
34081             function memberOfRestriction(entity) {
34082                 return graph.parentRelations(entity)
34083                     .some(function(r) { return r.isRestriction(); });
34084             }
34085
34086             function isRoad(way) {
34087                 if (way.isArea() || way.isDegenerate()) return false;
34088                 var roads = {
34089                     'motorway': true,
34090                     'motorway_link': true,
34091                     'trunk': true,
34092                     'trunk_link': true,
34093                     'primary': true,
34094                     'primary_link': true,
34095                     'secondary': true,
34096                     'secondary_link': true,
34097                     'tertiary': true,
34098                     'tertiary_link': true,
34099                     'residential': true,
34100                     'unclassified': true,
34101                     'living_street': true,
34102                     'service': true,
34103                     'road': true,
34104                     'track': true
34105                 };
34106                 return roads[way.tags.highway];
34107             }
34108
34109
34110             var startNode = graph.entity(startVertexId);
34111             var checkVertices = [startNode];
34112             var checkWays;
34113             var vertices = [];
34114             var vertexIds = [];
34115             var vertex;
34116             var ways = [];
34117             var wayIds = [];
34118             var way;
34119             var nodes = [];
34120             var node;
34121             var parents = [];
34122             var parent;
34123
34124             // `actions` will store whatever actions must be performed to satisfy
34125             // preconditions for adding a turn restriction to this intersection.
34126             //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
34127             //  - Reverse oneways so that they are drawn in the forward direction
34128             //  - Split ways on key vertices
34129             var actions = [];
34130
34131
34132             // STEP 1:  walk the graph outwards from starting vertex to search
34133             //  for more key vertices and ways to include in the intersection..
34134
34135             while (checkVertices.length) {
34136                 vertex = checkVertices.pop();
34137
34138                 // check this vertex for parent ways that are roads
34139                 checkWays = graph.parentWays(vertex);
34140                 var hasWays = false;
34141                 for (i = 0; i < checkWays.length; i++) {
34142                     way = checkWays[i];
34143                     if (!isRoad(way) && !memberOfRestriction(way)) continue;
34144
34145                     ways.push(way);   // it's a road, or it's already in a turn restriction
34146                     hasWays = true;
34147
34148                     // check the way's children for more key vertices
34149                     nodes = utilArrayUniq(graph.childNodes(way));
34150                     for (j = 0; j < nodes.length; j++) {
34151                         node = nodes[j];
34152                         if (node === vertex) continue;                                           // same thing
34153                         if (vertices.indexOf(node) !== -1) continue;                             // seen it already
34154                         if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
34155
34156                         // a key vertex will have parents that are also roads
34157                         var hasParents = false;
34158                         parents = graph.parentWays(node);
34159                         for (k = 0; k < parents.length; k++) {
34160                             parent = parents[k];
34161                             if (parent === way) continue;                 // same thing
34162                             if (ways.indexOf(parent) !== -1) continue;    // seen it already
34163                             if (!isRoad(parent)) continue;                // not a road
34164                             hasParents = true;
34165                             break;
34166                         }
34167
34168                         if (hasParents) {
34169                             checkVertices.push(node);
34170                         }
34171                     }
34172                 }
34173
34174                 if (hasWays) {
34175                     vertices.push(vertex);
34176                 }
34177             }
34178
34179             vertices = utilArrayUniq(vertices);
34180             ways = utilArrayUniq(ways);
34181
34182
34183             // STEP 2:  Build a virtual graph containing only the entities in the intersection..
34184             // Everything done after this step should act on the virtual graph
34185             // Any actions that must be performed later to the main graph go in `actions` array
34186             ways.forEach(function(way) {
34187                 graph.childNodes(way).forEach(function(node) {
34188                     vgraph = vgraph.replace(node);
34189                 });
34190
34191                 vgraph = vgraph.replace(way);
34192
34193                 graph.parentRelations(way).forEach(function(relation) {
34194                     if (relation.isRestriction()) {
34195                         if (relation.isValidRestriction(graph)) {
34196                             vgraph = vgraph.replace(relation);
34197                         } else if (relation.isComplete(graph)) {
34198                             actions.push(actionDeleteRelation(relation.id));
34199                         }
34200                     }
34201                 });
34202             });
34203
34204
34205             // STEP 3:  Force all oneways to be drawn in the forward direction
34206             ways.forEach(function(w) {
34207                 var way = vgraph.entity(w.id);
34208                 if (way.tags.oneway === '-1') {
34209                     var action = actionReverse(way.id, { reverseOneway: true });
34210                     actions.push(action);
34211                     vgraph = action(vgraph);
34212                 }
34213             });
34214
34215
34216             // STEP 4:  Split ways on key vertices
34217             var origCount = osmEntity.id.next.way;
34218             vertices.forEach(function(v) {
34219                 // This is an odd way to do it, but we need to find all the ways that
34220                 // will be split here, then split them one at a time to ensure that these
34221                 // actions can be replayed on the main graph exactly in the same order.
34222                 // (It is unintuitive, but the order of ways returned from graph.parentWays()
34223                 // is arbitrary, depending on how the main graph and vgraph were built)
34224                 var splitAll = actionSplit(v.id);
34225                 if (!splitAll.disabled(vgraph)) {
34226                     splitAll.ways(vgraph).forEach(function(way) {
34227                         var splitOne = actionSplit(v.id).limitWays([way.id]);
34228                         actions.push(splitOne);
34229                         vgraph = splitOne(vgraph);
34230                     });
34231                 }
34232             });
34233
34234             // In here is where we should also split the intersection at nearby junction.
34235             //   for https://github.com/mapbox/iD-internal/issues/31
34236             // nearbyVertices.forEach(function(v) {
34237             // });
34238
34239             // Reasons why we reset the way id count here:
34240             //  1. Continuity with way ids created by the splits so that we can replay
34241             //     these actions later if the user decides to create a turn restriction
34242             //  2. Avoids churning way ids just by hovering over a vertex
34243             //     and displaying the turn restriction editor
34244             osmEntity.id.next.way = origCount;
34245
34246
34247             // STEP 5:  Update arrays to point to vgraph entities
34248             vertexIds = vertices.map(function(v) { return v.id; });
34249             vertices = [];
34250             ways = [];
34251
34252             vertexIds.forEach(function(id) {
34253                 var vertex = vgraph.entity(id);
34254                 var parents = vgraph.parentWays(vertex);
34255                 vertices.push(vertex);
34256                 ways = ways.concat(parents);
34257             });
34258
34259             vertices = utilArrayUniq(vertices);
34260             ways = utilArrayUniq(ways);
34261
34262             vertexIds = vertices.map(function(v) { return v.id; });
34263             wayIds = ways.map(function(w) { return w.id; });
34264
34265
34266             // STEP 6:  Update the ways with some metadata that will be useful for
34267             // walking the intersection graph later and rendering turn arrows.
34268
34269             function withMetadata(way, vertexIds) {
34270                 var __oneWay = way.isOneWay();
34271
34272                 // which affixes are key vertices?
34273                 var __first = (vertexIds.indexOf(way.first()) !== -1);
34274                 var __last = (vertexIds.indexOf(way.last()) !== -1);
34275
34276                 // what roles is this way eligible for?
34277                 var __via = (__first && __last);
34278                 var __from = ((__first && !__oneWay) || __last);
34279                 var __to = (__first || (__last && !__oneWay));
34280
34281                 return way.update({
34282                     __first:  __first,
34283                     __last:  __last,
34284                     __from:  __from,
34285                     __via: __via,
34286                     __to:  __to,
34287                     __oneWay:  __oneWay
34288                 });
34289             }
34290
34291             ways = [];
34292             wayIds.forEach(function(id) {
34293                 var way = withMetadata(vgraph.entity(id), vertexIds);
34294                 vgraph = vgraph.replace(way);
34295                 ways.push(way);
34296             });
34297
34298
34299             // STEP 7:  Simplify - This is an iterative process where we:
34300             //  1. Find trivial vertices with only 2 parents
34301             //  2. trim off the leaf way from those vertices and remove from vgraph
34302
34303             var keepGoing;
34304             var removeWayIds = [];
34305             var removeVertexIds = [];
34306
34307             do {
34308                 keepGoing = false;
34309                 checkVertices = vertexIds.slice();
34310
34311                 for (i = 0; i < checkVertices.length; i++) {
34312                     var vertexId = checkVertices[i];
34313                     vertex = vgraph.hasEntity(vertexId);
34314
34315                     if (!vertex) {
34316                         if (vertexIds.indexOf(vertexId) !== -1) {
34317                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34318                         }
34319                         removeVertexIds.push(vertexId);
34320                         continue;
34321                     }
34322
34323                     parents = vgraph.parentWays(vertex);
34324                     if (parents.length < 3) {
34325                         if (vertexIds.indexOf(vertexId) !== -1) {
34326                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34327                         }
34328                     }
34329
34330                     if (parents.length === 2) {     // vertex with 2 parents is trivial
34331                         var a = parents[0];
34332                         var b = parents[1];
34333                         var aIsLeaf = a && !a.__via;
34334                         var bIsLeaf = b && !b.__via;
34335                         var leaf, survivor;
34336
34337                         if (aIsLeaf && !bIsLeaf) {
34338                             leaf = a;
34339                             survivor = b;
34340                         } else if (!aIsLeaf && bIsLeaf) {
34341                             leaf = b;
34342                             survivor = a;
34343                         }
34344
34345                         if (leaf && survivor) {
34346                             survivor = withMetadata(survivor, vertexIds);      // update survivor way
34347                             vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
34348                             removeWayIds.push(leaf.id);
34349                             keepGoing = true;
34350                         }
34351                     }
34352
34353                     parents = vgraph.parentWays(vertex);
34354
34355                     if (parents.length < 2) {     // vertex is no longer a key vertex
34356                         if (vertexIds.indexOf(vertexId) !== -1) {
34357                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34358                         }
34359                         removeVertexIds.push(vertexId);
34360                         keepGoing = true;
34361                     }
34362
34363                     if (parents.length < 1) {     // vertex is no longer attached to anything
34364                         vgraph = vgraph.remove(vertex);
34365                     }
34366
34367                 }
34368             } while (keepGoing);
34369
34370
34371             vertices = vertices
34372                 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
34373                 .map(function(vertex) { return vgraph.entity(vertex.id); });
34374             ways = ways
34375                 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
34376                 .map(function(way) { return vgraph.entity(way.id); });
34377
34378
34379             // OK!  Here is our intersection..
34380             var intersection = {
34381                 graph: vgraph,
34382                 actions: actions,
34383                 vertices: vertices,
34384                 ways: ways,
34385             };
34386
34387
34388
34389             // Get all the valid turns through this intersection given a starting way id.
34390             // This operates on the virtual graph for everything.
34391             //
34392             // Basically, walk through all possible paths from starting way,
34393             //   honoring the existing turn restrictions as we go (watch out for loops!)
34394             //
34395             // For each path found, generate and return a `osmTurn` datastructure.
34396             //
34397             intersection.turns = function(fromWayId, maxViaWay) {
34398                 if (!fromWayId) return [];
34399                 if (!maxViaWay) maxViaWay = 0;
34400
34401                 var vgraph = intersection.graph;
34402                 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
34403
34404                 var start = vgraph.entity(fromWayId);
34405                 if (!start || !(start.__from || start.__via)) return [];
34406
34407                 // maxViaWay=0   from-*-to              (0 vias)
34408                 // maxViaWay=1   from-*-via-*-to        (1 via max)
34409                 // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
34410                 var maxPathLength = (maxViaWay * 2) + 3;
34411                 var turns = [];
34412
34413                 step(start);
34414                 return turns;
34415
34416
34417                 // traverse the intersection graph and find all the valid paths
34418                 function step(entity, currPath, currRestrictions, matchedRestriction) {
34419                     currPath = (currPath || []).slice();  // shallow copy
34420                     if (currPath.length >= maxPathLength) return;
34421                     currPath.push(entity.id);
34422                     currRestrictions = (currRestrictions || []).slice();  // shallow copy
34423                     var i, j;
34424
34425                     if (entity.type === 'node') {
34426                         var parents = vgraph.parentWays(entity);
34427                         var nextWays = [];
34428
34429                         // which ways can we step into?
34430                         for (i = 0; i < parents.length; i++) {
34431                             var way = parents[i];
34432
34433                             // if next way is a oneway incoming to this vertex, skip
34434                             if (way.__oneWay && way.nodes[0] !== entity.id) continue;
34435
34436                             // if we have seen it before (allowing for an initial u-turn), skip
34437                             if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
34438
34439                             // Check all "current" restrictions (where we've already walked the `FROM`)
34440                             var restrict = undefined;
34441                             for (j = 0; j < currRestrictions.length; j++) {
34442                                 var restriction = currRestrictions[j];
34443                                 var f = restriction.memberByRole('from');
34444                                 var v = restriction.membersByRole('via');
34445                                 var t = restriction.memberByRole('to');
34446                                 var isOnly = /^only_/.test(restriction.tags.restriction);
34447
34448                                 // Does the current path match this turn restriction?
34449                                 var matchesFrom = (f.id === fromWayId);
34450                                 var matchesViaTo = false;
34451                                 var isAlongOnlyPath = false;
34452
34453                                 if (t.id === way.id) {     // match TO
34454
34455                                     if (v.length === 1 && v[0].type === 'node') {    // match VIA node
34456                                         matchesViaTo = (v[0].id === entity.id && (
34457                                             (matchesFrom && currPath.length === 2) ||
34458                                             (!matchesFrom && currPath.length > 2)
34459                                         ));
34460
34461                                     } else {                                         // match all VIA ways
34462                                         var pathVias = [];
34463                                         for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
34464                                             pathVias.push(currPath[k]);              // (path goes way-node-way...)
34465                                         }
34466                                         var restrictionVias = [];
34467                                         for (k = 0; k < v.length; k++) {
34468                                             if (v[k].type === 'way') {
34469                                                 restrictionVias.push(v[k].id);
34470                                             }
34471                                         }
34472                                         var diff = utilArrayDifference(pathVias, restrictionVias);
34473                                         matchesViaTo = !diff.length;
34474                                     }
34475
34476                                 } else if (isOnly) {
34477                                     for (k = 0; k < v.length; k++) {
34478                                         // way doesn't match TO, but is one of the via ways along the path of an "only"
34479                                         if (v[k].type === 'way' && v[k].id === way.id) {
34480                                             isAlongOnlyPath = true;
34481                                             break;
34482                                         }
34483                                     }
34484                                 }
34485
34486                                 if (matchesViaTo) {
34487                                     if (isOnly) {
34488                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
34489                                     } else {
34490                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
34491                                     }
34492                                 } else {    // indirect - caused by a different nearby restriction
34493                                     if (isAlongOnlyPath) {
34494                                         restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
34495                                     } else if (isOnly) {
34496                                         restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
34497                                     }
34498                                 }
34499
34500                                 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
34501                                 if (restrict && restrict.direct)
34502                                     break;
34503                             }
34504
34505                             nextWays.push({ way: way, restrict: restrict });
34506                         }
34507
34508                         nextWays.forEach(function(nextWay) {
34509                             step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
34510                         });
34511
34512
34513                     } else {  // entity.type === 'way'
34514                         if (currPath.length >= 3) {     // this is a "complete" path..
34515                             var turnPath = currPath.slice();   // shallow copy
34516
34517                             // an indirect restriction - only include the partial path (starting at FROM)
34518                             if (matchedRestriction && matchedRestriction.direct === false) {
34519                                 for (i = 0; i < turnPath.length; i++) {
34520                                     if (turnPath[i] === matchedRestriction.from) {
34521                                         turnPath = turnPath.slice(i);
34522                                         break;
34523                                     }
34524                                 }
34525                             }
34526
34527                             var turn = pathToTurn(turnPath);
34528                             if (turn) {
34529                                 if (matchedRestriction) {
34530                                     turn.restrictionID = matchedRestriction.id;
34531                                     turn.no = matchedRestriction.no;
34532                                     turn.only = matchedRestriction.only;
34533                                     turn.direct = matchedRestriction.direct;
34534                                 }
34535                                 turns.push(osmTurn(turn));
34536                             }
34537
34538                             if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
34539                         }
34540
34541                         if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
34542
34543                         // which nodes can we step into?
34544                         var n1 = vgraph.entity(entity.first());
34545                         var n2 = vgraph.entity(entity.last());
34546                         var dist = geoSphericalDistance(n1.loc, n2.loc);
34547                         var nextNodes = [];
34548
34549                         if (currPath.length > 1) {
34550                             if (dist > maxDistance) return;   // the next node is too far
34551                             if (!entity.__via) return;        // this way is a leaf / can't be a via
34552                         }
34553
34554                         if (!entity.__oneWay &&                     // bidirectional..
34555                             keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
34556                             currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
34557                             nextNodes.push(n1);                     // can advance to first node
34558                         }
34559                         if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
34560                             currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
34561                             nextNodes.push(n2);                     // can advance to last node
34562                         }
34563
34564                         nextNodes.forEach(function(nextNode) {
34565                             // gather restrictions FROM this way
34566                             var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
34567                                 if (!r.isRestriction()) return false;
34568
34569                                 var f = r.memberByRole('from');
34570                                 if (!f || f.id !== entity.id) return false;
34571
34572                                 var isOnly = /^only_/.test(r.tags.restriction);
34573                                 if (!isOnly) return true;
34574
34575                                 // `only_` restrictions only matter along the direction of the VIA - #4849
34576                                 var isOnlyVia = false;
34577                                 var v = r.membersByRole('via');
34578                                 if (v.length === 1 && v[0].type === 'node') {   // via node
34579                                     isOnlyVia = (v[0].id === nextNode.id);
34580                                 } else {                                        // via way(s)
34581                                     for (var i = 0; i < v.length; i++) {
34582                                         if (v[i].type !== 'way') continue;
34583                                         var viaWay = vgraph.entity(v[i].id);
34584                                         if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
34585                                             isOnlyVia = true;
34586                                             break;
34587                                         }
34588                                     }
34589                                 }
34590                                 return isOnlyVia;
34591                             });
34592
34593                             step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
34594                         });
34595                     }
34596                 }
34597
34598
34599                 // assumes path is alternating way-node-way of odd length
34600                 function pathToTurn(path) {
34601                     if (path.length < 3) return;
34602                     var fromWayId, fromNodeId, fromVertexId;
34603                     var toWayId, toNodeId, toVertexId;
34604                     var viaWayIds, viaNodeId, isUturn;
34605
34606                     fromWayId = path[0];
34607                     toWayId = path[path.length - 1];
34608
34609                     if (path.length === 3 && fromWayId === toWayId) {  // u turn
34610                         var way = vgraph.entity(fromWayId);
34611                         if (way.__oneWay) return null;
34612
34613                         isUturn = true;
34614                         viaNodeId = fromVertexId = toVertexId = path[1];
34615                         fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
34616
34617                     } else {
34618                         isUturn = false;
34619                         fromVertexId = path[1];
34620                         fromNodeId = adjacentNode(fromWayId, fromVertexId);
34621                         toVertexId = path[path.length - 2];
34622                         toNodeId = adjacentNode(toWayId, toVertexId);
34623
34624                         if (path.length === 3) {
34625                             viaNodeId = path[1];
34626                         } else {
34627                             viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
34628                             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
34629                         }
34630                     }
34631
34632                     return {
34633                         key:  path.join('_'),
34634                         path: path,
34635                         from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
34636                         via:  { node: viaNodeId,  ways: viaWayIds },
34637                         to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
34638                         u:    isUturn
34639                     };
34640
34641
34642                     function adjacentNode(wayId, affixId) {
34643                         var nodes = vgraph.entity(wayId).nodes;
34644                         return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
34645                     }
34646                 }
34647
34648             };
34649
34650             return intersection;
34651         }
34652
34653
34654         function osmInferRestriction(graph, turn, projection) {
34655             var fromWay = graph.entity(turn.from.way);
34656             var fromNode = graph.entity(turn.from.node);
34657             var fromVertex = graph.entity(turn.from.vertex);
34658             var toWay = graph.entity(turn.to.way);
34659             var toNode = graph.entity(turn.to.node);
34660             var toVertex = graph.entity(turn.to.vertex);
34661
34662             var fromOneWay = (fromWay.tags.oneway === 'yes');
34663             var toOneWay = (toWay.tags.oneway === 'yes');
34664             var angle = (geoAngle(fromVertex, fromNode, projection) -
34665                         geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
34666
34667             while (angle < 0)
34668                 angle += 360;
34669
34670             if (fromNode === toNode)
34671                 return 'no_u_turn';
34672             if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
34673                 return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
34674             if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
34675                 return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
34676             if (angle < 158)
34677                 return 'no_right_turn';
34678             if (angle > 202)
34679                 return 'no_left_turn';
34680
34681             return 'no_straight_on';
34682         }
34683
34684         function actionMergePolygon(ids, newRelationId) {
34685
34686             function groupEntities(graph) {
34687                 var entities = ids.map(function (id) { return graph.entity(id); });
34688                 var geometryGroups = utilArrayGroupBy(entities, function(entity) {
34689                     if (entity.type === 'way' && entity.isClosed()) {
34690                         return 'closedWay';
34691                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
34692                         return 'multipolygon';
34693                     } else {
34694                         return 'other';
34695                     }
34696                 });
34697
34698                 return Object.assign(
34699                     { closedWay: [], multipolygon: [], other: [] },
34700                     geometryGroups
34701                 );
34702             }
34703
34704
34705             var action = function(graph) {
34706                 var entities = groupEntities(graph);
34707
34708                 // An array representing all the polygons that are part of the multipolygon.
34709                 //
34710                 // Each element is itself an array of objects with an id property, and has a
34711                 // locs property which is an array of the locations forming the polygon.
34712                 var polygons = entities.multipolygon.reduce(function(polygons, m) {
34713                     return polygons.concat(osmJoinWays(m.members, graph));
34714                 }, []).concat(entities.closedWay.map(function(d) {
34715                     var member = [{id: d.id}];
34716                     member.nodes = graph.childNodes(d);
34717                     return member;
34718                 }));
34719
34720                 // contained is an array of arrays of boolean values,
34721                 // where contained[j][k] is true iff the jth way is
34722                 // contained by the kth way.
34723                 var contained = polygons.map(function(w, i) {
34724                     return polygons.map(function(d, n) {
34725                         if (i === n) return null;
34726                         return geoPolygonContainsPolygon(
34727                             d.nodes.map(function(n) { return n.loc; }),
34728                             w.nodes.map(function(n) { return n.loc; })
34729                         );
34730                     });
34731                 });
34732
34733                 // Sort all polygons as either outer or inner ways
34734                 var members = [];
34735                 var outer = true;
34736
34737                 while (polygons.length) {
34738                     extractUncontained(polygons);
34739                     polygons = polygons.filter(isContained);
34740                     contained = contained.filter(isContained).map(filterContained);
34741                 }
34742
34743                 function isContained(d, i) {
34744                     return contained[i].some(function(val) { return val; });
34745                 }
34746
34747                 function filterContained(d) {
34748                     return d.filter(isContained);
34749                 }
34750
34751                 function extractUncontained(polygons) {
34752                     polygons.forEach(function(d, i) {
34753                         if (!isContained(d, i)) {
34754                             d.forEach(function(member) {
34755                                 members.push({
34756                                     type: 'way',
34757                                     id: member.id,
34758                                     role: outer ? 'outer' : 'inner'
34759                                 });
34760                             });
34761                         }
34762                     });
34763                     outer = !outer;
34764                 }
34765
34766                 // Move all tags to one relation
34767                 var relation = entities.multipolygon[0] ||
34768                     osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
34769
34770                 entities.multipolygon.slice(1).forEach(function(m) {
34771                     relation = relation.mergeTags(m.tags);
34772                     graph = graph.remove(m);
34773                 });
34774
34775                 entities.closedWay.forEach(function(way) {
34776                     function isThisOuter(m) {
34777                         return m.id === way.id && m.role !== 'inner';
34778                     }
34779                     if (members.some(isThisOuter)) {
34780                         relation = relation.mergeTags(way.tags);
34781                         graph = graph.replace(way.update({ tags: {} }));
34782                     }
34783                 });
34784
34785                 return graph.replace(relation.update({
34786                     members: members,
34787                     tags: utilObjectOmit(relation.tags, ['area'])
34788                 }));
34789             };
34790
34791
34792             action.disabled = function(graph) {
34793                 var entities = groupEntities(graph);
34794                 if (entities.other.length > 0 ||
34795                     entities.closedWay.length + entities.multipolygon.length < 2)
34796                     return 'not_eligible';
34797                 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
34798                     return 'incomplete_relation';
34799             };
34800
34801
34802             return action;
34803         }
34804
34805         var isArray$3 = Array.isArray;
34806         var keyList = Object.keys;
34807         var hasProp = Object.prototype.hasOwnProperty;
34808
34809         var fastDeepEqual = function equal(a, b) {
34810           if (a === b) return true;
34811
34812           if (a && b && typeof a == 'object' && typeof b == 'object') {
34813             var arrA = isArray$3(a)
34814               , arrB = isArray$3(b)
34815               , i
34816               , length
34817               , key;
34818
34819             if (arrA && arrB) {
34820               length = a.length;
34821               if (length != b.length) return false;
34822               for (i = length; i-- !== 0;)
34823                 if (!equal(a[i], b[i])) return false;
34824               return true;
34825             }
34826
34827             if (arrA != arrB) return false;
34828
34829             var dateA = a instanceof Date
34830               , dateB = b instanceof Date;
34831             if (dateA != dateB) return false;
34832             if (dateA && dateB) return a.getTime() == b.getTime();
34833
34834             var regexpA = a instanceof RegExp
34835               , regexpB = b instanceof RegExp;
34836             if (regexpA != regexpB) return false;
34837             if (regexpA && regexpB) return a.toString() == b.toString();
34838
34839             var keys = keyList(a);
34840             length = keys.length;
34841
34842             if (length !== keyList(b).length)
34843               return false;
34844
34845             for (i = length; i-- !== 0;)
34846               if (!hasProp.call(b, keys[i])) return false;
34847
34848             for (i = length; i-- !== 0;) {
34849               key = keys[i];
34850               if (!equal(a[key], b[key])) return false;
34851             }
34852
34853             return true;
34854           }
34855
34856           return a!==a && b!==b;
34857         };
34858
34859         // Text diff algorithm following Hunt and McIlroy 1976.
34860         // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
34861         // comparison, Bell Telephone Laboratories CSTR #41 (1976)
34862         // http://www.cs.dartmouth.edu/~doug/
34863         //
34864         // Expects two arrays of strings.
34865         function LCS(file1, file2) {
34866           var equivalenceClasses;
34867           var file2indices;
34868           var newCandidate;
34869           var candidates;
34870           var line;
34871           var c, i, j, jX, r, s;
34872
34873           equivalenceClasses = {};
34874           for (j = 0; j < file2.length; j++) {
34875             line = file2[j];
34876             if (equivalenceClasses[line]) {
34877               equivalenceClasses[line].push(j);
34878             } else {
34879               equivalenceClasses[line] = [j];
34880             }
34881           }
34882
34883           candidates = [
34884             { file1index: -1, file2index: -1, chain: null }
34885           ];
34886
34887           for (i = 0; i < file1.length; i++) {
34888             line = file1[i];
34889             file2indices = equivalenceClasses[line] || [];
34890
34891             r = 0;
34892             c = candidates[0];
34893
34894             for (jX = 0; jX < file2indices.length; jX++) {
34895               j = file2indices[jX];
34896
34897               for (s = r; s < candidates.length; s++) {
34898                 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
34899                   break;
34900                 }
34901               }
34902
34903               if (s < candidates.length) {
34904                 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
34905                 if (r === candidates.length) {
34906                   candidates.push(c);
34907                 } else {
34908                   candidates[r] = c;
34909                 }
34910                 r = s + 1;
34911                 c = newCandidate;
34912                 if (r === candidates.length) {
34913                   break; // no point in examining further (j)s
34914                 }
34915               }
34916             }
34917
34918             candidates[r] = c;
34919           }
34920
34921           // At this point, we know the LCS: it's in the reverse of the
34922           // linked-list through .chain of candidates[candidates.length - 1].
34923
34924           return candidates[candidates.length - 1];
34925         }
34926
34927
34928         // We apply the LCS to give a simple representation of the
34929         // offsets and lengths of mismatched chunks in the input
34930         // files. This is used by diff3MergeIndices below.
34931         function diffIndices(file1, file2) {
34932           var result = [];
34933           var tail1 = file1.length;
34934           var tail2 = file2.length;
34935
34936           for (var candidate = LCS(file1, file2);
34937              candidate !== null;
34938              candidate = candidate.chain)
34939           {
34940             var mismatchLength1 = tail1 - candidate.file1index - 1;
34941             var mismatchLength2 = tail2 - candidate.file2index - 1;
34942             tail1 = candidate.file1index;
34943             tail2 = candidate.file2index;
34944
34945             if (mismatchLength1 || mismatchLength2) {
34946               result.push({
34947                 file1: [tail1 + 1, mismatchLength1],
34948                 file2: [tail2 + 1, mismatchLength2]
34949               });
34950             }
34951           }
34952
34953           result.reverse();
34954           return result;
34955         }
34956
34957
34958         // Given three files, A, O, and B, where both A and B are
34959         // independently derived from O, returns a fairly complicated
34960         // internal representation of merge decisions it's taken. The
34961         // interested reader may wish to consult
34962         //
34963         // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
34964         // 'A Formal Investigation of ' In Arvind and Prasad,
34965         // editors, Foundations of Software Technology and Theoretical
34966         // Computer Science (FSTTCS), December 2007.
34967         //
34968         // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
34969         function diff3MergeIndices(a, o, b) {
34970           var i;
34971           var m1 = diffIndices(o, a);
34972           var m2 = diffIndices(o, b);
34973
34974           var hunks = [];
34975           function addHunk(h, side) {
34976             hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
34977           }
34978           for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
34979           for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
34980           hunks.sort(function (x, y) { return x[0] - y[0]; });
34981
34982           var result = [];
34983           var commonOffset = 0;
34984           function copyCommon(targetOffset) {
34985             if (targetOffset > commonOffset) {
34986               result.push([1, commonOffset, targetOffset - commonOffset]);
34987               commonOffset = targetOffset;
34988             }
34989           }
34990
34991           for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
34992             var firstHunkIndex = hunkIndex;
34993             var hunk = hunks[hunkIndex];
34994             var regionLhs = hunk[0];
34995             var regionRhs = regionLhs + hunk[2];
34996             while (hunkIndex < hunks.length - 1) {
34997               var maybeOverlapping = hunks[hunkIndex + 1];
34998               var maybeLhs = maybeOverlapping[0];
34999               if (maybeLhs > regionRhs) {
35000                 break;
35001               }
35002               regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
35003               hunkIndex++;
35004             }
35005
35006             copyCommon(regionLhs);
35007             if (firstHunkIndex === hunkIndex) {
35008               // The 'overlap' was only one hunk long, meaning that
35009               // there's no conflict here. Either a and o were the
35010               // same, or b and o were the same.
35011               if (hunk[4] > 0) {
35012                 result.push([hunk[1], hunk[3], hunk[4]]);
35013               }
35014             } else {
35015               // A proper conflict. Determine the extents of the
35016               // regions involved from a, o and b. Effectively merge
35017               // all the hunks on the left into one giant hunk, and
35018               // do the same for the right; then, correct for skew
35019               // in the regions of o that each side changed, and
35020               // report appropriate spans for the three sides.
35021               var regions = {
35022                 0: [a.length, -1, o.length, -1],
35023                 2: [b.length, -1, o.length, -1]
35024               };
35025               for (i = firstHunkIndex; i <= hunkIndex; i++) {
35026                 hunk = hunks[i];
35027                 var side = hunk[1];
35028                 var r = regions[side];
35029                 var oLhs = hunk[0];
35030                 var oRhs = oLhs + hunk[2];
35031                 var abLhs = hunk[3];
35032                 var abRhs = abLhs + hunk[4];
35033                 r[0] = Math.min(abLhs, r[0]);
35034                 r[1] = Math.max(abRhs, r[1]);
35035                 r[2] = Math.min(oLhs, r[2]);
35036                 r[3] = Math.max(oRhs, r[3]);
35037               }
35038               var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
35039               var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
35040               var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
35041               var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
35042               result.push([-1,
35043                            aLhs,      aRhs      - aLhs,
35044                            regionLhs, regionRhs - regionLhs,
35045                            bLhs,      bRhs      - bLhs]);
35046             }
35047             commonOffset = regionRhs;
35048           }
35049
35050           copyCommon(o.length);
35051           return result;
35052         }
35053
35054
35055         // Applies the output of diff3MergeIndices to actually
35056         // construct the merged file; the returned result alternates
35057         // between 'ok' and 'conflict' blocks.
35058         function diff3Merge(a, o, b, excludeFalseConflicts) {
35059           var result = [];
35060           var files = [a, o, b];
35061           var indices = diff3MergeIndices(a, o, b);
35062
35063           var okLines = [];
35064           function flushOk() {
35065             if (okLines.length) {
35066               result.push({ok: okLines});
35067             }
35068             okLines = [];
35069           }
35070           function pushOk(xs) {
35071             for (var j = 0; j < xs.length; j++) {
35072               okLines.push(xs[j]);
35073             }
35074           }
35075
35076           function isTrueConflict(rec) {
35077             if (rec[2] !== rec[6]) return true;
35078             var aoff = rec[1];
35079             var boff = rec[5];
35080             for (var j = 0; j < rec[2]; j++) {
35081               if (a[j + aoff] !== b[j + boff]) {
35082                 return true;
35083               }
35084             }
35085             return false;
35086           }
35087
35088           for (var i = 0; i < indices.length; i++) {
35089             var x = indices[i];
35090             var side = x[0];
35091             if (side === -1) {
35092               if (excludeFalseConflicts && !isTrueConflict(x)) {
35093                 pushOk(files[0].slice(x[1], x[1] + x[2]));
35094               } else {
35095                 flushOk();
35096                 result.push({
35097                   conflict: {
35098                     a: a.slice(x[1], x[1] + x[2]),
35099                     aIndex: x[1],
35100                     o: o.slice(x[3], x[3] + x[4]),
35101                     oIndex: x[3],
35102                     b: b.slice(x[5], x[5] + x[6]),
35103                     bIndex: x[5]
35104                   }
35105                 });
35106               }
35107             } else {
35108               pushOk(files[side].slice(x[1], x[1] + x[2]));
35109             }
35110           }
35111
35112           flushOk();
35113           return result;
35114         }
35115
35116         function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
35117             var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
35118             var _conflicts = [];
35119
35120
35121             function user(d) {
35122                 return (typeof formatUser === 'function') ? formatUser(d) : d;
35123             }
35124
35125
35126             function mergeLocation(remote, target) {
35127                 function pointEqual(a, b) {
35128                     var epsilon = 1e-6;
35129                     return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
35130                 }
35131
35132                 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
35133                     return target;
35134                 }
35135                 if (_option === 'force_remote') {
35136                     return target.update({loc: remote.loc});
35137                 }
35138
35139                 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
35140                 return target;
35141             }
35142
35143
35144             function mergeNodes(base, remote, target) {
35145                 if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
35146                     return target;
35147                 }
35148                 if (_option === 'force_remote') {
35149                     return target.update({nodes: remote.nodes});
35150                 }
35151
35152                 var ccount = _conflicts.length;
35153                 var o = base.nodes || [];
35154                 var a = target.nodes || [];
35155                 var b = remote.nodes || [];
35156                 var nodes = [];
35157                 var hunks = diff3Merge(a, o, b, true);
35158
35159                 for (var i = 0; i < hunks.length; i++) {
35160                     var hunk = hunks[i];
35161                     if (hunk.ok) {
35162                         nodes.push.apply(nodes, hunk.ok);
35163                     } else {
35164                         // for all conflicts, we can assume c.a !== c.b
35165                         // because `diff3Merge` called with `true` option to exclude false conflicts..
35166                         var c = hunk.conflict;
35167                         if (fastDeepEqual(c.o, c.a)) {  // only changed remotely
35168                             nodes.push.apply(nodes, c.b);
35169                         } else if (fastDeepEqual(c.o, c.b)) {  // only changed locally
35170                             nodes.push.apply(nodes, c.a);
35171                         } else {       // changed both locally and remotely
35172                             _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
35173                             break;
35174                         }
35175                     }
35176                 }
35177
35178                 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
35179             }
35180
35181
35182             function mergeChildren(targetWay, children, updates, graph) {
35183                 function isUsed(node, targetWay) {
35184                     var hasInterestingParent = graph.parentWays(node)
35185                         .some(function(way) { return way.id !== targetWay.id; });
35186
35187                     return node.hasInterestingTags() ||
35188                         hasInterestingParent ||
35189                         graph.parentRelations(node).length > 0;
35190                 }
35191
35192                 var ccount = _conflicts.length;
35193
35194                 for (var i = 0; i < children.length; i++) {
35195                     var id = children[i];
35196                     var node = graph.hasEntity(id);
35197
35198                     // remove unused childNodes..
35199                     if (targetWay.nodes.indexOf(id) === -1) {
35200                         if (node && !isUsed(node, targetWay)) {
35201                             updates.removeIds.push(id);
35202                         }
35203                         continue;
35204                     }
35205
35206                     // restore used childNodes..
35207                     var local = localGraph.hasEntity(id);
35208                     var remote = remoteGraph.hasEntity(id);
35209                     var target;
35210
35211                     if (_option === 'force_remote' && remote && remote.visible) {
35212                         updates.replacements.push(remote);
35213
35214                     } else if (_option === 'force_local' && local) {
35215                         target = osmEntity(local);
35216                         if (remote) {
35217                             target = target.update({ version: remote.version });
35218                         }
35219                         updates.replacements.push(target);
35220
35221                     } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
35222                         target = osmEntity(local, { version: remote.version });
35223                         if (remote.visible) {
35224                             target = mergeLocation(remote, target);
35225                         } else {
35226                             _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35227                         }
35228
35229                         if (_conflicts.length !== ccount) break;
35230                         updates.replacements.push(target);
35231                     }
35232                 }
35233
35234                 return targetWay;
35235             }
35236
35237
35238             function updateChildren(updates, graph) {
35239                 for (var i = 0; i < updates.replacements.length; i++) {
35240                     graph = graph.replace(updates.replacements[i]);
35241                 }
35242                 if (updates.removeIds.length) {
35243                     graph = actionDeleteMultiple(updates.removeIds)(graph);
35244                 }
35245                 return graph;
35246             }
35247
35248
35249             function mergeMembers(remote, target) {
35250                 if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
35251                     return target;
35252                 }
35253                 if (_option === 'force_remote') {
35254                     return target.update({members: remote.members});
35255                 }
35256
35257                 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
35258                 return target;
35259             }
35260
35261
35262             function mergeTags(base, remote, target) {
35263                 if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
35264                     return target;
35265                 }
35266                 if (_option === 'force_remote') {
35267                     return target.update({tags: remote.tags});
35268                 }
35269
35270                 var ccount = _conflicts.length;
35271                 var o = base.tags || {};
35272                 var a = target.tags || {};
35273                 var b = remote.tags || {};
35274                 var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b))
35275                     .filter(function(k) { return !dataDiscarded[k]; });
35276                 var tags = Object.assign({}, a);   // shallow copy
35277                 var changed = false;
35278
35279                 for (var i = 0; i < keys.length; i++) {
35280                     var k = keys[i];
35281
35282                     if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
35283                         if (o[k] !== a[k]) {      // changed locally..
35284                             _conflicts.push(t('merge_remote_changes.conflict.tags',
35285                                 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
35286
35287                         } else {                  // unchanged locally, accept remote change..
35288                             if (b.hasOwnProperty(k)) {
35289                                 tags[k] = b[k];
35290                             } else {
35291                                 delete tags[k];
35292                             }
35293                             changed = true;
35294                         }
35295                     }
35296                 }
35297
35298                 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
35299             }
35300
35301
35302             //  `graph.base()` is the common ancestor of the two graphs.
35303             //  `localGraph` contains user's edits up to saving
35304             //  `remoteGraph` contains remote edits to modified nodes
35305             //  `graph` must be a descendent of `localGraph` and may include
35306             //      some conflict resolution actions performed on it.
35307             //
35308             //                  --- ... --- `localGraph` -- ... -- `graph`
35309             //                 /
35310             //  `graph.base()` --- ... --- `remoteGraph`
35311             //
35312             var action = function(graph) {
35313                 var updates = { replacements: [], removeIds: [] };
35314                 var base = graph.base().entities[id];
35315                 var local = localGraph.entity(id);
35316                 var remote = remoteGraph.entity(id);
35317                 var target = osmEntity(local, { version: remote.version });
35318
35319                 // delete/undelete
35320                 if (!remote.visible) {
35321                     if (_option === 'force_remote') {
35322                         return actionDeleteMultiple([id])(graph);
35323
35324                     } else if (_option === 'force_local') {
35325                         if (target.type === 'way') {
35326                             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
35327                             graph = updateChildren(updates, graph);
35328                         }
35329                         return graph.replace(target);
35330
35331                     } else {
35332                         _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35333                         return graph;  // do nothing
35334                     }
35335                 }
35336
35337                 // merge
35338                 if (target.type === 'node') {
35339                     target = mergeLocation(remote, target);
35340
35341                 } else if (target.type === 'way') {
35342                     // pull in any child nodes that may not be present locally..
35343                     graph.rebase(remoteGraph.childNodes(remote), [graph], false);
35344                     target = mergeNodes(base, remote, target);
35345                     target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
35346
35347                 } else if (target.type === 'relation') {
35348                     target = mergeMembers(remote, target);
35349                 }
35350
35351                 target = mergeTags(base, remote, target);
35352
35353                 if (!_conflicts.length) {
35354                     graph = updateChildren(updates, graph).replace(target);
35355                 }
35356
35357                 return graph;
35358             };
35359
35360
35361             action.withOption = function(opt) {
35362                 _option = opt;
35363                 return action;
35364             };
35365
35366
35367             action.conflicts = function() {
35368                 return _conflicts;
35369             };
35370
35371
35372             return action;
35373         }
35374
35375         // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
35376         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
35377         function actionMove(moveIDs, tryDelta, projection, cache) {
35378             var _delta = tryDelta;
35379
35380             function setupCache(graph) {
35381                 function canMove(nodeID) {
35382                     // Allow movement of any node that is in the selectedIDs list..
35383                     if (moveIDs.indexOf(nodeID) !== -1) return true;
35384
35385                     // Allow movement of a vertex where 2 ways meet..
35386                     var parents = graph.parentWays(graph.entity(nodeID));
35387                     if (parents.length < 3) return true;
35388
35389                     // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
35390                     var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; });
35391                     if (!parentsMoving) delete cache.moving[nodeID];
35392
35393                     return parentsMoving;
35394                 }
35395
35396                 function cacheEntities(ids) {
35397                     for (var i = 0; i < ids.length; i++) {
35398                         var id = ids[i];
35399                         if (cache.moving[id]) continue;
35400                         cache.moving[id] = true;
35401
35402                         var entity = graph.hasEntity(id);
35403                         if (!entity) continue;
35404
35405                         if (entity.type === 'node') {
35406                             cache.nodes.push(id);
35407                             cache.startLoc[id] = entity.loc;
35408                         } else if (entity.type === 'way') {
35409                             cache.ways.push(id);
35410                             cacheEntities(entity.nodes);
35411                         } else {
35412                             cacheEntities(entity.members.map(function(member) {
35413                                 return member.id;
35414                             }));
35415                         }
35416                     }
35417                 }
35418
35419                 function cacheIntersections(ids) {
35420                     function isEndpoint(way, id) {
35421                         return !way.isClosed() && !!way.affix(id);
35422                     }
35423
35424                     for (var i = 0; i < ids.length; i++) {
35425                         var id = ids[i];
35426
35427                         // consider only intersections with 1 moved and 1 unmoved way.
35428                         var childNodes = graph.childNodes(graph.entity(id));
35429                         for (var j = 0; j < childNodes.length; j++) {
35430                             var node = childNodes[j];
35431                             var parents = graph.parentWays(node);
35432                             if (parents.length !== 2) continue;
35433
35434                             var moved = graph.entity(id);
35435                             var unmoved = null;
35436                             for (var k = 0; k < parents.length; k++) {
35437                                 var way = parents[k];
35438                                 if (!cache.moving[way.id]) {
35439                                     unmoved = way;
35440                                     break;
35441                                 }
35442                             }
35443                             if (!unmoved) continue;
35444
35445                             // exclude ways that are overly connected..
35446                             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
35447                             if (moved.isArea() || unmoved.isArea()) continue;
35448
35449                             cache.intersections.push({
35450                                 nodeId: node.id,
35451                                 movedId: moved.id,
35452                                 unmovedId: unmoved.id,
35453                                 movedIsEP: isEndpoint(moved, node.id),
35454                                 unmovedIsEP: isEndpoint(unmoved, node.id)
35455                             });
35456                         }
35457                     }
35458                 }
35459
35460
35461                 if (!cache) {
35462                     cache = {};
35463                 }
35464                 if (!cache.ok) {
35465                     cache.moving = {};
35466                     cache.intersections = [];
35467                     cache.replacedVertex = {};
35468                     cache.startLoc = {};
35469                     cache.nodes = [];
35470                     cache.ways = [];
35471
35472                     cacheEntities(moveIDs);
35473                     cacheIntersections(cache.ways);
35474                     cache.nodes = cache.nodes.filter(canMove);
35475
35476                     cache.ok = true;
35477                 }
35478             }
35479
35480
35481             // Place a vertex where the moved vertex used to be, to preserve way shape..
35482             //
35483             //  Start:
35484             //      b ---- e
35485             //     / \
35486             //    /   \
35487             //   /     \
35488             //  a       c
35489             //
35490             //      *               node '*' added to preserve shape
35491             //     / \
35492             //    /   b ---- e      way `b,e` moved here:
35493             //   /     \
35494             //  a       c
35495             //
35496             //
35497             function replaceMovedVertex(nodeId, wayId, graph, delta) {
35498                 var way = graph.entity(wayId);
35499                 var moved = graph.entity(nodeId);
35500                 var movedIndex = way.nodes.indexOf(nodeId);
35501                 var len, prevIndex, nextIndex;
35502
35503                 if (way.isClosed()) {
35504                     len = way.nodes.length - 1;
35505                     prevIndex = (movedIndex + len - 1) % len;
35506                     nextIndex = (movedIndex + len + 1) % len;
35507                 } else {
35508                     len = way.nodes.length;
35509                     prevIndex = movedIndex - 1;
35510                     nextIndex = movedIndex + 1;
35511                 }
35512
35513                 var prev = graph.hasEntity(way.nodes[prevIndex]);
35514                 var next = graph.hasEntity(way.nodes[nextIndex]);
35515
35516                 // Don't add orig vertex at endpoint..
35517                 if (!prev || !next) return graph;
35518
35519                 var key = wayId + '_' + nodeId;
35520                 var orig = cache.replacedVertex[key];
35521                 if (!orig) {
35522                     orig = osmNode();
35523                     cache.replacedVertex[key] = orig;
35524                     cache.startLoc[orig.id] = cache.startLoc[nodeId];
35525                 }
35526
35527                 var start, end;
35528                 if (delta) {
35529                     start = projection(cache.startLoc[nodeId]);
35530                     end = projection.invert(geoVecAdd(start, delta));
35531                 } else {
35532                     end = cache.startLoc[nodeId];
35533                 }
35534                 orig = orig.move(end);
35535
35536                 var angle = Math.abs(geoAngle(orig, prev, projection) -
35537                         geoAngle(orig, next, projection)) * 180 / Math.PI;
35538
35539                 // Don't add orig vertex if it would just make a straight line..
35540                 if (angle > 175 && angle < 185) return graph;
35541
35542                 // moving forward or backward along way?
35543                 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
35544                 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
35545                 var d1 = geoPathLength(p1);
35546                 var d2 = geoPathLength(p2);
35547                 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
35548
35549                 // moving around closed loop?
35550                 if (way.isClosed() && insertAt === 0) insertAt = len;
35551
35552                 way = way.addNode(orig.id, insertAt);
35553                 return graph.replace(orig).replace(way);
35554             }
35555
35556
35557             // Remove duplicate vertex that might have been added by
35558             // replaceMovedVertex.  This is done after the unzorro checks.
35559             function removeDuplicateVertices(wayId, graph) {
35560                 var way = graph.entity(wayId);
35561                 var epsilon = 1e-6;
35562                 var prev, curr;
35563
35564                 function isInteresting(node, graph) {
35565                     return graph.parentWays(node).length > 1 ||
35566                         graph.parentRelations(node).length ||
35567                         node.hasInterestingTags();
35568                 }
35569
35570                 for (var i = 0; i < way.nodes.length; i++) {
35571                     curr = graph.entity(way.nodes[i]);
35572
35573                     if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
35574                         if (!isInteresting(prev, graph)) {
35575                             way = way.removeNode(prev.id);
35576                             graph = graph.replace(way).remove(prev);
35577                         } else if (!isInteresting(curr, graph)) {
35578                             way = way.removeNode(curr.id);
35579                             graph = graph.replace(way).remove(curr);
35580                         }
35581                     }
35582
35583                     prev = curr;
35584                 }
35585
35586                 return graph;
35587             }
35588
35589
35590             // Reorder nodes around intersections that have moved..
35591             //
35592             //  Start:                way1.nodes: b,e         (moving)
35593             //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
35594             //      |                 vertex: b
35595             //      e                 isEP1: true,  isEP2, false
35596             //
35597             //  way1 `b,e` moved here:
35598             //  a ----- c = b - d
35599             //              |
35600             //              e
35601             //
35602             //  reorder nodes         way1.nodes: b,e
35603             //  a ----- c - b - d     way2.nodes: a,c,b,d
35604             //              |
35605             //              e
35606             //
35607             function unZorroIntersection(intersection, graph) {
35608                 var vertex = graph.entity(intersection.nodeId);
35609                 var way1 = graph.entity(intersection.movedId);
35610                 var way2 = graph.entity(intersection.unmovedId);
35611                 var isEP1 = intersection.movedIsEP;
35612                 var isEP2 = intersection.unmovedIsEP;
35613
35614                 // don't move the vertex if it is the endpoint of both ways.
35615                 if (isEP1 && isEP2) return graph;
35616
35617                 var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; });
35618                 var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; });
35619
35620                 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
35621                 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
35622
35623                 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
35624                 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
35625                 var loc;
35626
35627                 // snap vertex to nearest edge (or some point between them)..
35628                 if (!isEP1 && !isEP2) {
35629                     var epsilon = 1e-6, maxIter = 10;
35630                     for (var i = 0; i < maxIter; i++) {
35631                         loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
35632                         edge1 = geoChooseEdge(nodes1, projection(loc), projection);
35633                         edge2 = geoChooseEdge(nodes2, projection(loc), projection);
35634                         if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
35635                     }
35636                 } else if (!isEP1) {
35637                     loc = edge1.loc;
35638                 } else {
35639                     loc = edge2.loc;
35640                 }
35641
35642                 graph = graph.replace(vertex.move(loc));
35643
35644                 // if zorro happened, reorder nodes..
35645                 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
35646                     way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
35647                     graph = graph.replace(way1);
35648                 }
35649                 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
35650                     way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
35651                     graph = graph.replace(way2);
35652                 }
35653
35654                 return graph;
35655             }
35656
35657
35658             function cleanupIntersections(graph) {
35659                 for (var i = 0; i < cache.intersections.length; i++) {
35660                     var obj = cache.intersections[i];
35661                     graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
35662                     graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
35663                     graph = unZorroIntersection(obj, graph);
35664                     graph = removeDuplicateVertices(obj.movedId, graph);
35665                     graph = removeDuplicateVertices(obj.unmovedId, graph);
35666                 }
35667
35668                 return graph;
35669             }
35670
35671
35672             // check if moving way endpoint can cross an unmoved way, if so limit delta..
35673             function limitDelta(graph) {
35674                 function moveNode(loc) {
35675                     return geoVecAdd(projection(loc), _delta);
35676                 }
35677
35678                 for (var i = 0; i < cache.intersections.length; i++) {
35679                     var obj = cache.intersections[i];
35680
35681                     // Don't limit movement if this is vertex joins 2 endpoints..
35682                     if (obj.movedIsEP && obj.unmovedIsEP) continue;
35683                     // Don't limit movement if this vertex is not an endpoint anyway..
35684                     if (!obj.movedIsEP) continue;
35685
35686                     var node = graph.entity(obj.nodeId);
35687                     var start = projection(node.loc);
35688                     var end = geoVecAdd(start, _delta);
35689                     var movedNodes = graph.childNodes(graph.entity(obj.movedId));
35690                     var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); });
35691                     var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
35692                     var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); });
35693                     var hits = geoPathIntersections(movedPath, unmovedPath);
35694
35695                     for (var j = 0; i < hits.length; i++) {
35696                         if (geoVecEqual(hits[j], end)) continue;
35697                         var edge = geoChooseEdge(unmovedNodes, end, projection);
35698                         _delta = geoVecSubtract(projection(edge.loc), start);
35699                     }
35700                 }
35701             }
35702
35703
35704             var action = function(graph) {
35705                 if (_delta[0] === 0 && _delta[1] === 0) return graph;
35706
35707                 setupCache(graph);
35708
35709                 if (cache.intersections.length) {
35710                     limitDelta(graph);
35711                 }
35712
35713                 for (var i = 0; i < cache.nodes.length; i++) {
35714                     var node = graph.entity(cache.nodes[i]);
35715                     var start = projection(node.loc);
35716                     var end = geoVecAdd(start, _delta);
35717                     graph = graph.replace(node.move(projection.invert(end)));
35718                 }
35719
35720                 if (cache.intersections.length) {
35721                     graph = cleanupIntersections(graph);
35722                 }
35723
35724                 return graph;
35725             };
35726
35727
35728             action.delta = function() {
35729                 return _delta;
35730             };
35731
35732
35733             return action;
35734         }
35735
35736         function actionMoveMember(relationId, fromIndex, toIndex) {
35737             return function(graph) {
35738                 return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
35739             };
35740         }
35741
35742         function actionMoveNode(nodeID, toLoc) {
35743
35744             var action = function(graph, t) {
35745                 if (t === null || !isFinite(t)) t = 1;
35746                 t = Math.min(Math.max(+t, 0), 1);
35747
35748                 var node = graph.entity(nodeID);
35749                 return graph.replace(
35750                     node.move(geoVecInterp(node.loc, toLoc, t))
35751                 );
35752             };
35753
35754             action.transitionable = true;
35755
35756             return action;
35757         }
35758
35759         function actionNoop() {
35760             return function(graph) {
35761                 return graph;
35762             };
35763         }
35764
35765         function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
35766             var epsilon = ep || 1e-4;
35767             var threshold = degThresh || 13;  // degrees within right or straight to alter
35768
35769             // We test normalized dot products so we can compare as cos(angle)
35770             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
35771             var upperThreshold = Math.cos(threshold * Math.PI / 180);
35772
35773
35774             var action = function(graph, t) {
35775                 if (t === null || !isFinite(t)) t = 1;
35776                 t = Math.min(Math.max(+t, 0), 1);
35777
35778                 var way = graph.entity(wayID);
35779                 way = way.removeNode('');   // sanity check - remove any consecutive duplicates
35780
35781                 if (way.tags.nonsquare) {
35782                     var tags = Object.assign({}, way.tags);
35783                     // since we're squaring, remove indication that this is physically unsquare
35784                     delete tags.nonsquare;
35785                     way = way.update({tags: tags});
35786                 }
35787
35788                 graph = graph.replace(way);
35789
35790                 var isClosed = way.isClosed();
35791                 var nodes = graph.childNodes(way).slice();  // shallow copy
35792                 if (isClosed) nodes.pop();
35793
35794                 if (vertexID !== undefined) {
35795                     nodes = nodeSubset(nodes, vertexID, isClosed);
35796                     if (nodes.length !== 3) return graph;
35797                 }
35798
35799                 // note: all geometry functions here use the unclosed node/point/coord list
35800
35801                 var nodeCount = {};
35802                 var points = [];
35803                 var corner = { i: 0, dotp: 1 };
35804                 var node, point, loc, score, motions, i, j;
35805
35806                 for (i = 0; i < nodes.length; i++) {
35807                     node = nodes[i];
35808                     nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
35809                     points.push({ id: node.id, coord: projection(node.loc) });
35810                 }
35811
35812
35813                 if (points.length === 3) {   // move only one vertex for right triangle
35814                     for (i = 0; i < 1000; i++) {
35815                         motions = points.map(calcMotion);
35816
35817                         points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
35818                         score = corner.dotp;
35819                         if (score < epsilon) {
35820                             break;
35821                         }
35822                     }
35823
35824                     node = graph.entity(nodes[corner.i].id);
35825                     loc = projection.invert(points[corner.i].coord);
35826                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35827
35828                 } else {
35829                     var straights = [];
35830                     var simplified = [];
35831
35832                     // Remove points from nearly straight sections..
35833                     // This produces a simplified shape to orthogonalize
35834                     for (i = 0; i < points.length; i++) {
35835                         point = points[i];
35836                         var dotp = 0;
35837                         if (isClosed || (i > 0 && i < points.length - 1)) {
35838                             var a = points[(i - 1 + points.length) % points.length];
35839                             var b = points[(i + 1) % points.length];
35840                             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
35841                         }
35842
35843                         if (dotp > upperThreshold) {
35844                             straights.push(point);
35845                         } else {
35846                             simplified.push(point);
35847                         }
35848                     }
35849
35850                     // Orthogonalize the simplified shape
35851                     var bestPoints = clonePoints(simplified);
35852                     var originalPoints = clonePoints(simplified);
35853
35854                     score = Infinity;
35855                     for (i = 0; i < 1000; i++) {
35856                         motions = simplified.map(calcMotion);
35857
35858                         for (j = 0; j < motions.length; j++) {
35859                             simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
35860                         }
35861                         var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
35862                         if (newScore < score) {
35863                             bestPoints = clonePoints(simplified);
35864                             score = newScore;
35865                         }
35866                         if (score < epsilon) {
35867                             break;
35868                         }
35869                     }
35870
35871                     var bestCoords = bestPoints.map(function(p) { return p.coord; });
35872                     if (isClosed) bestCoords.push(bestCoords[0]);
35873
35874                     // move the nodes that should move
35875                     for (i = 0; i < bestPoints.length; i++) {
35876                         point = bestPoints[i];
35877                         if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
35878                             node = graph.entity(point.id);
35879                             loc = projection.invert(point.coord);
35880                             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35881                         }
35882                     }
35883
35884                     // move the nodes along straight segments
35885                     for (i = 0; i < straights.length; i++) {
35886                         point = straights[i];
35887                         if (nodeCount[point.id] > 1) continue;   // skip self-intersections
35888
35889                         node = graph.entity(point.id);
35890
35891                         if (t === 1 &&
35892                             graph.parentWays(node).length === 1 &&
35893                             graph.parentRelations(node).length === 0 &&
35894                             !node.hasInterestingTags()
35895                         ) {
35896                             // remove uninteresting points..
35897                             graph = actionDeleteNode(node.id)(graph);
35898
35899                         } else {
35900                             // move interesting points to the nearest edge..
35901                             var choice = geoVecProject(point.coord, bestCoords);
35902                             if (choice) {
35903                                 loc = projection.invert(choice.target);
35904                                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35905                             }
35906                         }
35907                     }
35908                 }
35909
35910                 return graph;
35911
35912
35913                 function clonePoints(array) {
35914                     return array.map(function(p) {
35915                         return { id: p.id, coord: [p.coord[0], p.coord[1]] };
35916                     });
35917                 }
35918
35919
35920                 function calcMotion(point, i, array) {
35921                     // don't try to move the endpoints of a non-closed way.
35922                     if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0];
35923                     // don't try to move a node that appears more than once (self intersection)
35924                     if (nodeCount[array[i].id] > 1) return [0, 0];
35925
35926                     var a = array[(i - 1 + array.length) % array.length].coord;
35927                     var origin = point.coord;
35928                     var b = array[(i + 1) % array.length].coord;
35929                     var p = geoVecSubtract(a, origin);
35930                     var q = geoVecSubtract(b, origin);
35931
35932                     var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
35933                     p = geoVecNormalize(p);
35934                     q = geoVecNormalize(q);
35935
35936                     var dotp = (p[0] * q[0] + p[1] * q[1]);
35937                     var val = Math.abs(dotp);
35938
35939                     if (val < lowerThreshold) {  // nearly orthogonal
35940                         corner.i = i;
35941                         corner.dotp = val;
35942                         var vec = geoVecNormalize(geoVecAdd(p, q));
35943                         return geoVecScale(vec, 0.1 * dotp * scale);
35944                     }
35945
35946                     return [0, 0];   // do nothing
35947                 }
35948             };
35949
35950
35951             // if we are only orthogonalizing one vertex,
35952             // get that vertex and the previous and next
35953             function nodeSubset(nodes, vertexID, isClosed) {
35954                 var first = isClosed ? 0 : 1;
35955                 var last = isClosed ? nodes.length : nodes.length - 1;
35956
35957                 for (var i = first; i < last; i++) {
35958                     if (nodes[i].id === vertexID) {
35959                         return [
35960                             nodes[(i - 1 + nodes.length) % nodes.length],
35961                             nodes[i],
35962                             nodes[(i + 1) % nodes.length]
35963                         ];
35964                     }
35965                 }
35966
35967                 return [];
35968             }
35969
35970
35971             action.disabled = function(graph) {
35972                 var way = graph.entity(wayID);
35973                 way = way.removeNode('');  // sanity check - remove any consecutive duplicates
35974                 graph = graph.replace(way);
35975
35976                 var isClosed = way.isClosed();
35977                 var nodes = graph.childNodes(way).slice();  // shallow copy
35978                 if (isClosed) nodes.pop();
35979
35980                 var allowStraightAngles = false;
35981                 if (vertexID !== undefined) {
35982                     allowStraightAngles = true;
35983                     nodes = nodeSubset(nodes, vertexID, isClosed);
35984                     if (nodes.length !== 3) return 'end_vertex';
35985                 }
35986
35987                 var coords = nodes.map(function(n) { return projection(n.loc); });
35988                 var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
35989
35990                 if (score === null) {
35991                     return 'not_squarish';
35992                 } else if (score === 0) {
35993                     return 'square_enough';
35994                 } else {
35995                     return false;
35996                 }
35997             };
35998
35999
36000             action.transitionable = true;
36001
36002             return action;
36003         }
36004
36005         // `actionRestrictTurn` creates a turn restriction relation.
36006         //
36007         // `turn` must be an `osmTurn` object
36008         // see osm/intersection.js, pathToTurn()
36009         //
36010         // This specifies a restriction of type `restriction` when traveling from
36011         // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
36012         // (The action does not check that these entities form a valid intersection.)
36013         //
36014         // From, to, and via ways should be split before calling this action.
36015         // (old versions of the code would split the ways here, but we no longer do it)
36016         //
36017         // For testing convenience, accepts a restrictionID to assign to the new
36018         // relation. Normally, this will be undefined and the relation will
36019         // automatically be assigned a new ID.
36020         //
36021         function actionRestrictTurn(turn, restrictionType, restrictionID) {
36022
36023             return function(graph) {
36024                 var fromWay = graph.entity(turn.from.way);
36025                 var toWay = graph.entity(turn.to.way);
36026                 var viaNode = turn.via.node && graph.entity(turn.via.node);
36027                 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
36028                 var members = [];
36029
36030                 members.push({ id: fromWay.id, type: 'way',  role: 'from' });
36031
36032                 if (viaNode) {
36033                     members.push({ id: viaNode.id,  type: 'node', role: 'via' });
36034                 } else if (viaWays) {
36035                     viaWays.forEach(function(viaWay) {
36036                         members.push({ id: viaWay.id,  type: 'way', role: 'via' });
36037                     });
36038                 }
36039
36040                 members.push({ id: toWay.id, type: 'way',  role: 'to' });
36041
36042                 return graph.replace(osmRelation({
36043                     id: restrictionID,
36044                     tags: {
36045                         type: 'restriction',
36046                         restriction: restrictionType
36047                     },
36048                     members: members
36049                 }));
36050             };
36051         }
36052
36053         function actionRevert(id) {
36054             var action = function(graph) {
36055                 var entity = graph.hasEntity(id),
36056                     base = graph.base().entities[id];
36057
36058                 if (entity && !base) {    // entity will be removed..
36059                     if (entity.type === 'node') {
36060                         graph.parentWays(entity)
36061                             .forEach(function(parent) {
36062                                 parent = parent.removeNode(id);
36063                                 graph = graph.replace(parent);
36064
36065                                 if (parent.isDegenerate()) {
36066                                     graph = actionDeleteWay(parent.id)(graph);
36067                                 }
36068                             });
36069                     }
36070
36071                     graph.parentRelations(entity)
36072                         .forEach(function(parent) {
36073                             parent = parent.removeMembersWithID(id);
36074                             graph = graph.replace(parent);
36075
36076                             if (parent.isDegenerate()) {
36077                                 graph = actionDeleteRelation(parent.id)(graph);
36078                             }
36079                         });
36080                 }
36081
36082                 return graph.revert(id);
36083             };
36084
36085             return action;
36086         }
36087
36088         function actionRotate(rotateIds, pivot, angle, projection) {
36089
36090             var action = function(graph) {
36091                 return graph.update(function(graph) {
36092                     utilGetAllNodes(rotateIds, graph).forEach(function(node) {
36093                         var point = geoRotate([projection(node.loc)], angle, pivot)[0];
36094                         graph = graph.replace(node.move(projection.invert(point)));
36095                     });
36096                 });
36097             };
36098
36099             return action;
36100         }
36101
36102         /* Align nodes along their common axis */
36103         function actionStraightenNodes(nodeIDs, projection) {
36104
36105             function positionAlongWay(a, o, b) {
36106                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36107             }
36108
36109
36110             var action = function(graph, t) {
36111                 if (t === null || !isFinite(t)) t = 1;
36112                 t = Math.min(Math.max(+t, 0), 1);
36113
36114                 var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
36115                 var points = nodes.map(function(n) { return projection(n.loc); });
36116                 var ssr = geoGetSmallestSurroundingRectangle(points);
36117
36118                 // Choose line pq = axis of symmetry.
36119                 // The shape's surrounding rectangle has 2 axes of symmetry.
36120                 // Snap points to the long axis
36121                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36122                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36123                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36124                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36125                 var p, q;
36126
36127                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36128                 if (isLong) {
36129                     p = p1;
36130                     q = q1;
36131                 } else {
36132                     p = p2;
36133                     q = q2;
36134                 }
36135
36136                 // Move points onto line pq
36137                 for (var i = 0; i < points.length; i++) {
36138                     var node = nodes[i];
36139                     var point = points[i];
36140                     var u = positionAlongWay(point, p, q);
36141                     var point2 = geoVecInterp(p, q, u);
36142                     var loc2 = projection.invert(point2);
36143                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36144                 }
36145
36146                 return graph;
36147             };
36148
36149
36150             action.disabled = function() {
36151                 return false;
36152             };
36153
36154
36155             action.transitionable = true;
36156
36157
36158             return action;
36159         }
36160
36161         /*
36162          * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
36163          */
36164         function actionStraightenWay(selectedIDs, projection) {
36165
36166             function positionAlongWay(a, o, b) {
36167                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36168             }
36169
36170             // Return all selected ways as a continuous, ordered array of nodes
36171             function allNodes(graph) {
36172                 var nodes = [];
36173                 var startNodes = [];
36174                 var endNodes = [];
36175                 var remainingWays = [];
36176                 var selectedWays = selectedIDs.filter(function(w) {
36177                     return graph.entity(w).type === 'way';
36178                 });
36179                 var selectedNodes = selectedIDs.filter(function(n) {
36180                     return graph.entity(n).type === 'node';
36181                 });
36182
36183                 for (var i = 0; i < selectedWays.length; i++) {
36184                     var way = graph.entity(selectedWays[i]);
36185                     nodes = way.nodes.slice(0);
36186                     remainingWays.push(nodes);
36187                     startNodes.push(nodes[0]);
36188                     endNodes.push(nodes[nodes.length-1]);
36189                 }
36190
36191                 // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
36192                 //   and need to be removed so currNode difference calculation below works)
36193                 // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
36194                 startNodes = startNodes.filter(function(n) {
36195                     return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
36196                 });
36197                 endNodes = endNodes.filter(function(n) {
36198                     return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
36199                 });
36200
36201                 // Choose the initial endpoint to start from
36202                 var currNode = utilArrayDifference(startNodes, endNodes)
36203                     .concat(utilArrayDifference(endNodes, startNodes))[0];
36204                 var nextWay = [];
36205                 nodes = [];
36206
36207                 // Create nested function outside of loop to avoid "function in loop" lint error
36208                 var getNextWay = function(currNode, remainingWays) {
36209                     return remainingWays.filter(function(way) {
36210                         return way[0] === currNode || way[way.length-1] === currNode;
36211                     })[0];
36212                 };
36213
36214                 // Add nodes to end of nodes array, until all ways are added
36215                 while (remainingWays.length) {
36216                     nextWay = getNextWay(currNode, remainingWays);
36217                     remainingWays = utilArrayDifference(remainingWays, [nextWay]);
36218
36219                     if (nextWay[0] !== currNode) {
36220                         nextWay.reverse();
36221                     }
36222                     nodes = nodes.concat(nextWay);
36223                     currNode = nodes[nodes.length-1];
36224                 }
36225
36226                 // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
36227                 if (selectedNodes.length === 2) {
36228                     var startNodeIdx = nodes.indexOf(selectedNodes[0]);
36229                     var endNodeIdx = nodes.indexOf(selectedNodes[1]);
36230                     var sortedStartEnd = [startNodeIdx, endNodeIdx];
36231
36232                     sortedStartEnd.sort(function(a, b) { return a - b; });
36233                     nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1);
36234                 }
36235
36236                 return nodes.map(function(n) { return graph.entity(n); });
36237             }
36238
36239
36240             var action = function(graph, t) {
36241                 if (t === null || !isFinite(t)) t = 1;
36242                 t = Math.min(Math.max(+t, 0), 1);
36243
36244                 var nodes = allNodes(graph);
36245                 var points = nodes.map(function(n) { return projection(n.loc); });
36246                 var startPoint = points[0];
36247                 var endPoint = points[points.length-1];
36248                 var toDelete = [];
36249                 var i;
36250
36251                 for (i = 1; i < points.length-1; i++) {
36252                     var node = nodes[i];
36253                     var point = points[i];
36254
36255                     if (t < 1 || graph.parentWays(node).length > 1 ||
36256                         graph.parentRelations(node).length ||
36257                         node.hasInterestingTags()
36258                     ) {
36259                         var u = positionAlongWay(point, startPoint, endPoint);
36260                         var p = geoVecInterp(startPoint, endPoint, u);
36261                         var loc2 = projection.invert(p);
36262                         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36263
36264                     } else {
36265                         // safe to delete
36266                         if (toDelete.indexOf(node) === -1) {
36267                             toDelete.push(node);
36268                         }
36269                     }
36270                 }
36271
36272                 for (i = 0; i < toDelete.length; i++) {
36273                     graph = actionDeleteNode(toDelete[i].id)(graph);
36274                 }
36275
36276                 return graph;
36277             };
36278
36279
36280             action.disabled = function(graph) {
36281                 // check way isn't too bendy
36282                 var nodes = allNodes(graph);
36283                 var points = nodes.map(function(n) { return projection(n.loc); });
36284                 var startPoint = points[0];
36285                 var endPoint = points[points.length-1];
36286                 var threshold = 0.2 * geoVecLength(startPoint, endPoint);
36287                 var i;
36288
36289                 if (threshold === 0) {
36290                     return 'too_bendy';
36291                 }
36292
36293                 for (i = 1; i < points.length - 1; i++) {
36294                     var point = points[i];
36295                     var u = positionAlongWay(point, startPoint, endPoint);
36296                     var p = geoVecInterp(startPoint, endPoint, u);
36297                     var dist = geoVecLength(p, point);
36298
36299                     // to bendy if point is off by 20% of total start/end distance in projected space
36300                     if (isNaN(dist) || dist > threshold) {
36301                         return 'too_bendy';
36302                     }
36303                 }
36304             };
36305
36306             action.transitionable = true;
36307
36308
36309             return action;
36310         }
36311
36312         // `actionUnrestrictTurn` deletes a turn restriction relation.
36313         //
36314         // `turn` must be an `osmTurn` object with a `restrictionID` property.
36315         // see osm/intersection.js, pathToTurn()
36316         //
36317         function actionUnrestrictTurn(turn) {
36318             return function(graph) {
36319                 return actionDeleteRelation(turn.restrictionID)(graph);
36320             };
36321         }
36322
36323         /* Reflect the given area around its axis of symmetry */
36324         function actionReflect(reflectIds, projection) {
36325             var _useLongAxis = true;
36326
36327
36328             var action = function(graph, t) {
36329                 if (t === null || !isFinite(t)) t = 1;
36330                 t = Math.min(Math.max(+t, 0), 1);
36331
36332                 var nodes = utilGetAllNodes(reflectIds, graph);
36333                 var points = nodes.map(function(n) { return projection(n.loc); });
36334                 var ssr = geoGetSmallestSurroundingRectangle(points);
36335
36336                 // Choose line pq = axis of symmetry.
36337                 // The shape's surrounding rectangle has 2 axes of symmetry.
36338                 // Reflect across the longer axis by default.
36339                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36340                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36341                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36342                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36343                 var p, q;
36344
36345                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36346                 if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) {
36347                     p = p1;
36348                     q = q1;
36349                 } else {
36350                     p = p2;
36351                     q = q2;
36352                 }
36353
36354                 // reflect c across pq
36355                 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
36356                 var dx = q[0] - p[0];
36357                 var dy = q[1] - p[1];
36358                 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
36359                 var b = 2 * dx * dy / (dx * dx + dy * dy);
36360                 for (var i = 0; i < nodes.length; i++) {
36361                     var node = nodes[i];
36362                     var c = projection(node.loc);
36363                     var c2 = [
36364                         a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
36365                         b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
36366                     ];
36367                     var loc2 = projection.invert(c2);
36368                     node = node.move(geoVecInterp(node.loc, loc2, t));
36369                     graph = graph.replace(node);
36370                 }
36371
36372                 return graph;
36373             };
36374
36375
36376             action.useLongAxis = function(val) {
36377                 if (!arguments.length) return _useLongAxis;
36378                 _useLongAxis = val;
36379                 return action;
36380             };
36381
36382
36383             action.transitionable = true;
36384
36385
36386             return action;
36387         }
36388
36389         function actionUpgradeTags(entityId, oldTags, replaceTags) {
36390
36391             return function(graph) {
36392                 var entity = graph.entity(entityId);
36393                 var tags = Object.assign({}, entity.tags);  // shallow copy
36394                 var transferValue;
36395                 var semiIndex;
36396
36397                 for (var oldTagKey in oldTags) {
36398                     if (oldTags[oldTagKey] === '*') {
36399                         transferValue = tags[oldTagKey];
36400                         delete tags[oldTagKey];
36401                     } else {
36402                         var vals = tags[oldTagKey].split(';').filter(Boolean);
36403                         var oldIndex = vals.indexOf(oldTags[oldTagKey]);
36404                         if (vals.length === 1 || oldIndex === -1) {
36405                             delete tags[oldTagKey];
36406                         } else {
36407                             if (replaceTags && replaceTags[oldTagKey]) {
36408                                 // replacing a value within a semicolon-delimited value, note the index
36409                                 semiIndex = oldIndex;
36410                             }
36411                             vals.splice(oldIndex, 1);
36412                             tags[oldTagKey] = vals.join(';');
36413                         }
36414                     }
36415                 }
36416
36417                 if (replaceTags) {
36418                     for (var replaceKey in replaceTags) {
36419                         var replaceValue = replaceTags[replaceKey];
36420                         if (replaceValue === '*') {
36421                             if (tags[replaceKey] && tags[replaceKey] !== 'no') {
36422                                 // allow any pre-existing value except `no` (troll tag)
36423                                 continue;
36424                             } else {
36425                                 // otherwise assume `yes` is okay
36426                                 tags[replaceKey] = 'yes';
36427                             }
36428                         } else if (replaceValue === '$1') {
36429                             tags[replaceKey] = transferValue;
36430                         } else {
36431                             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
36432                                 // don't override preexisting values
36433                                 var existingVals = tags[replaceKey].split(';').filter(Boolean);
36434                                 if (existingVals.indexOf(replaceValue) === -1) {
36435                                     existingVals.splice(semiIndex, 0, replaceValue);
36436                                     tags[replaceKey] = existingVals.join(';');
36437                                 }
36438                             } else {
36439                                 tags[replaceKey] = replaceValue;
36440                             }
36441                         }
36442                     }
36443                 }
36444
36445                 return graph.replace(entity.update({ tags: tags }));
36446             };
36447         }
36448
36449         function behaviorEdit(context) {
36450
36451             function behavior() {
36452                 context.map()
36453                     .minzoom(context.minEditableZoom());
36454             }
36455
36456
36457             behavior.off = function() {
36458                 context.map()
36459                     .minzoom(0);
36460             };
36461
36462             return behavior;
36463         }
36464
36465         /*
36466            The hover behavior adds the `.hover` class on mouseover to all elements to which
36467            the identical datum is bound, and removes it on mouseout.
36468
36469            The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
36470            representation may consist of several elements scattered throughout the DOM hierarchy.
36471            Only one of these elements can have the :hover pseudo-class, but all of them will
36472            have the .hover class.
36473          */
36474         function behaviorHover(context) {
36475             var dispatch$1 = dispatch('hover');
36476             var _selection = d3_select(null);
36477             var _newNodeId = null;
36478             var _initialNodeID = null;
36479             var _buttonDown;
36480             var _altDisables;
36481             var _ignoreVertex;
36482             var _target;
36483
36484
36485             function keydown() {
36486                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36487                     _selection.selectAll('.hover')
36488                         .classed('hover-suppressed', true)
36489                         .classed('hover', false);
36490
36491                     _selection
36492                         .classed('hover-disabled', true);
36493
36494                     dispatch$1.call('hover', this, null);
36495                 }
36496             }
36497
36498
36499             function keyup() {
36500                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36501                     _selection.selectAll('.hover-suppressed')
36502                         .classed('hover-suppressed', false)
36503                         .classed('hover', true);
36504
36505                     _selection
36506                         .classed('hover-disabled', false);
36507
36508                     dispatch$1.call('hover', this, _target ? _target.id : null);
36509                 }
36510             }
36511
36512
36513             function behavior(selection) {
36514                 _selection = selection;
36515
36516                 if (_initialNodeID) {
36517                     _newNodeId = _initialNodeID;
36518                     _initialNodeID = null;
36519                 } else {
36520                     _newNodeId = null;
36521                 }
36522
36523                 _selection
36524                     .on('mouseover.hover', mouseover)
36525                     .on('mouseout.hover', mouseout)
36526                     .on('mousedown.hover', mousedown);
36527
36528                 d3_select(window)
36529                     .on('keydown.hover', keydown)
36530                     .on('keyup.hover', keyup);
36531
36532
36533                 function mouseover() {
36534                     if (_buttonDown) return;
36535                     var target = event.target;
36536                     enter(target ? target.__data__ : null);
36537                 }
36538
36539
36540                 function mouseout() {
36541                     if (_buttonDown) return;
36542                     var target = event.relatedTarget;
36543                     enter(target ? target.__data__ : null);
36544                 }
36545
36546
36547                 function mousedown() {
36548                     _buttonDown = true;
36549                     d3_select(window)
36550                         .on('mouseup.hover', mouseup, true);
36551                 }
36552
36553
36554                 function mouseup() {
36555                     _buttonDown = false;
36556                     d3_select(window)
36557                         .on('mouseup.hover', null, true);
36558                 }
36559
36560                 function allowsVertex(d) {
36561                     return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36562                 }
36563
36564                 function modeAllowsHover(target) {
36565                     var mode = context.mode();
36566                     if (mode.id === 'add-point') {
36567                         return mode.preset.matchGeometry('vertex') ||
36568                             (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex');
36569                     }
36570                     return true;
36571                 }
36572
36573                 function enter(datum) {
36574                     if (datum === _target) return;
36575                     _target = datum;
36576
36577                     _selection.selectAll('.hover')
36578                         .classed('hover', false);
36579                     _selection.selectAll('.hover-suppressed')
36580                         .classed('hover-suppressed', false);
36581
36582                     // What are we hovering over?
36583                     var entity, selector;
36584                     if (datum && datum.__featurehash__) {
36585                         entity = datum;
36586                         selector = '.data' + datum.__featurehash__;
36587
36588                     } else if (datum instanceof qaError) {
36589                         entity = datum;
36590                         selector = '.' + datum.service + '.error_id-' + datum.id;
36591
36592                     } else if (datum instanceof osmNote) {
36593                         entity = datum;
36594                         selector = '.note-' + datum.id;
36595
36596                     } else if (datum instanceof osmEntity) {
36597                         entity = datum;
36598                         selector = '.' + entity.id;
36599                         if (entity.type === 'relation') {
36600                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36601                         }
36602                     } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
36603                         entity = datum.properties.entity;
36604                         selector = '.' + entity.id;
36605                         if (entity.type === 'relation') {
36606                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36607                         }
36608                     }
36609
36610                     var mode = context.mode();
36611
36612                     // Update hover state and dispatch event
36613                     if (entity && entity.id !== _newNodeId) {
36614                         // If drawing a way, don't hover on a node that was just placed. #3974
36615
36616                         if ((mode.id === 'draw-line' || mode.id === 'draw-area') && !_newNodeId && entity.type === 'node') {
36617                             _newNodeId = entity.id;
36618                             return;
36619                         }
36620
36621                         var suppressed = (_altDisables && event && event.altKey) ||
36622                             (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity)) ||
36623                             !modeAllowsHover(entity);
36624                         _selection.selectAll(selector)
36625                             .classed(suppressed ? 'hover-suppressed' : 'hover', true);
36626
36627                         dispatch$1.call('hover', this, !suppressed && entity);
36628
36629                     } else {
36630                         dispatch$1.call('hover', this, null);
36631                     }
36632                 }
36633             }
36634
36635
36636             behavior.off = function(selection) {
36637                 selection.selectAll('.hover')
36638                     .classed('hover', false);
36639                 selection.selectAll('.hover-suppressed')
36640                     .classed('hover-suppressed', false);
36641                 selection
36642                     .classed('hover-disabled', false);
36643
36644                 selection
36645                     .on('mouseover.hover', null)
36646                     .on('mouseout.hover', null)
36647                     .on('mousedown.hover', null);
36648
36649                 d3_select(window)
36650                     .on('keydown.hover', null)
36651                     .on('keyup.hover', null);
36652             };
36653
36654
36655             behavior.altDisables = function(val) {
36656                 if (!arguments.length) return _altDisables;
36657                 _altDisables = val;
36658                 return behavior;
36659             };
36660
36661             behavior.ignoreVertex = function(val) {
36662                 if (!arguments.length) return _ignoreVertex;
36663                 _ignoreVertex = val;
36664                 return behavior;
36665             };
36666
36667             behavior.initialNodeID = function(nodeId) {
36668                 _initialNodeID = nodeId;
36669                 return behavior;
36670             };
36671
36672             return utilRebind(behavior, dispatch$1, 'on');
36673         }
36674
36675         function refresh(selection, node) {
36676             var cr = node.getBoundingClientRect();
36677             var prop = [cr.width, cr.height];
36678             selection.property('__dimensions__', prop);
36679             return prop;
36680         }
36681
36682         function utilGetDimensions(selection, force) {
36683             if (!selection || selection.empty()) {
36684                 return [0, 0];
36685             }
36686             var node = selection.node(),
36687                 cached = selection.property('__dimensions__');
36688             return (!cached || force) ? refresh(selection, node) : cached;
36689         }
36690
36691
36692         function utilSetDimensions(selection, dimensions) {
36693             if (!selection || selection.empty()) {
36694                 return selection;
36695             }
36696             var node = selection.node();
36697             if (dimensions === null) {
36698                 refresh(selection, node);
36699                 return selection;
36700             }
36701             return selection
36702                 .property('__dimensions__', [dimensions[0], dimensions[1]])
36703                 .attr('width', dimensions[0])
36704                 .attr('height', dimensions[1]);
36705         }
36706
36707         function behaviorTail() {
36708             var container;
36709             var xmargin = 25;
36710             var tooltipSize = [0, 0];
36711             var selectionSize = [0, 0];
36712             var _text;
36713
36714
36715             function behavior(selection) {
36716                 if (!_text) return;
36717
36718                 d3_select(window)
36719                     .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
36720
36721                 container = d3_select(document.body)
36722                     .append('div')
36723                     .style('display', 'none')
36724                     .attr('class', 'tail tooltip-inner');
36725
36726                 container.append('div')
36727                     .text(_text);
36728
36729                 selection
36730                     .on('mousemove.tail', mousemove)
36731                     .on('mouseenter.tail', mouseenter)
36732                     .on('mouseleave.tail', mouseleave);
36733
36734                 container
36735                     .on('mousemove.tail', mousemove);
36736
36737                 tooltipSize = utilGetDimensions(container);
36738                 selectionSize = utilGetDimensions(selection);
36739
36740
36741                 function show() {
36742                     container.style('display', 'block');
36743                     tooltipSize = utilGetDimensions(container);
36744                 }
36745
36746
36747                 function mousemove() {
36748                     if (container.style('display') === 'none') show();
36749                     var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
36750                         -tooltipSize[0] - xmargin : xmargin;
36751                     container.classed('left', xoffset > 0);
36752                     utilSetTransform(container, event.clientX + xoffset, event.clientY);
36753                 }
36754
36755
36756                 function mouseleave() {
36757                     if (event.relatedTarget !== container.node()) {
36758                         container.style('display', 'none');
36759                     }
36760                 }
36761
36762
36763                 function mouseenter() {
36764                     if (event.relatedTarget !== container.node()) {
36765                         show();
36766                     }
36767                 }
36768             }
36769
36770
36771             behavior.off = function(selection) {
36772                 if (!_text) return;
36773
36774                 container
36775                     .on('mousemove.tail', null)
36776                     .remove();
36777
36778                 selection
36779                     .on('mousemove.tail', null)
36780                     .on('mouseenter.tail', null)
36781                     .on('mouseleave.tail', null);
36782
36783                 d3_select(window)
36784                     .on('resize.tail', null);
36785             };
36786
36787
36788             behavior.text = function(val) {
36789                 if (!arguments.length) return _text;
36790                 _text = val;
36791                 return behavior;
36792             };
36793
36794
36795             return behavior;
36796         }
36797
36798         var _usedTails = {};
36799         var _disableSpace = false;
36800         var _lastSpace = null;
36801
36802
36803         function behaviorDraw(context) {
36804             var dispatch$1 = dispatch(
36805                 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
36806             );
36807
36808             var keybinding = utilKeybinding('draw');
36809
36810             var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
36811                 .on('hover', context.ui().sidebar.hover);
36812             var tail = behaviorTail();
36813             var edit = behaviorEdit(context);
36814
36815             var closeTolerance = 4;
36816             var tolerance = 12;
36817             var _mouseLeave = false;
36818             var _lastMouse = null;
36819
36820
36821             // related code
36822             // - `mode/drag_node.js` `datum()`
36823             function datum() {
36824                 var mode = context.mode();
36825                 var isNote = mode && (mode.id.indexOf('note') !== -1);
36826                 if (event.altKey || isNote) return {};
36827
36828                 var element;
36829                 if (event.type === 'keydown') {
36830                     element = _lastMouse && _lastMouse.target;
36831                 } else {
36832                     element = event.target;
36833                 }
36834
36835                 // When drawing, snap only to touch targets..
36836                 // (this excludes area fills and active drawing elements)
36837                 var d = element.__data__;
36838                 return (d && d.properties && d.properties.target) ? d : {};
36839             }
36840
36841
36842             function mousedown() {
36843
36844                 function point() {
36845                     var p = context.container().node();
36846                     return touchId !== null ? d3_touches(p).filter(function(p) {
36847                         return p.identifier === touchId;
36848                     })[0] : d3_mouse(p);
36849                 }
36850
36851                 var element = d3_select(this);
36852                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
36853                 var t1 = +new Date();
36854                 var p1 = point();
36855
36856                 element.on('mousemove.draw', null);
36857
36858                 d3_select(window).on('mouseup.draw', function() {
36859                     var t2 = +new Date();
36860                     var p2 = point();
36861                     var dist = geoVecLength(p1, p2);
36862
36863                     element.on('mousemove.draw', mousemove);
36864                     d3_select(window).on('mouseup.draw', null);
36865
36866                     if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
36867                         // Prevent a quick second click
36868                         d3_select(window).on('click.draw-block', function() {
36869                             event.stopPropagation();
36870                         }, true);
36871
36872                         context.map().dblclickEnable(false);
36873
36874                         window.setTimeout(function() {
36875                             context.map().dblclickEnable(true);
36876                             d3_select(window).on('click.draw-block', null);
36877                         }, 500);
36878
36879                         click();
36880                     }
36881                 }, true);
36882             }
36883
36884
36885             function mousemove() {
36886                 _lastMouse = event;
36887                 dispatch$1.call('move', this, datum());
36888             }
36889
36890
36891             function mouseenter() {
36892                 _mouseLeave = false;
36893             }
36894
36895
36896             function mouseleave() {
36897                 _mouseLeave = true;
36898             }
36899
36900             function allowsVertex(d) {
36901                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36902             }
36903
36904             // related code
36905             // - `mode/drag_node.js`     `doMode()`
36906             // - `behavior/draw.js`      `click()`
36907             // - `behavior/draw_way.js`  `move()`
36908             function click() {
36909                 var d = datum();
36910                 var target = d && d.properties && d.properties.entity;
36911
36912                 var mode = context.mode();
36913
36914                 if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
36915                     dispatch$1.call('clickNode', this, target, d);
36916                     return;
36917
36918                 } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {   // Snap to a way
36919                     var choice = geoChooseEdge(
36920                         context.childNodes(target), context.mouse(), context.projection, context.activeID()
36921                     );
36922                     if (choice) {
36923                         var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
36924                         dispatch$1.call('clickWay', this, choice.loc, edge, d);
36925                         return;
36926                     }
36927                 } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
36928                     dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
36929                 }
36930
36931             }
36932
36933
36934             function space() {
36935                 event.preventDefault();
36936                 event.stopPropagation();
36937
36938                 var currSpace = context.mouse();
36939                 if (_disableSpace && _lastSpace) {
36940                     var dist = geoVecLength(_lastSpace, currSpace);
36941                     if (dist > tolerance) {
36942                         _disableSpace = false;
36943                     }
36944                 }
36945
36946                 if (_disableSpace || _mouseLeave || !_lastMouse) return;
36947
36948                 // user must move mouse or release space bar to allow another click
36949                 _lastSpace = currSpace;
36950                 _disableSpace = true;
36951
36952                 d3_select(window).on('keyup.space-block', function() {
36953                     event.preventDefault();
36954                     event.stopPropagation();
36955                     _disableSpace = false;
36956                     d3_select(window).on('keyup.space-block', null);
36957                 });
36958
36959                 click();
36960             }
36961
36962
36963             function backspace() {
36964                 event.preventDefault();
36965                 dispatch$1.call('undo');
36966             }
36967
36968
36969             function del() {
36970                 event.preventDefault();
36971                 dispatch$1.call('cancel');
36972             }
36973
36974
36975             function ret() {
36976                 event.preventDefault();
36977                 dispatch$1.call('finish');
36978             }
36979
36980
36981             function behavior(selection) {
36982                 context.install(_hover);
36983                 context.install(edit);
36984
36985                 if (!context.inIntro() && !_usedTails[tail.text()]) {
36986                     context.install(tail);
36987                 }
36988
36989                 keybinding
36990                     .on('⌫', backspace)
36991                     .on('⌦', del)
36992                     .on('⎋', ret)
36993                     .on('↩', ret)
36994                     .on('space', space)
36995                     .on('⌥space', space);
36996
36997                 selection
36998                     .on('mouseenter.draw', mouseenter)
36999                     .on('mouseleave.draw', mouseleave)
37000                     .on('mousedown.draw', mousedown)
37001                     .on('mousemove.draw', mousemove);
37002
37003                 d3_select(document)
37004                     .call(keybinding);
37005
37006                 return behavior;
37007             }
37008
37009
37010             behavior.off = function(selection) {
37011                 context.ui().sidebar.hover.cancel();
37012                 context.uninstall(_hover);
37013                 context.uninstall(edit);
37014
37015                 if (!context.inIntro() && !_usedTails[tail.text()]) {
37016                     context.uninstall(tail);
37017                     _usedTails[tail.text()] = true;
37018                 }
37019
37020                 selection
37021                     .on('mouseenter.draw', null)
37022                     .on('mouseleave.draw', null)
37023                     .on('mousedown.draw', null)
37024                     .on('mousemove.draw', null);
37025
37026                 d3_select(window)
37027                     .on('mouseup.draw', null);
37028                     // note: keyup.space-block, click.draw-block should remain
37029
37030                 d3_select(document)
37031                     .call(keybinding.unbind);
37032             };
37033
37034
37035             behavior.tail = function(_) {
37036                 tail.text(_);
37037                 return behavior;
37038             };
37039
37040             behavior.hover = function() {
37041                 return _hover;
37042             };
37043
37044
37045             return utilRebind(behavior, dispatch$1, 'on');
37046         }
37047
37048         function behaviorBreathe() {
37049             var duration = 800;
37050             var steps = 4;
37051             var selector = '.selected.shadow, .selected .shadow';
37052             var _selected = d3_select(null);
37053             var _classed = '';
37054             var _params = {};
37055             var _done = false;
37056             var _timer;
37057
37058
37059             function ratchetyInterpolator(a, b, steps, units) {
37060                 a = parseFloat(a);
37061                 b = parseFloat(b);
37062                 var sample = quantize()
37063                     .domain([0, 1])
37064                     .range(d3_quantize(d3_interpolateNumber(a, b), steps));
37065
37066                 return function(t) {
37067                     return String(sample(t)) + (units || '');
37068                 };
37069             }
37070
37071
37072             function reset(selection) {
37073                 selection
37074                     .style('stroke-opacity', null)
37075                     .style('stroke-width', null)
37076                     .style('fill-opacity', null)
37077                     .style('r', null);
37078             }
37079
37080
37081             function setAnimationParams(transition, fromTo) {
37082                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37083
37084                 transition
37085                     .styleTween('stroke-opacity', function(d) {
37086                         return ratchetyInterpolator(
37087                             _params[d.id][toFrom].opacity,
37088                             _params[d.id][fromTo].opacity,
37089                             steps
37090                         );
37091                     })
37092                     .styleTween('stroke-width', function(d) {
37093                         return ratchetyInterpolator(
37094                             _params[d.id][toFrom].width,
37095                             _params[d.id][fromTo].width,
37096                             steps,
37097                             'px'
37098                         );
37099                     })
37100                     .styleTween('fill-opacity', function(d) {
37101                         return ratchetyInterpolator(
37102                             _params[d.id][toFrom].opacity,
37103                             _params[d.id][fromTo].opacity,
37104                             steps
37105                         );
37106                     })
37107                     .styleTween('r', function(d) {
37108                         return ratchetyInterpolator(
37109                             _params[d.id][toFrom].width,
37110                             _params[d.id][fromTo].width,
37111                             steps,
37112                             'px'
37113                         );
37114                     });
37115             }
37116
37117
37118             function calcAnimationParams(selection) {
37119                 selection
37120                     .call(reset)
37121                     .each(function(d) {
37122                         var s = d3_select(this);
37123                         var tag = s.node().tagName;
37124                         var p = {'from': {}, 'to': {}};
37125                         var opacity;
37126                         var width;
37127
37128                         // determine base opacity and width
37129                         if (tag === 'circle') {
37130                             opacity = parseFloat(s.style('fill-opacity') || 0.5);
37131                             width = parseFloat(s.style('r') || 15.5);
37132                         } else {
37133                             opacity = parseFloat(s.style('stroke-opacity') || 0.7);
37134                             width = parseFloat(s.style('stroke-width') || 10);
37135                         }
37136
37137                         // calculate from/to interpolation params..
37138                         p.tag = tag;
37139                         p.from.opacity = opacity * 0.6;
37140                         p.to.opacity = opacity * 1.25;
37141                         p.from.width = width * 0.7;
37142                         p.to.width = width * (tag === 'circle' ? 1.5 : 1);
37143                         _params[d.id] = p;
37144                     });
37145             }
37146
37147
37148             function run(surface, fromTo) {
37149                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37150                 var currSelected = surface.selectAll(selector);
37151                 var currClassed = surface.attr('class');
37152
37153                 if (_done || currSelected.empty()) {
37154                     _selected.call(reset);
37155                     return;
37156                 }
37157
37158                 if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
37159                     _selected.call(reset);
37160                     _classed = currClassed;
37161                     _selected = currSelected.call(calcAnimationParams);
37162                 }
37163
37164                 _selected
37165                     .transition()
37166                     .duration(duration)
37167                     .call(setAnimationParams, fromTo)
37168                     .on('end', function() {
37169                         surface.call(run, toFrom);
37170                     });
37171             }
37172
37173
37174             function behavior(surface) {
37175                 _done = false;
37176                 _timer = timer(function() {
37177                     // wait for elements to actually become selected
37178                     if (surface.selectAll(selector).empty()) {
37179                         return false;
37180                     }
37181
37182                     surface.call(run, 'from');
37183                     _timer.stop();
37184                     return true;
37185                 }, 20);
37186             }
37187
37188
37189             behavior.off = function() {
37190                 _done = true;
37191                 if (_timer) {
37192                     _timer.stop();
37193                 }
37194                 _selected
37195                     .interrupt()
37196                     .call(reset);
37197             };
37198
37199
37200             return behavior;
37201         }
37202
37203         // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37204         // For example, ⌘Z -> Ctrl+Z
37205         var uiCmd = function (code) {
37206             var detected = utilDetect();
37207
37208             if (detected.os === 'mac') {
37209                 return code;
37210             }
37211
37212             if (detected.os === 'win') {
37213                 if (code === '⌘⇧Z') return 'Ctrl+Y';
37214             }
37215
37216             var result = '',
37217                 replacements = {
37218                     '⌘': 'Ctrl',
37219                     '⇧': 'Shift',
37220                     '⌥': 'Alt',
37221                     '⌫': 'Backspace',
37222                     '⌦': 'Delete'
37223                 };
37224
37225             for (var i = 0; i < code.length; i++) {
37226                 if (code[i] in replacements) {
37227                     result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37228                 } else {
37229                     result += code[i];
37230                 }
37231             }
37232
37233             return result;
37234         };
37235
37236
37237         // return a display-focused string for a given keyboard code
37238         uiCmd.display = function(code) {
37239             if (code.length !== 1) return code;
37240
37241             var detected = utilDetect();
37242             var mac = (detected.os === 'mac');
37243             var replacements = {
37244                 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37245                 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37246                 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37247                 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37248                 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37249                 '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37250                 '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37251                 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37252                 '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37253                 '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37254                 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37255                 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37256             };
37257
37258             return replacements[code] || code;
37259         };
37260
37261         function behaviorCopy(context) {
37262
37263             function groupEntities(ids, graph) {
37264                 var entities = ids.map(function (id) { return graph.entity(id); });
37265                 return Object.assign(
37266                     { relation: [], way: [], node: [] },
37267                     utilArrayGroupBy(entities, 'type')
37268                 );
37269             }
37270
37271
37272             function getDescendants(id, graph, descendants) {
37273                 var entity = graph.entity(id);
37274                 var children;
37275
37276                 descendants = descendants || {};
37277
37278                 if (entity.type === 'relation') {
37279                     children = entity.members.map(function(m) { return m.id; });
37280                 } else if (entity.type === 'way') {
37281                     children = entity.nodes;
37282                 } else {
37283                     children = [];
37284                 }
37285
37286                 for (var i = 0; i < children.length; i++) {
37287                     if (!descendants[children[i]]) {
37288                         descendants[children[i]] = true;
37289                         descendants = getDescendants(children[i], graph, descendants);
37290                     }
37291                 }
37292
37293                 return descendants;
37294             }
37295
37296
37297             function getSelectionText() {
37298                 return window.getSelection().toString();
37299             }
37300
37301
37302             function doCopy() {
37303                 if (!getSelectionText()) {
37304                     event.preventDefault();
37305                 }
37306
37307                 var graph = context.graph();
37308                 var selected = groupEntities(context.selectedIDs(), graph);
37309                 var canCopy = [];
37310                 var skip = {};
37311                 var entity;
37312                 var i;
37313
37314                 for (i = 0; i < selected.relation.length; i++) {
37315                     entity = selected.relation[i];
37316                     if (!skip[entity.id] && entity.isComplete(graph)) {
37317                         canCopy.push(entity.id);
37318                         skip = getDescendants(entity.id, graph, skip);
37319                     }
37320                 }
37321                 for (i = 0; i < selected.way.length; i++) {
37322                     entity = selected.way[i];
37323                     if (!skip[entity.id]) {
37324                         canCopy.push(entity.id);
37325                         skip = getDescendants(entity.id, graph, skip);
37326                     }
37327                 }
37328                 for (i = 0; i < selected.node.length; i++) {
37329                     entity = selected.node[i];
37330                     if (!skip[entity.id]) {
37331                         canCopy.push(entity.id);
37332                     }
37333                 }
37334
37335                 context.copyIDs(canCopy);
37336             }
37337
37338
37339             function behavior() {
37340                 context.keybinding().on(uiCmd('⌘C'), doCopy);
37341                 return behavior;
37342             }
37343
37344             behavior.off = function() {
37345                 context.keybinding().off(uiCmd('⌘C'));
37346             };
37347
37348
37349             return behavior;
37350         }
37351
37352         var _flashTimer;
37353
37354
37355         function uiFlash() {
37356             var _duration = 2000;
37357             var _iconName = '#iD-icon-no';
37358             var _iconClass = 'disabled';
37359             var _text = '';
37360             var _textClass;
37361
37362
37363             function flash() {
37364                 if (_flashTimer) {
37365                     _flashTimer.stop();
37366                 }
37367
37368                 d3_select('#footer-wrap')
37369                     .attr('class', 'footer-hide');
37370                 d3_select('#flash-wrap')
37371                     .attr('class', 'footer-show');
37372
37373                 var content = d3_select('#flash-wrap').selectAll('.flash-content')
37374                     .data([0]);
37375
37376                 // Enter
37377                 var contentEnter = content.enter()
37378                     .append('div')
37379                     .attr('class', 'flash-content');
37380
37381                 var iconEnter = contentEnter
37382                     .append('svg')
37383                     .attr('class', 'flash-icon')
37384                     .append('g')
37385                     .attr('transform', 'translate(10,10)');
37386
37387                 iconEnter
37388                     .append('circle')
37389                     .attr('r', 9);
37390
37391                 iconEnter
37392                     .append('use')
37393                     .attr('transform', 'translate(-7,-7)')
37394                     .attr('width', '14')
37395                     .attr('height', '14');
37396
37397                 contentEnter
37398                     .append('div')
37399                     .attr('class', 'flash-text');
37400
37401
37402                 // Update
37403                 content = content
37404                     .merge(contentEnter);
37405
37406                 content
37407                     .selectAll('.flash-icon')
37408                     .attr('class', 'flash-icon ' + (_iconClass || ''));
37409
37410                 content
37411                     .selectAll('.flash-icon use')
37412                     .attr('xlink:href', _iconName);
37413
37414                 content
37415                     .selectAll('.flash-text')
37416                     .attr('class', 'flash-text ' + (_textClass || ''))
37417                     .text(_text);
37418
37419
37420                 _flashTimer = d3_timeout(function() {
37421                     _flashTimer = null;
37422                     d3_select('#footer-wrap')
37423                         .attr('class', 'footer-show');
37424                     d3_select('#flash-wrap')
37425                         .attr('class', 'footer-hide');
37426                 }, _duration);
37427
37428                 return content;
37429             }
37430
37431
37432             flash.duration = function(_) {
37433                 if (!arguments.length) return _duration;
37434                 _duration = _;
37435                 return flash;
37436             };
37437
37438             flash.text = function(_) {
37439                 if (!arguments.length) return _text;
37440                 _text = _;
37441                 return flash;
37442             };
37443
37444             flash.textClass = function(_) {
37445                 if (!arguments.length) return _textClass;
37446                 _textClass = _;
37447                 return flash;
37448             };
37449
37450             flash.iconName = function(_) {
37451                 if (!arguments.length) return _iconName;
37452                 _iconName = _;
37453                 return flash;
37454             };
37455
37456             flash.iconClass = function(_) {
37457                 if (!arguments.length) return _iconClass;
37458                 _iconClass = _;
37459                 return flash;
37460             };
37461
37462             return flash;
37463         }
37464
37465         /* Creates a keybinding behavior for an operation */
37466         function behaviorOperation(context) {
37467             var _operation;
37468
37469             function keypress() {
37470                 event.preventDefault();
37471                 var disabled = _operation.disabled();
37472                 var flash;
37473
37474                 if (disabled) {
37475                     flash = uiFlash()
37476                         .duration(4000)
37477                         .iconName('#iD-operation-' + _operation.id)
37478                         .iconClass('operation disabled')
37479                         .text(_operation.tooltip);
37480
37481                     flash();
37482
37483                 } else {
37484                     flash = uiFlash()
37485                         .duration(2000)
37486                         .iconName('#iD-operation-' + _operation.id)
37487                         .iconClass('operation')
37488                         .text(_operation.annotation() || _operation.title);
37489
37490                     flash();
37491                     _operation();
37492                 }
37493             }
37494
37495
37496             function behavior() {
37497                 if (_operation && _operation.available()) {
37498                     context.keybinding()
37499                         .on(_operation.keys, keypress);
37500                 }
37501
37502                 return behavior;
37503             }
37504
37505
37506             behavior.off = function() {
37507                 context.keybinding()
37508                     .off(_operation.keys);
37509             };
37510
37511
37512             behavior.which = function (_) {
37513                 if (!arguments.length) return _operation;
37514                 _operation = _;
37515                 return behavior;
37516             };
37517
37518
37519             return behavior;
37520         }
37521
37522         function operationCircularize(selectedIDs, context) {
37523             var entityID = selectedIDs[0];
37524             var entity = context.entity(entityID);
37525             var extent = entity.extent(context.graph());
37526             var geometry = context.geometry(entityID);
37527             var action = actionCircularize(entityID, context.projection);
37528             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37529             var coords = nodes.map(function(n) { return n.loc; });
37530
37531             var operation = function() {
37532                 context.perform(action, operation.annotation());
37533
37534                 window.setTimeout(function() {
37535                     context.validator().validate();
37536                 }, 300);  // after any transition
37537             };
37538
37539
37540             operation.available = function() {
37541                 return selectedIDs.length === 1 &&
37542                     entity.type === 'way' &&
37543                     new Set(entity.nodes).size > 1;
37544             };
37545
37546
37547             // don't cache this because the visible extent could change
37548             operation.disabled = function() {
37549                 var actionDisabled = action.disabled(context.graph());
37550                 if (actionDisabled) {
37551                     return actionDisabled;
37552                 } else if (extent.percentContainedIn(context.extent()) < 0.8) {
37553                     return 'too_large';
37554                 } else if (someMissing()) {
37555                     return 'not_downloaded';
37556                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37557                     return 'connected_to_hidden';
37558                 }
37559
37560                 return false;
37561
37562
37563                 function someMissing() {
37564                     if (context.inIntro()) return false;
37565                     var osm = context.connection();
37566                     if (osm) {
37567                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37568                         if (missing.length) {
37569                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37570                             return true;
37571                         }
37572                     }
37573                     return false;
37574                 }
37575             };
37576
37577
37578             operation.tooltip = function() {
37579                 var disable = operation.disabled();
37580                 return disable ?
37581                     t('operations.circularize.' + disable) :
37582                     t('operations.circularize.description.' + geometry);
37583             };
37584
37585
37586             operation.annotation = function() {
37587                 return t('operations.circularize.annotation.' + geometry);
37588             };
37589
37590
37591             operation.id = 'circularize';
37592             operation.keys = [t('operations.circularize.key')];
37593             operation.title = t('operations.circularize.title');
37594             operation.behavior = behaviorOperation(context).which(operation);
37595
37596             return operation;
37597         }
37598
37599         function operationDelete(selectedIDs, context) {
37600             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37601             var action = actionDeleteMultiple(selectedIDs);
37602             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37603             var coords = nodes.map(function(n) { return n.loc; });
37604             var extent = nodes.reduce(function(extent, node) {
37605                 return extent.extend(node.extent(context.graph()));
37606             }, geoExtent());
37607
37608
37609             var operation = function() {
37610                 var nextSelectedID;
37611                 var nextSelectedLoc;
37612
37613                 if (selectedIDs.length === 1) {
37614                     var id = selectedIDs[0];
37615                     var entity = context.entity(id);
37616                     var geometry = context.geometry(id);
37617                     var parents = context.graph().parentWays(entity);
37618                     var parent = parents[0];
37619
37620                     // Select the next closest node in the way.
37621                     if (geometry === 'vertex') {
37622                         var nodes = parent.nodes;
37623                         var i = nodes.indexOf(id);
37624
37625                         if (i === 0) {
37626                             i++;
37627                         } else if (i === nodes.length - 1) {
37628                             i--;
37629                         } else {
37630                             var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
37631                             var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
37632                             i = a < b ? i - 1 : i + 1;
37633                         }
37634
37635                         nextSelectedID = nodes[i];
37636                         nextSelectedLoc = context.entity(nextSelectedID).loc;
37637                     }
37638                 }
37639
37640                 context.perform(action, operation.annotation());
37641                 context.validator().validate();
37642
37643                 if (nextSelectedID && nextSelectedLoc) {
37644                     if (context.hasEntity(nextSelectedID)) {
37645                         context.enter(modeSelect(context, [nextSelectedID]).follow(true));
37646                     } else {
37647                         context.map().centerEase(nextSelectedLoc);
37648                         context.enter(modeBrowse(context));
37649                     }
37650                 } else {
37651                     context.enter(modeBrowse(context));
37652                 }
37653
37654             };
37655
37656
37657             operation.available = function() {
37658                 return true;
37659             };
37660
37661
37662             operation.disabled = function() {
37663                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37664                     return 'too_large';
37665                 } else if (someMissing()) {
37666                     return 'not_downloaded';
37667                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37668                     return 'connected_to_hidden';
37669                 } else if (selectedIDs.some(protectedMember)) {
37670                     return 'part_of_relation';
37671                 } else if (selectedIDs.some(incompleteRelation)) {
37672                     return 'incomplete_relation';
37673                 } else if (selectedIDs.some(hasWikidataTag)) {
37674                     return 'has_wikidata_tag';
37675                 }
37676
37677                 return false;
37678
37679
37680                 function someMissing() {
37681                     if (context.inIntro()) return false;
37682                     var osm = context.connection();
37683                     if (osm) {
37684                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37685                         if (missing.length) {
37686                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37687                             return true;
37688                         }
37689                     }
37690                     return false;
37691                 }
37692
37693                 function hasWikidataTag(id) {
37694                     var entity = context.entity(id);
37695                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
37696                 }
37697
37698                 function incompleteRelation(id) {
37699                     var entity = context.entity(id);
37700                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37701                 }
37702
37703                 function protectedMember(id) {
37704                     var entity = context.entity(id);
37705                     if (entity.type !== 'way') return false;
37706
37707                     var parents = context.graph().parentRelations(entity);
37708                     for (var i = 0; i < parents.length; i++) {
37709                         var parent = parents[i];
37710                         var type = parent.tags.type;
37711                         var role = parent.memberById(id).role || 'outer';
37712                         if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
37713                             return true;
37714                         }
37715                     }
37716                     return false;
37717                 }
37718             };
37719
37720
37721             operation.tooltip = function() {
37722                 var disable = operation.disabled();
37723                 return disable ?
37724                     t('operations.delete.' + disable + '.' + multi) :
37725                     t('operations.delete.description' + '.' + multi);
37726             };
37727
37728
37729             operation.annotation = function() {
37730                 return selectedIDs.length === 1 ?
37731                     t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
37732                     t('operations.delete.annotation.multiple', { n: selectedIDs.length });
37733             };
37734
37735
37736             operation.id = 'delete';
37737             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
37738             operation.title = t('operations.delete.title');
37739             operation.behavior = behaviorOperation(context).which(operation);
37740
37741             return operation;
37742         }
37743
37744         function operationOrthogonalize(selectedIDs, context) {
37745             var _entityID;
37746             var _entity;
37747             var _geometry;
37748             var action = chooseAction();
37749             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37750             var coords = nodes.map(function(n) { return n.loc; });
37751
37752
37753             function chooseAction() {
37754                 if (selectedIDs.length !== 1) return null;
37755
37756                 _entityID = selectedIDs[0];
37757                 _entity = context.entity(_entityID);
37758                 _geometry = context.geometry(_entityID);
37759
37760                 // square a line/area
37761                 if (_entity.type === 'way' && new Set(_entity.nodes).size > 2 ) {
37762                     return actionOrthogonalize(_entityID, context.projection);
37763
37764                 // square a single vertex
37765                 } else if (_geometry === 'vertex') {
37766                     var graph = context.graph();
37767                     var parents = graph.parentWays(_entity);
37768                     if (parents.length === 1) {
37769                         var way = parents[0];
37770                         if (way.nodes.indexOf(_entityID) !== -1) {
37771                             return actionOrthogonalize(way.id, context.projection, _entityID);
37772                         }
37773                     }
37774                 }
37775
37776                 return null;
37777             }
37778
37779
37780             var operation = function() {
37781                 if (!action) return;
37782
37783                 context.perform(action, operation.annotation());
37784
37785                 window.setTimeout(function() {
37786                     context.validator().validate();
37787                 }, 300);  // after any transition
37788             };
37789
37790
37791             operation.available = function() {
37792                 return Boolean(action);
37793             };
37794
37795
37796             // don't cache this because the visible extent could change
37797             operation.disabled = function() {
37798                 if (!action) return '';
37799
37800                 var actionDisabled = action.disabled(context.graph());
37801                 if (actionDisabled) {
37802                     return actionDisabled;
37803                 } else if (_geometry !== 'vertex' &&
37804                            _entity.extent(context.graph()).percentContainedIn(context.extent()) < 0.8) {
37805                     return 'too_large';
37806                 } else if (someMissing()) {
37807                     return 'not_downloaded';
37808                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37809                     return 'connected_to_hidden';
37810                 }
37811
37812                 return false;
37813
37814
37815                 function someMissing() {
37816                     if (context.inIntro()) return false;
37817                     var osm = context.connection();
37818                     if (osm) {
37819                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37820                         if (missing.length) {
37821                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37822                             return true;
37823                         }
37824                     }
37825                     return false;
37826                 }
37827             };
37828
37829
37830             operation.tooltip = function() {
37831                 var disable = operation.disabled();
37832                 return disable ?
37833                     t('operations.orthogonalize.' + disable) :
37834                     t('operations.orthogonalize.description.' + _geometry);
37835             };
37836
37837
37838             operation.annotation = function() {
37839                 return t('operations.orthogonalize.annotation.' + _geometry);
37840             };
37841
37842
37843             operation.id = 'orthogonalize';
37844             operation.keys = [t('operations.orthogonalize.key')];
37845             operation.title = t('operations.orthogonalize.title');
37846             operation.behavior = behaviorOperation(context).which(operation);
37847
37848             return operation;
37849         }
37850
37851         function operationReflectShort(selectedIDs, context) {
37852             return operationReflect(selectedIDs, context, 'short');
37853         }
37854
37855
37856         function operationReflectLong(selectedIDs, context) {
37857             return operationReflect(selectedIDs, context, 'long');
37858         }
37859
37860
37861         function operationReflect(selectedIDs, context, axis) {
37862             axis = axis || 'long';
37863             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37864             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37865             var coords = nodes.map(function(n) { return n.loc; });
37866             var extent = nodes.reduce(function(extent, node) {
37867                 return extent.extend(node.extent(context.graph()));
37868             }, geoExtent());
37869
37870
37871             var operation = function() {
37872                 var action = actionReflect(selectedIDs, context.projection)
37873                     .useLongAxis(Boolean(axis === 'long'));
37874
37875                 context.perform(action, operation.annotation());
37876
37877                 window.setTimeout(function() {
37878                     context.validator().validate();
37879                 }, 300);  // after any transition
37880             };
37881
37882
37883             operation.available = function() {
37884                 return nodes.length >= 3;
37885             };
37886
37887
37888             // don't cache this because the visible extent could change
37889             operation.disabled = function() {
37890                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37891                     return 'too_large';
37892                 } else if (someMissing()) {
37893                     return 'not_downloaded';
37894                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37895                     return 'connected_to_hidden';
37896                 } else if (selectedIDs.some(incompleteRelation)) {
37897                     return 'incomplete_relation';
37898                 }
37899
37900                 return false;
37901
37902
37903                 function someMissing() {
37904                     if (context.inIntro()) return false;
37905                     var osm = context.connection();
37906                     if (osm) {
37907                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37908                         if (missing.length) {
37909                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37910                             return true;
37911                         }
37912                     }
37913                     return false;
37914                 }
37915
37916                 function incompleteRelation(id) {
37917                     var entity = context.entity(id);
37918                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37919                 }
37920             };
37921
37922
37923             operation.tooltip = function() {
37924                 var disable = operation.disabled();
37925                 return disable ?
37926                     t('operations.reflect.' + disable + '.' + multi) :
37927                     t('operations.reflect.description.' + axis + '.' + multi);
37928             };
37929
37930
37931             operation.annotation = function() {
37932                 return t('operations.reflect.annotation.' + axis + '.' + multi);
37933             };
37934
37935
37936             operation.id = 'reflect-' + axis;
37937             operation.keys = [t('operations.reflect.key.' + axis)];
37938             operation.title = t('operations.reflect.title.' + axis);
37939             operation.behavior = behaviorOperation(context).which(operation);
37940
37941             return operation;
37942         }
37943
37944         function operationMove(selectedIDs, context) {
37945             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37946             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37947             var coords = nodes.map(function(n) { return n.loc; });
37948             var extent = nodes.reduce(function(extent, node) {
37949                 return extent.extend(node.extent(context.graph()));
37950             }, geoExtent());
37951
37952
37953             var operation = function() {
37954                 context.enter(modeMove(context, selectedIDs));
37955             };
37956
37957
37958             operation.available = function() {
37959                 return selectedIDs.length > 1 ||
37960                     context.entity(selectedIDs[0]).type !== 'node';
37961             };
37962
37963
37964             operation.disabled = function() {
37965                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37966                     return 'too_large';
37967                 } else if (someMissing()) {
37968                     return 'not_downloaded';
37969                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37970                     return 'connected_to_hidden';
37971                 } else if (selectedIDs.some(incompleteRelation)) {
37972                     return 'incomplete_relation';
37973                 }
37974
37975                 return false;
37976
37977
37978                 function someMissing() {
37979                     if (context.inIntro()) return false;
37980                     var osm = context.connection();
37981                     if (osm) {
37982                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37983                         if (missing.length) {
37984                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37985                             return true;
37986                         }
37987                     }
37988                     return false;
37989                 }
37990
37991                 function incompleteRelation(id) {
37992                     var entity = context.entity(id);
37993                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37994                 }
37995             };
37996
37997
37998             operation.tooltip = function() {
37999                 var disable = operation.disabled();
38000                 return disable ?
38001                     t('operations.move.' + disable + '.' + multi) :
38002                     t('operations.move.description.' + multi);
38003             };
38004
38005
38006             operation.annotation = function() {
38007                 return selectedIDs.length === 1 ?
38008                     t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
38009                     t('operations.move.annotation.multiple');
38010             };
38011
38012
38013             operation.id = 'move';
38014             operation.keys = [t('operations.move.key')];
38015             operation.title = t('operations.move.title');
38016             operation.behavior = behaviorOperation(context).which(operation);
38017
38018             return operation;
38019         }
38020
38021         function modeRotate(context, entityIDs) {
38022             var mode = {
38023                 id: 'rotate',
38024                 button: 'browse'
38025             };
38026
38027             var keybinding = utilKeybinding('rotate');
38028             var behaviors = [
38029                 behaviorEdit(context),
38030                 operationCircularize(entityIDs, context).behavior,
38031                 operationDelete(entityIDs, context).behavior,
38032                 operationMove(entityIDs, context).behavior,
38033                 operationOrthogonalize(entityIDs, context).behavior,
38034                 operationReflectLong(entityIDs, context).behavior,
38035                 operationReflectShort(entityIDs, context).behavior
38036             ];
38037             var annotation = entityIDs.length === 1 ?
38038                 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
38039                 t('operations.rotate.annotation.multiple');
38040
38041             var _prevGraph;
38042             var _prevAngle;
38043             var _prevTransform;
38044             var _pivot;
38045
38046
38047             function doRotate() {
38048                 var fn;
38049                 if (context.graph() !== _prevGraph) {
38050                     fn = context.perform;
38051                 } else {
38052                     fn = context.replace;
38053                 }
38054
38055                 // projection changed, recalculate _pivot
38056                 var projection = context.projection;
38057                 var currTransform = projection.transform();
38058                 if (!_prevTransform ||
38059                     currTransform.k !== _prevTransform.k ||
38060                     currTransform.x !== _prevTransform.x ||
38061                     currTransform.y !== _prevTransform.y) {
38062
38063                     var nodes = utilGetAllNodes(entityIDs, context.graph());
38064                     var points = nodes.map(function(n) { return projection(n.loc); });
38065
38066                     if (points.length === 1) {  // degenerate case
38067                         _pivot = points[0];
38068                     } else if (points.length === 2) {
38069                         _pivot = geoVecInterp(points[0], points[1], 0.5);
38070                     } else {
38071                         _pivot = d3_polygonCentroid(d3_polygonHull(points));
38072                     }
38073                     _prevAngle = undefined;
38074                 }
38075
38076
38077                 var currMouse = context.mouse();
38078                 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
38079
38080                 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
38081                 var delta = currAngle - _prevAngle;
38082
38083                 fn(actionRotate(entityIDs, _pivot, delta, projection));
38084
38085                 _prevTransform = currTransform;
38086                 _prevAngle = currAngle;
38087                 _prevGraph = context.graph();
38088             }
38089
38090
38091             function finish() {
38092                 event.stopPropagation();
38093                 context.replace(actionNoop(), annotation);
38094                 context.enter(modeSelect(context, entityIDs));
38095             }
38096
38097
38098             function cancel() {
38099                 context.pop();
38100                 context.enter(modeSelect(context, entityIDs));
38101             }
38102
38103
38104             function undone() {
38105                 context.enter(modeBrowse(context));
38106             }
38107
38108
38109             mode.enter = function() {
38110                 context.features().forceVisible(entityIDs);
38111
38112                 behaviors.forEach(context.install);
38113
38114                 context.surface()
38115                     .on('mousemove.rotate', doRotate)
38116                     .on('click.rotate', finish);
38117
38118                 context.history()
38119                     .on('undone.rotate', undone);
38120
38121                 keybinding
38122                     .on('⎋', cancel)
38123                     .on('↩', finish);
38124
38125                 d3_select(document)
38126                     .call(keybinding);
38127             };
38128
38129
38130             mode.exit = function() {
38131                 behaviors.forEach(context.uninstall);
38132
38133                 context.surface()
38134                     .on('mousemove.rotate', null)
38135                     .on('click.rotate', null);
38136
38137                 context.history()
38138                     .on('undone.rotate', null);
38139
38140                 d3_select(document)
38141                     .call(keybinding.unbind);
38142
38143                 context.features().forceVisible([]);
38144             };
38145
38146
38147             mode.selectedIDs = function() {
38148                 if (!arguments.length) return entityIDs;
38149                 // no assign
38150                 return mode;
38151             };
38152
38153
38154             return mode;
38155         }
38156
38157         function operationRotate(selectedIDs, context) {
38158             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38159             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38160             var coords = nodes.map(function(n) { return n.loc; });
38161             var extent = nodes.reduce(function(extent, node) {
38162                 return extent.extend(node.extent(context.graph()));
38163             }, geoExtent());
38164
38165
38166             var operation = function() {
38167                 context.enter(modeRotate(context, selectedIDs));
38168             };
38169
38170
38171             operation.available = function() {
38172                 return nodes.length >= 2;
38173             };
38174
38175
38176             operation.disabled = function() {
38177
38178                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38179                     return 'too_large';
38180                 } else if (someMissing()) {
38181                     return 'not_downloaded';
38182                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38183                     return 'connected_to_hidden';
38184                 } else if (selectedIDs.some(incompleteRelation)) {
38185                     return 'incomplete_relation';
38186                 }
38187
38188                 return false;
38189
38190
38191                 function someMissing() {
38192                     if (context.inIntro()) return false;
38193                     var osm = context.connection();
38194                     if (osm) {
38195                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38196                         if (missing.length) {
38197                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38198                             return true;
38199                         }
38200                     }
38201                     return false;
38202                 }
38203
38204                 function incompleteRelation(id) {
38205                     var entity = context.entity(id);
38206                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38207                 }
38208             };
38209
38210
38211             operation.tooltip = function() {
38212                 var disable = operation.disabled();
38213                 return disable ?
38214                     t('operations.rotate.' + disable + '.' + multi) :
38215                     t('operations.rotate.description.' + multi);
38216             };
38217
38218
38219             operation.annotation = function() {
38220                 return selectedIDs.length === 1 ?
38221                     t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
38222                     t('operations.rotate.annotation.multiple');
38223             };
38224
38225
38226             operation.id = 'rotate';
38227             operation.keys = [t('operations.rotate.key')];
38228             operation.title = t('operations.rotate.title');
38229             operation.behavior = behaviorOperation(context).which(operation);
38230
38231             return operation;
38232         }
38233
38234         function modeMove(context, entityIDs, baseGraph) {
38235             var mode = {
38236                 id: 'move',
38237                 button: 'browse'
38238             };
38239
38240             var keybinding = utilKeybinding('move');
38241             var behaviors = [
38242                 behaviorEdit(context),
38243                 operationCircularize(entityIDs, context).behavior,
38244                 operationDelete(entityIDs, context).behavior,
38245                 operationOrthogonalize(entityIDs, context).behavior,
38246                 operationReflectLong(entityIDs, context).behavior,
38247                 operationReflectShort(entityIDs, context).behavior,
38248                 operationRotate(entityIDs, context).behavior
38249             ];
38250             var annotation = entityIDs.length === 1 ?
38251                 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
38252                 t('operations.move.annotation.multiple');
38253
38254             var _prevGraph;
38255             var _cache;
38256             var _origin;
38257             var _nudgeInterval;
38258
38259
38260             function doMove(nudge) {
38261                 nudge = nudge || [0, 0];
38262
38263                 var fn;
38264                 if (_prevGraph !== context.graph()) {
38265                     _cache = {};
38266                     _origin = context.map().mouseCoordinates();
38267                     fn = context.perform;
38268                 } else {
38269                     fn = context.overwrite;
38270                 }
38271
38272                 var currMouse = context.mouse();
38273                 var origMouse = context.projection(_origin);
38274                 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
38275
38276                 fn(actionMove(entityIDs, delta, context.projection, _cache));
38277                 _prevGraph = context.graph();
38278             }
38279
38280
38281             function startNudge(nudge) {
38282                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38283                 _nudgeInterval = window.setInterval(function() {
38284                     context.pan(nudge);
38285                     doMove(nudge);
38286                 }, 50);
38287             }
38288
38289
38290             function stopNudge() {
38291                 if (_nudgeInterval) {
38292                     window.clearInterval(_nudgeInterval);
38293                     _nudgeInterval = null;
38294                 }
38295             }
38296
38297
38298             function move() {
38299                 doMove();
38300                 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
38301                 if (nudge) {
38302                     startNudge(nudge);
38303                 } else {
38304                     stopNudge();
38305                 }
38306             }
38307
38308
38309             function finish() {
38310                 event.stopPropagation();
38311                 context.replace(actionNoop(), annotation);
38312                 context.enter(modeSelect(context, entityIDs));
38313                 stopNudge();
38314             }
38315
38316
38317             function cancel() {
38318                 if (baseGraph) {
38319                     while (context.graph() !== baseGraph) context.pop();
38320                     context.enter(modeBrowse(context));
38321                 } else {
38322                     context.pop();
38323                     context.enter(modeSelect(context, entityIDs));
38324                 }
38325                 stopNudge();
38326             }
38327
38328
38329             function undone() {
38330                 context.enter(modeBrowse(context));
38331             }
38332
38333
38334             mode.enter = function() {
38335                 _origin = context.map().mouseCoordinates();
38336                 _prevGraph = null;
38337                 _cache = {};
38338
38339                 context.features().forceVisible(entityIDs);
38340
38341                 behaviors.forEach(context.install);
38342
38343                 context.surface()
38344                     .on('mousemove.move', move)
38345                     .on('click.move', finish);
38346
38347                 context.history()
38348                     .on('undone.move', undone);
38349
38350                 keybinding
38351                     .on('⎋', cancel)
38352                     .on('↩', finish);
38353
38354                 d3_select(document)
38355                     .call(keybinding);
38356             };
38357
38358
38359             mode.exit = function() {
38360                 stopNudge();
38361
38362                 behaviors.forEach(function(behavior) {
38363                     context.uninstall(behavior);
38364                 });
38365
38366                 context.surface()
38367                     .on('mousemove.move', null)
38368                     .on('click.move', null);
38369
38370                 context.history()
38371                     .on('undone.move', null);
38372
38373                 d3_select(document)
38374                     .call(keybinding.unbind);
38375
38376                 context.features().forceVisible([]);
38377             };
38378
38379
38380             mode.selectedIDs = function() {
38381                 if (!arguments.length) return entityIDs;
38382                 // no assign
38383                 return mode;
38384             };
38385
38386
38387             return mode;
38388         }
38389
38390         function behaviorPaste(context) {
38391
38392             function doPaste() {
38393                 event.preventDefault();
38394
38395                 var baseGraph = context.graph();
38396                 var mouse = context.mouse();
38397                 var projection = context.projection;
38398                 var viewport = geoExtent(projection.clipExtent()).polygon();
38399
38400                 if (!geoPointInPolygon(mouse, viewport)) return;
38401
38402                 var extent = geoExtent();
38403                 var oldIDs = context.copyIDs();
38404                 var oldGraph = context.copyGraph();
38405                 var newIDs = [];
38406
38407                 if (!oldIDs.length) return;
38408
38409                 var action = actionCopyEntities(oldIDs, oldGraph);
38410                 context.perform(action);
38411
38412                 var copies = action.copies();
38413                 var originals = new Set();
38414                 Object.values(copies).forEach(function(entity) { originals.add(entity.id); });
38415
38416                 for (var id in copies) {
38417                     var oldEntity = oldGraph.entity(id);
38418                     var newEntity = copies[id];
38419
38420                     extent._extend(oldEntity.extent(oldGraph));
38421
38422                     // Exclude child nodes from newIDs if their parent way was also copied.
38423                     var parents = context.graph().parentWays(newEntity);
38424                     var parentCopied = parents.some(function(parent) {
38425                         return originals.has(parent.id);
38426                     });
38427
38428                     if (!parentCopied) {
38429                         newIDs.push(newEntity.id);
38430                     }
38431                 }
38432
38433                 // Put pasted objects where mouse pointer is..
38434                 var center = projection(extent.center());
38435                 var delta = geoVecSubtract(mouse, center);
38436
38437                 context.perform(actionMove(newIDs, delta, projection));
38438                 context.enter(modeMove(context, newIDs, baseGraph));
38439             }
38440
38441
38442             function behavior() {
38443                 context.keybinding().on(uiCmd('⌘V'), doPaste);
38444                 return behavior;
38445             }
38446
38447
38448             behavior.off = function() {
38449                 context.keybinding().off(uiCmd('⌘V'));
38450             };
38451
38452
38453             return behavior;
38454         }
38455
38456         /*
38457             `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
38458
38459             * The `origin` function is expected to return an [x, y] tuple rather than an
38460               {x, y} object.
38461             * The events are `start`, `move`, and `end`.
38462               (https://github.com/mbostock/d3/issues/563)
38463             * The `start` event is not dispatched until the first cursor movement occurs.
38464               (https://github.com/mbostock/d3/pull/368)
38465             * The `move` event has a `point` and `delta` [x, y] tuple properties rather
38466               than `x`, `y`, `dx`, and `dy` properties.
38467             * The `end` event is not dispatched if no movement occurs.
38468             * An `off` function is available that unbinds the drag's internal event handlers.
38469          */
38470
38471         function behaviorDrag() {
38472             var dispatch$1 = dispatch('start', 'move', 'end');
38473             var _origin = null;
38474             var _selector = '';
38475             var _event;
38476             var _target;
38477             var _surface;
38478
38479
38480             var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
38481             var d3_event_userSelectSuppress = function() {
38482                     var selection$1 = selection();
38483                     var select = selection$1.style(d3_event_userSelectProperty);
38484                     selection$1.style(d3_event_userSelectProperty, 'none');
38485                     return function() {
38486                         selection$1.style(d3_event_userSelectProperty, select);
38487                     };
38488                 };
38489
38490
38491             function d3_eventCancel() {
38492                 event.stopPropagation();
38493                 event.preventDefault();
38494             }
38495
38496
38497             function eventOf(thiz, argumentz) {
38498                 return function(e1) {
38499                     e1.target = behavior;
38500                     customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
38501                 };
38502             }
38503
38504
38505             function dragstart() {
38506                 _target = this;
38507                 _event = eventOf(_target, arguments);
38508
38509                 var eventTarget = event.target;
38510                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
38511                 var offset;
38512                 var startOrigin = point();
38513                 var started = false;
38514                 var selectEnable = d3_event_userSelectSuppress();
38515
38516                 d3_select(window)
38517                     .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
38518                     .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
38519
38520                 if (_origin) {
38521                     offset = _origin.apply(_target, arguments);
38522                     offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
38523                 } else {
38524                     offset = [0, 0];
38525                 }
38526
38527                 if (touchId === null) {
38528                     event.stopPropagation();
38529                 }
38530
38531
38532                 function point() {
38533                     var p = _surface || _target.parentNode;
38534                     return touchId !== null ? d3_touches(p).filter(function(p) {
38535                         return p.identifier === touchId;
38536                     })[0] : d3_mouse(p);
38537                 }
38538
38539
38540                 function dragmove() {
38541                     var p = point();
38542                     var dx = p[0] - startOrigin[0];
38543                     var dy = p[1] - startOrigin[1];
38544
38545                     if (dx === 0 && dy === 0)
38546                         return;
38547
38548                     startOrigin = p;
38549                     d3_eventCancel();
38550
38551                     if (!started) {
38552                         started = true;
38553                         _event({ type: 'start' });
38554                     } else {
38555                         _event({
38556                             type: 'move',
38557                             point: [p[0] + offset[0],  p[1] + offset[1]],
38558                             delta: [dx, dy]
38559                         });
38560                     }
38561                 }
38562
38563
38564                 function dragend() {
38565                     if (started) {
38566                         _event({ type: 'end' });
38567
38568                         d3_eventCancel();
38569                         if (event.target === eventTarget) {
38570                             d3_select(window)
38571                                 .on('click.drag', click, true);
38572                         }
38573                     }
38574
38575                     d3_select(window)
38576                         .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
38577                         .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
38578
38579                     selectEnable();
38580                 }
38581
38582
38583                 function click() {
38584                     d3_eventCancel();
38585                     d3_select(window)
38586                         .on('click.drag', null);
38587                 }
38588             }
38589
38590
38591             function behavior(selection) {
38592                 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
38593                 var delegate = dragstart;
38594
38595                 if (_selector) {
38596                     delegate = function() {
38597                         var root = this;
38598                         var target = event.target;
38599                         for (; target && target !== root; target = target.parentNode) {
38600                             var datum = target.__data__;
38601
38602                             var entity = datum instanceof osmNote ? datum
38603                                 : datum && datum.properties && datum.properties.entity;
38604
38605                             if (entity && target[matchesSelector](_selector)) {
38606                                 return dragstart.call(target, entity);
38607                             }
38608                         }
38609                     };
38610                 }
38611
38612                 selection
38613                     .on('mousedown.drag' + _selector, delegate)
38614                     .on('touchstart.drag' + _selector, delegate);
38615             }
38616
38617
38618             behavior.off = function(selection) {
38619                 selection
38620                     .on('mousedown.drag' + _selector, null)
38621                     .on('touchstart.drag' + _selector, null);
38622             };
38623
38624
38625             behavior.selector = function(_) {
38626                 if (!arguments.length) return _selector;
38627                 _selector = _;
38628                 return behavior;
38629             };
38630
38631
38632             behavior.origin = function(_) {
38633                 if (!arguments.length) return _origin;
38634                 _origin = _;
38635                 return behavior;
38636             };
38637
38638
38639             behavior.cancel = function() {
38640                 d3_select(window)
38641                     .on('mousemove.drag', null)
38642                     .on('mouseup.drag', null);
38643                 return behavior;
38644             };
38645
38646
38647             behavior.target = function() {
38648                 if (!arguments.length) return _target;
38649                 _target = arguments[0];
38650                 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
38651                 return behavior;
38652             };
38653
38654
38655             behavior.surface = function() {
38656                 if (!arguments.length) return _surface;
38657                 _surface = arguments[0];
38658                 return behavior;
38659             };
38660
38661
38662             return utilRebind(behavior, dispatch$1, 'on');
38663         }
38664
38665         function modeDragNode(context) {
38666             var mode = {
38667                 id: 'drag-node',
38668                 button: 'browse'
38669             };
38670             var hover = behaviorHover(context).altDisables(true)
38671                 .on('hover', context.ui().sidebar.hover);
38672             var edit = behaviorEdit(context);
38673
38674             var _nudgeInterval;
38675             var _restoreSelectedIDs = [];
38676             var _wasMidpoint = false;
38677             var _isCancelled = false;
38678             var _activeEntity;
38679             var _startLoc;
38680             var _lastLoc;
38681
38682
38683             function startNudge(entity, nudge) {
38684                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38685                 _nudgeInterval = window.setInterval(function() {
38686                     context.pan(nudge);
38687                     doMove(entity, nudge);
38688                 }, 50);
38689             }
38690
38691
38692             function stopNudge() {
38693                 if (_nudgeInterval) {
38694                     window.clearInterval(_nudgeInterval);
38695                     _nudgeInterval = null;
38696                 }
38697             }
38698
38699
38700             function moveAnnotation(entity) {
38701                 return t('operations.move.annotation.' + entity.geometry(context.graph()));
38702             }
38703
38704
38705             function connectAnnotation(nodeEntity, targetEntity) {
38706                 var nodeGeometry = nodeEntity.geometry(context.graph());
38707                 var targetGeometry = targetEntity.geometry(context.graph());
38708                 if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
38709                     var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
38710                     var targetParentWayIDs = context.graph().parentWays(targetEntity);
38711                     var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
38712                     // if both vertices are part of the same way
38713                     if (sharedParentWays.length !== 0) {
38714                         // if the nodes are next to each other, they are merged
38715                         if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
38716                             return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
38717                         }
38718                         return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
38719                     }
38720                 }
38721                 return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
38722             }
38723
38724
38725             function shouldSnapToNode(target) {
38726                 if (!_activeEntity) return false;
38727                 return _activeEntity.geometry(context.graph()) !== 'vertex' ||
38728                     (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
38729             }
38730
38731
38732             function origin(entity) {
38733                 return context.projection(entity.loc);
38734             }
38735
38736
38737             function keydown() {
38738                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38739                     if (context.surface().classed('nope')) {
38740                         context.surface()
38741                             .classed('nope-suppressed', true);
38742                     }
38743                     context.surface()
38744                         .classed('nope', false)
38745                         .classed('nope-disabled', true);
38746                 }
38747             }
38748
38749
38750             function keyup() {
38751                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38752                     if (context.surface().classed('nope-suppressed')) {
38753                         context.surface()
38754                             .classed('nope', true);
38755                     }
38756                     context.surface()
38757                         .classed('nope-suppressed', false)
38758                         .classed('nope-disabled', false);
38759                 }
38760             }
38761
38762
38763             function start(entity) {
38764                 _wasMidpoint = entity.type === 'midpoint';
38765                 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
38766                 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
38767
38768
38769                 if (_isCancelled) {
38770                     if (hasHidden) {
38771                         uiFlash()
38772                             .duration(4000)
38773                             .text(t('modes.drag_node.connected_to_hidden'))();
38774                     }
38775                     return drag.cancel();
38776                 }
38777
38778                 if (_wasMidpoint) {
38779                     var midpoint = entity;
38780                     entity = osmNode();
38781                     context.perform(actionAddMidpoint(midpoint, entity));
38782                     entity = context.entity(entity.id);   // get post-action entity
38783
38784                     var vertex = context.surface().selectAll('.' + entity.id);
38785                     drag.target(vertex.node(), entity);
38786
38787                 } else {
38788                     context.perform(actionNoop());
38789                 }
38790
38791                 _activeEntity = entity;
38792                 _startLoc = entity.loc;
38793
38794                 hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
38795
38796                 context.surface().selectAll('.' + _activeEntity.id)
38797                     .classed('active', true);
38798
38799                 context.enter(mode);
38800             }
38801
38802
38803             // related code
38804             // - `behavior/draw.js` `datum()`
38805             function datum() {
38806                 var event$1 = event && event.sourceEvent;
38807                 if (!event$1 || event$1.altKey) {
38808                     return {};
38809                 } else {
38810                     // When dragging, snap only to touch targets..
38811                     // (this excludes area fills and active drawing elements)
38812                     var d = event$1.target.__data__;
38813                     return (d && d.properties && d.properties.target) ? d : {};
38814                 }
38815             }
38816
38817
38818             function doMove(entity, nudge) {
38819                 nudge = nudge || [0, 0];
38820
38821                 var currPoint = (event && event.point) || context.projection(_lastLoc);
38822                 var currMouse = geoVecSubtract(currPoint, nudge);
38823                 var loc = context.projection.invert(currMouse);
38824
38825                 if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
38826                     // related code
38827                     // - `mode/drag_node.js`     `doMode()`
38828                     // - `behavior/draw.js`      `click()`
38829                     // - `behavior/draw_way.js`  `move()`
38830                     var d = datum();
38831                     var target = d && d.properties && d.properties.entity;
38832                     var targetLoc = target && target.loc;
38833                     var targetNodes = d && d.properties && d.properties.nodes;
38834                     var edge;
38835
38836                     if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
38837                         if (shouldSnapToNode(target)) {
38838                             loc = targetLoc;
38839                         }
38840
38841                     } else if (targetNodes) {   // snap to way - a line target with `.nodes`
38842                         edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
38843                         if (edge) {
38844                             loc = edge.loc;
38845                         }
38846                     }
38847                 }
38848
38849                 context.replace(
38850                     actionMoveNode(entity.id, loc)
38851                 );
38852
38853                 // Below here: validations
38854                 var isInvalid = false;
38855
38856                 // Check if this connection to `target` could cause relations to break..
38857                 if (target) {
38858                     isInvalid = hasRelationConflict(entity, target, edge, context.graph());
38859                 }
38860
38861                 // Check if this drag causes the geometry to break..
38862                 if (!isInvalid) {
38863                     isInvalid = hasInvalidGeometry(entity, context.graph());
38864                 }
38865
38866
38867                 var nope = context.surface().classed('nope');
38868                 if (isInvalid === 'relation' || isInvalid === 'restriction') {
38869                     if (!nope) {   // about to nope - show hint
38870                         uiFlash()
38871                             .duration(4000)
38872                             .text(t('operations.connect.' + isInvalid,
38873                                 { relation: context.presets().item('type/restriction').name() }
38874                             ))();
38875                     }
38876                 } else {
38877                     if (nope) {   // about to un-nope, remove hint
38878                         uiFlash()
38879                             .duration(1)
38880                             .text('')();
38881                     }
38882                 }
38883
38884
38885                 var nopeDisabled = context.surface().classed('nope-disabled');
38886                 if (nopeDisabled) {
38887                     context.surface()
38888                         .classed('nope', false)
38889                         .classed('nope-suppressed', isInvalid);
38890                 } else {
38891                     context.surface()
38892                         .classed('nope', isInvalid)
38893                         .classed('nope-suppressed', false);
38894                 }
38895
38896                 _lastLoc = loc;
38897             }
38898
38899
38900             // Uses `actionConnect.disabled()` to know whether this connection is ok..
38901             function hasRelationConflict(entity, target, edge, graph) {
38902                 var testGraph = graph.update();  // copy
38903
38904                 // if snapping to way - add midpoint there and consider that the target..
38905                 if (edge) {
38906                     var midpoint = osmNode();
38907                     var action = actionAddMidpoint({
38908                         loc: edge.loc,
38909                         edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
38910                     }, midpoint);
38911
38912                     testGraph = action(testGraph);
38913                     target = midpoint;
38914                 }
38915
38916                 // can we connect to it?
38917                 var ids = [entity.id, target.id];
38918                 return actionConnect(ids).disabled(testGraph);
38919             }
38920
38921
38922             function hasInvalidGeometry(entity, graph) {
38923                 var parents = graph.parentWays(entity);
38924                 var i, j, k;
38925
38926                 for (i = 0; i < parents.length; i++) {
38927                     var parent = parents[i];
38928                     var nodes = [];
38929                     var activeIndex = null;    // which multipolygon ring contains node being dragged
38930
38931                     // test any parent multipolygons for valid geometry
38932                     var relations = graph.parentRelations(parent);
38933                     for (j = 0; j < relations.length; j++) {
38934                         if (!relations[j].isMultipolygon()) continue;
38935
38936                         var rings = osmJoinWays(relations[j].members, graph);
38937
38938                         // find active ring and test it for self intersections
38939                         for (k = 0; k < rings.length; k++) {
38940                             nodes = rings[k].nodes;
38941                             if (nodes.find(function(n) { return n.id === entity.id; })) {
38942                                 activeIndex = k;
38943                                 if (geoHasSelfIntersections(nodes, entity.id)) {
38944                                     return true;
38945                                 }
38946                             }
38947                             rings[k].coords = nodes.map(function(n) { return n.loc; });
38948                         }
38949
38950                         // test active ring for intersections with other rings in the multipolygon
38951                         for (k = 0; k < rings.length; k++) {
38952                             if (k === activeIndex) continue;
38953
38954                             // make sure active ring doesnt cross passive rings
38955                             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
38956                                 return true;
38957                             }
38958                         }
38959                     }
38960
38961
38962                     // If we still haven't tested this node's parent way for self-intersections.
38963                     // (because it's not a member of a multipolygon), test it now.
38964                     if (activeIndex === null) {
38965                         nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
38966                         if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
38967                             return true;
38968                         }
38969                     }
38970
38971                 }
38972
38973                 return false;
38974             }
38975
38976
38977             function move(entity) {
38978                 if (_isCancelled) return;
38979                 event.sourceEvent.stopPropagation();
38980
38981                 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
38982
38983                 _lastLoc = context.projection.invert(event.point);
38984
38985                 doMove(entity);
38986                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
38987                 if (nudge) {
38988                     startNudge(entity, nudge);
38989                 } else {
38990                     stopNudge();
38991                 }
38992             }
38993
38994             function end(entity) {
38995                 if (_isCancelled) return;
38996
38997                 var d = datum();
38998                 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
38999                 var target = d && d.properties && d.properties.entity;   // entity to snap to
39000
39001                 if (nope) {   // bounce back
39002                     context.perform(
39003                         _actionBounceBack(entity.id, _startLoc)
39004                     );
39005
39006                 } else if (target && target.type === 'way') {
39007                     var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39008                     context.replace(
39009                         actionAddMidpoint({
39010                             loc: choice.loc,
39011                             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39012                         }, entity),
39013                         connectAnnotation(entity, target)
39014                     );
39015
39016                 } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
39017                     context.replace(
39018                         actionConnect([target.id, entity.id]),
39019                         connectAnnotation(entity, target)
39020                     );
39021
39022                 } else if (_wasMidpoint) {
39023                     context.replace(
39024                         actionNoop(),
39025                         t('operations.add.annotation.vertex')
39026                     );
39027
39028                 } else {
39029                     context.replace(
39030                         actionNoop(),
39031                         moveAnnotation(entity)
39032                     );
39033                 }
39034
39035                 var reselection = _restoreSelectedIDs.filter(function(id) {
39036                     return context.graph().hasEntity(id);
39037                 });
39038
39039                 if (reselection.length) {
39040                     context.enter(modeSelect(context, reselection));
39041                 } else {
39042                     context.enter(modeBrowse(context));
39043                 }
39044             }
39045
39046
39047             function _actionBounceBack(nodeID, toLoc) {
39048                 var moveNode = actionMoveNode(nodeID, toLoc);
39049                 var action = function(graph, t) {
39050                     // last time through, pop off the bounceback perform.
39051                     // it will then overwrite the initial perform with a moveNode that does nothing
39052                     if (t === 1) context.pop();
39053                     return moveNode(graph, t);
39054                 };
39055                 action.transitionable = true;
39056                 return action;
39057             }
39058
39059
39060             function cancel() {
39061                 drag.cancel();
39062                 context.enter(modeBrowse(context));
39063             }
39064
39065
39066             var drag = behaviorDrag()
39067                 .selector('.layer-touch.points .target')
39068                 .surface(d3_select('#map').node())
39069                 .origin(origin)
39070                 .on('start', start)
39071                 .on('move', move)
39072                 .on('end', end);
39073
39074
39075             mode.enter = function() {
39076                 context.install(hover);
39077                 context.install(edit);
39078
39079                 d3_select(window)
39080                     .on('keydown.drawWay', keydown)
39081                     .on('keyup.drawWay', keyup);
39082
39083                 context.history()
39084                     .on('undone.drag-node', cancel);
39085             };
39086
39087
39088             mode.exit = function() {
39089                 context.ui().sidebar.hover.cancel();
39090                 context.uninstall(hover);
39091                 context.uninstall(edit);
39092
39093                 d3_select(window)
39094                     .on('keydown.hover', null)
39095                     .on('keyup.hover', null);
39096
39097                 context.history()
39098                     .on('undone.drag-node', null);
39099
39100                 _activeEntity = null;
39101
39102                 context.surface()
39103                     .classed('nope', false)
39104                     .classed('nope-suppressed', false)
39105                     .classed('nope-disabled', false)
39106                     .selectAll('.active')
39107                     .classed('active', false);
39108
39109                 stopNudge();
39110             };
39111
39112
39113             mode.selectedIDs = function() {
39114                 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39115                 // no assign
39116                 return mode;
39117             };
39118
39119
39120             mode.activeID = function() {
39121                 if (!arguments.length) return _activeEntity && _activeEntity.id;
39122                 // no assign
39123                 return mode;
39124             };
39125
39126
39127             mode.restoreSelectedIDs = function(_) {
39128                 if (!arguments.length) return _restoreSelectedIDs;
39129                 _restoreSelectedIDs = _;
39130                 return mode;
39131             };
39132
39133
39134             mode.behavior = drag;
39135
39136
39137             return mode;
39138         }
39139
39140         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"};
39141         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: \\((.+)\\)"}};
39142
39143         var tiler = utilTiler();
39144         var dispatch$1 = dispatch('loaded');
39145
39146         var _krCache;
39147         var _krZoom = 14;
39148         var _krUrlRoot = 'https://www.keepright.at/';
39149
39150         var _krRuleset = [
39151             // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
39152             30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
39153             190, 191, 192, 193, 194, 195, 196, 197, 198,
39154             200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
39155             230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
39156             290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
39157             320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
39158         ];
39159
39160
39161         function abortRequest(controller) {
39162             if (controller) {
39163                 controller.abort();
39164             }
39165         }
39166
39167         function abortUnwantedRequests(cache, tiles) {
39168             Object.keys(cache.inflightTile).forEach(function(k) {
39169                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39170                 if (!wanted) {
39171                     abortRequest(cache.inflightTile[k]);
39172                     delete cache.inflightTile[k];
39173                 }
39174             });
39175         }
39176
39177
39178         function encodeErrorRtree(d) {
39179             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39180         }
39181
39182
39183         // replace or remove error from rtree
39184         function updateRtree(item, replace) {
39185             _krCache.rtree.remove(item, function isEql(a, b) {
39186                 return a.data.id === b.data.id;
39187             });
39188
39189             if (replace) {
39190                 _krCache.rtree.insert(item);
39191             }
39192         }
39193
39194
39195         function tokenReplacements(d) {
39196             if (!(d instanceof qaError)) return;
39197
39198             var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
39199             var replacements = {};
39200
39201             var errorTemplate = errorTypes[d.which_type];
39202             if (!errorTemplate) {
39203                 /* eslint-disable no-console */
39204                 console.log('No Template: ', d.which_type);
39205                 console.log('  ', d.description);
39206                 /* eslint-enable no-console */
39207                 return;
39208             }
39209
39210             // some descriptions are just fixed text
39211             if (!errorTemplate.regex) return;
39212
39213             // regex pattern should match description with variable details captured
39214             var errorRegex = new RegExp(errorTemplate.regex, 'i');
39215             var errorMatch = errorRegex.exec(d.description);
39216             if (!errorMatch) {
39217                 /* eslint-disable no-console */
39218                 console.log('Unmatched: ', d.which_type);
39219                 console.log('  ', d.description);
39220                 console.log('  ', errorRegex);
39221                 /* eslint-enable no-console */
39222                 return;
39223             }
39224
39225             for (var i = 1; i < errorMatch.length; i++) {   // skip first
39226                 var capture = errorMatch[i];
39227                 var idType;
39228
39229                 idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
39230                 if (idType && capture) {   // link IDs if present in the capture
39231                     capture = parseError(capture, idType);
39232                 } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
39233                     capture = '\\' +  capture + '\\';
39234                 } else {
39235                     var compare = capture.toLowerCase();
39236                     if (localizeStrings[compare]) {   // some replacement strings can be localized
39237                         capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39238                     }
39239                 }
39240
39241                 replacements['var' + i] = capture;
39242             }
39243
39244             return replacements;
39245         }
39246
39247
39248         function parseError(capture, idType) {
39249             var compare = capture.toLowerCase();
39250             if (localizeStrings[compare]) {   // some replacement strings can be localized
39251                 capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39252             }
39253
39254             switch (idType) {
39255                 // link a string like "this node"
39256                 case 'this':
39257                     capture = linkErrorObject(capture);
39258                     break;
39259
39260                 case 'url':
39261                     capture = linkURL(capture);
39262                     break;
39263
39264                 // link an entity ID
39265                 case 'n':
39266                 case 'w':
39267                 case 'r':
39268                     capture = linkEntity(idType + capture);
39269                     break;
39270
39271                 // some errors have more complex ID lists/variance
39272                 case '20':
39273                     capture = parse20(capture);
39274                     break;
39275                 case '211':
39276                     capture = parse211(capture);
39277                     break;
39278                 case '231':
39279                     capture = parse231(capture);
39280                     break;
39281                 case '294':
39282                     capture = parse294(capture);
39283                     break;
39284                 case '370':
39285                     capture = parse370(capture);
39286                     break;
39287             }
39288
39289             return capture;
39290
39291
39292             function linkErrorObject(d) {
39293                 return '<a class="error_object_link">' + d + '</a>';
39294             }
39295
39296             function linkEntity(d) {
39297                 return '<a class="error_entity_link">' + d + '</a>';
39298             }
39299
39300             function linkURL(d) {
39301                 return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
39302             }
39303
39304             // arbitrary node list of form: #ID, #ID, #ID...
39305             function parse211(capture) {
39306                 var newList = [];
39307                 var items = capture.split(', ');
39308
39309                 items.forEach(function(item) {
39310                     // ID has # at the front
39311                     var id = linkEntity('n' + item.slice(1));
39312                     newList.push(id);
39313                 });
39314
39315                 return newList.join(', ');
39316             }
39317
39318             // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
39319             function parse231(capture) {
39320                 var newList = [];
39321                 // unfortunately 'layer' can itself contain commas, so we split on '),'
39322                 var items = capture.split('),');
39323
39324                 items.forEach(function(item) {
39325                     var match = item.match(/\#(\d+)\((.+)\)?/);
39326                     if (match !== null && match.length > 2) {
39327                         newList.push(linkEntity('w' + match[1]) + ' ' +
39328                             t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
39329                         );
39330                     }
39331                 });
39332
39333                 return newList.join(', ');
39334             }
39335
39336             // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
39337             function parse294(capture) {
39338                 var newList = [];
39339                 var items = capture.split(',');
39340
39341                 items.forEach(function(item) {
39342                     var role;
39343                     var idType;
39344                     var id;
39345
39346                     // item of form "from/to node/relation #ID"
39347                     item = item.split(' ');
39348
39349                     // to/from role is more clear in quotes
39350                     role = '"' + item[0] + '"';
39351
39352                     // first letter of node/relation provides the type
39353                     idType = item[1].slice(0,1);
39354
39355                     // ID has # at the front
39356                     id = item[2].slice(1);
39357                     id = linkEntity(idType + id);
39358
39359                     item = [role, item[1], id].join(' ');
39360                     newList.push(item);
39361                 });
39362
39363                 return newList.join(', ');
39364             }
39365
39366             // may or may not include the string "(including the name 'name')"
39367             function parse370(capture) {
39368                 if (!capture) return '';
39369
39370                 var match = capture.match(/\(including the name (\'.+\')\)/);
39371                 if (match !== null && match.length) {
39372                     return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
39373                 }
39374                 return '';
39375             }
39376
39377             // arbitrary node list of form: #ID,#ID,#ID...
39378             function parse20(capture) {
39379                 var newList = [];
39380                 var items = capture.split(',');
39381
39382                 items.forEach(function(item) {
39383                     // ID has # at the front
39384                     var id = linkEntity('n' + item.slice(1));
39385                     newList.push(id);
39386                 });
39387
39388                 return newList.join(', ');
39389             }
39390         }
39391
39392
39393         var serviceKeepRight = {
39394             init: function() {
39395                 if (!_krCache) {
39396                     this.reset();
39397                 }
39398
39399                 this.event = utilRebind(this, dispatch$1, 'on');
39400             },
39401
39402             reset: function() {
39403                 if (_krCache) {
39404                     Object.values(_krCache.inflightTile).forEach(abortRequest);
39405                 }
39406
39407                 _krCache = {
39408                     data: {},
39409                     loadedTile: {},
39410                     inflightTile: {},
39411                     inflightPost: {},
39412                     closed: {},
39413                     rtree: rbush_1()
39414                 };
39415             },
39416
39417
39418             // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
39419             loadErrors: function(projection) {
39420                 var options = { format: 'geojson' };
39421                 var rules = _krRuleset.join();
39422
39423                 // determine the needed tiles to cover the view
39424                 var tiles = tiler
39425                     .zoomExtent([_krZoom, _krZoom])
39426                     .getTiles(projection);
39427
39428                 // abort inflight requests that are no longer needed
39429                 abortUnwantedRequests(_krCache, tiles);
39430
39431                 // issue new requests..
39432                 tiles.forEach(function(tile) {
39433                     if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
39434
39435                     var rect = tile.extent.rectangle();
39436                     var params = Object.assign({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
39437                     var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
39438
39439                     var controller = new AbortController();
39440                     _krCache.inflightTile[tile.id] = controller;
39441
39442                     d3_json(url, { signal: controller.signal })
39443                         .then(function(data) {
39444                             delete _krCache.inflightTile[tile.id];
39445                             _krCache.loadedTile[tile.id] = true;
39446                             if (!data || !data.features || !data.features.length) {
39447                                 throw new Error('No Data');
39448                             }
39449
39450                             data.features.forEach(function(feature) {
39451                                 var loc = feature.geometry.coordinates;
39452                                 var props = feature.properties;
39453
39454                                 // if there is a parent, save its error type e.g.:
39455                                 //  Error 191 = "highway-highway"
39456                                 //  Error 190 = "intersections without junctions"  (parent)
39457                                 var errorType = props.error_type;
39458                                 var errorTemplate = errorTypes[errorType];
39459                                 var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
39460
39461                                 // try to handle error type directly, fallback to parent error type.
39462                                 var whichType = errorTemplate ? errorType : parentErrorType;
39463                                 var whichTemplate = errorTypes[whichType];
39464
39465                                 // Rewrite a few of the errors at this point..
39466                                 // This is done to make them easier to linkify and translate.
39467                                 switch (whichType) {
39468                                     case '170':
39469                                         props.description = 'This feature has a FIXME tag: ' + props.description;
39470                                         break;
39471                                     case '292':
39472                                     case '293':
39473                                         props.description = props.description.replace('A turn-', 'This turn-');
39474                                         break;
39475                                     case '294':
39476                                     case '295':
39477                                     case '296':
39478                                     case '297':
39479                                     case '298':
39480                                         props.description = 'This turn-restriction~' + props.description;
39481                                         break;
39482                                     case '300':
39483                                         props.description = 'This highway is missing a maxspeed tag';
39484                                         break;
39485                                     case '411':
39486                                     case '412':
39487                                     case '413':
39488                                         props.description = 'This feature~' + props.description;
39489                                         break;
39490                                 }
39491
39492                                 // - move markers slightly so it doesn't obscure the geometry,
39493                                 // - then move markers away from other coincident markers
39494                                 var coincident = false;
39495                                 do {
39496                                     // first time, move marker up. after that, move marker right.
39497                                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
39498                                     loc = geoVecAdd(loc, delta);
39499                                     var bbox = geoExtent(loc).bbox();
39500                                     coincident = _krCache.rtree.search(bbox).length;
39501                                 } while (coincident);
39502
39503                                 var d = new qaError({
39504                                     // Required values
39505                                     loc: loc,
39506                                     service: 'keepRight',
39507                                     error_type: errorType,
39508                                     // Extra values for this service
39509                                     id: props.error_id,
39510                                     comment: props.comment || null,
39511                                     description: props.description || '',
39512                                     error_id: props.error_id,
39513                                     which_type: whichType,
39514                                     parent_error_type: parentErrorType,
39515                                     severity: whichTemplate.severity || 'error',
39516                                     object_id: props.object_id,
39517                                     object_type: props.object_type,
39518                                     schema: props.schema,
39519                                     title: props.title
39520                                 });
39521
39522                                 d.replacements = tokenReplacements(d);
39523
39524                                 _krCache.data[d.id] = d;
39525                                 _krCache.rtree.insert(encodeErrorRtree(d));
39526                             });
39527
39528                             dispatch$1.call('loaded');
39529                         })
39530                         .catch(function() {
39531                             delete _krCache.inflightTile[tile.id];
39532                             _krCache.loadedTile[tile.id] = true;
39533                         });
39534
39535                 });
39536             },
39537
39538
39539             postKeepRightUpdate: function(d, callback) {
39540                 if (_krCache.inflightPost[d.id]) {
39541                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39542                 }
39543
39544                 var that = this;
39545                 var params = { schema: d.schema, id: d.error_id };
39546
39547                 if (d.state) {
39548                     params.st = d.state;
39549                 }
39550                 if (d.newComment !== undefined) {
39551                     params.co = d.newComment;
39552                 }
39553
39554                 // NOTE: This throws a CORS err, but it seems successful.
39555                 // We don't care too much about the response, so this is fine.
39556                 var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
39557
39558                 var controller = new AbortController();
39559                 _krCache.inflightPost[d.id] = controller;
39560
39561                 fetch(url, { method: 'POST', signal: controller.signal })
39562                     .then(function(response) {
39563                         delete _krCache.inflightPost[d.id];
39564                         if (!response.ok) {
39565                             throw new Error(response.status + ' ' + response.statusText);
39566                         }
39567
39568                         if (d.state === 'ignore') {   // ignore permanently (false positive)
39569                             that.removeError(d);
39570
39571                         } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
39572                             that.removeError(d);
39573                             _krCache.closed[d.schema + ':' + d.error_id] = true;
39574
39575                         } else {
39576                             d = that.replaceError(d.update({
39577                                 comment: d.newComment,
39578                                 newComment: undefined,
39579                                 state: undefined
39580                             }));
39581                         }
39582
39583                         if (callback) callback(null, d);
39584                     })
39585                     .catch(function(err) {
39586                         delete _krCache.inflightPost[d.id];
39587                         if (callback) callback(err.message);
39588                     });
39589             },
39590
39591
39592             // get all cached errors covering the viewport
39593             getErrors: function(projection) {
39594                 var viewport = projection.clipExtent();
39595                 var min = [viewport[0][0], viewport[1][1]];
39596                 var max = [viewport[1][0], viewport[0][1]];
39597                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
39598
39599                 return _krCache.rtree.search(bbox).map(function(d) {
39600                     return d.data;
39601                 });
39602             },
39603
39604
39605             // get a single error from the cache
39606             getError: function(id) {
39607                 return _krCache.data[id];
39608             },
39609
39610
39611             // replace a single error in the cache
39612             replaceError: function(error) {
39613                 if (!(error instanceof qaError) || !error.id) return;
39614
39615                 _krCache.data[error.id] = error;
39616                 updateRtree(encodeErrorRtree(error), true); // true = replace
39617                 return error;
39618             },
39619
39620
39621             // remove a single error from the cache
39622             removeError: function(error) {
39623                 if (!(error instanceof qaError) || !error.id) return;
39624
39625                 delete _krCache.data[error.id];
39626                 updateRtree(encodeErrorRtree(error), false); // false = remove
39627             },
39628
39629
39630             errorURL: function(error) {
39631                 return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
39632             },
39633
39634
39635             // Get an array of errors closed during this session.
39636             // Used to populate `closed:keepright` changeset tag
39637             getClosedIDs: function() {
39638                 return Object.keys(_krCache.closed).sort();
39639             }
39640
39641         };
39642
39643         var tiler$1 = utilTiler();
39644         var dispatch$2 = dispatch('loaded');
39645
39646         var _erCache;
39647         var _erZoom = 14;
39648
39649         var _impOsmUrls = {
39650             ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
39651             mr: 'https://missingroads.skobbler.net/missingGeoService',
39652             tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
39653         };
39654
39655         function abortRequest$1(i) {
39656             Object.values(i).forEach(function(controller) {
39657                 if (controller) {
39658                     controller.abort();
39659                 }
39660             });
39661         }
39662
39663         function abortUnwantedRequests$1(cache, tiles) {
39664             Object.keys(cache.inflightTile).forEach(function(k) {
39665                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39666                 if (!wanted) {
39667                     abortRequest$1(cache.inflightTile[k]);
39668                     delete cache.inflightTile[k];
39669                 }
39670             });
39671         }
39672
39673
39674         function encodeErrorRtree$1(d) {
39675             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39676         }
39677
39678
39679         // replace or remove error from rtree
39680         function updateRtree$1(item, replace) {
39681             _erCache.rtree.remove(item, function isEql(a, b) {
39682                 return a.data.id === b.data.id;
39683             });
39684
39685             if (replace) {
39686                 _erCache.rtree.insert(item);
39687             }
39688         }
39689
39690         function linkErrorObject(d) {
39691             return '<a class="error_object_link">' + d + '</a>';
39692         }
39693
39694         function linkEntity(d) {
39695             return '<a class="error_entity_link">' + d + '</a>';
39696         }
39697
39698         function pointAverage(points) {
39699             if (points.length) {
39700                 var sum = points.reduce(function(acc, point) {
39701                     return geoVecAdd(acc, [point.lon, point.lat]);
39702                 }, [0,0]);
39703                 return geoVecScale(sum, 1 / points.length);
39704             } else {
39705                 return [0,0];
39706             }
39707         }
39708
39709         function relativeBearing(p1, p2) {
39710             var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
39711             if (angle < 0) {
39712                 angle += 2 * Math.PI;
39713             }
39714
39715             // Return degrees
39716             return angle * 180 / Math.PI;
39717         }
39718
39719         // Assuming range [0,360)
39720         function cardinalDirection(bearing) {
39721             var dir = 45 * Math.round(bearing / 45);
39722             var compass = {
39723                 0: 'north',
39724                 45: 'northeast',
39725                 90: 'east',
39726                 135: 'southeast',
39727                 180: 'south',
39728                 225: 'southwest',
39729                 270: 'west',
39730                 315: 'northwest',
39731                 360: 'north'
39732             };
39733
39734             return t('QA.improveOSM.directions.' + compass[dir]);
39735         }
39736
39737         // Errors shouldn't obscure eachother
39738         function preventCoincident(loc, bumpUp) {
39739             var coincident = false;
39740             do {
39741                 // first time, move marker up. after that, move marker right.
39742                 var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
39743                 loc = geoVecAdd(loc, delta);
39744                 var bbox = geoExtent(loc).bbox();
39745                 coincident = _erCache.rtree.search(bbox).length;
39746             } while (coincident);
39747
39748             return loc;
39749         }
39750
39751         var serviceImproveOSM = {
39752             init: function() {
39753                 if (!_erCache) {
39754                     this.reset();
39755                 }
39756
39757                 this.event = utilRebind(this, dispatch$2, 'on');
39758             },
39759
39760             reset: function() {
39761                 if (_erCache) {
39762                     Object.values(_erCache.inflightTile).forEach(abortRequest$1);
39763                 }
39764                 _erCache = {
39765                     data: {},
39766                     loadedTile: {},
39767                     inflightTile: {},
39768                     inflightPost: {},
39769                     closed: {},
39770                     rtree: rbush_1()
39771                 };
39772             },
39773
39774             loadErrors: function(projection) {
39775                 var options = {
39776                     client: 'iD',
39777                     status: 'OPEN',
39778                     zoom: '19' // Use a high zoom so that clusters aren't returned
39779                 };
39780
39781                 // determine the needed tiles to cover the view
39782                 var tiles = tiler$1
39783                     .zoomExtent([_erZoom, _erZoom])
39784                     .getTiles(projection);
39785
39786                 // abort inflight requests that are no longer needed
39787                 abortUnwantedRequests$1(_erCache, tiles);
39788
39789                 // issue new requests..
39790                 tiles.forEach(function(tile) {
39791                     if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
39792
39793                     var rect = tile.extent.rectangle();
39794                     var params = Object.assign({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
39795
39796                     // 3 separate requests to store for each tile
39797                     var requests = {};
39798
39799                     Object.keys(_impOsmUrls).forEach(function(k) {
39800                         var v = _impOsmUrls[k];
39801                         // We exclude WATER from missing geometry as it doesn't seem useful
39802                         // We use most confident one-way and turn restrictions only, still have false positives
39803                         var kParams = Object.assign({},
39804                             params,
39805                             (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
39806                         );
39807                         var url = v + '/search?' + utilQsString(kParams);
39808
39809                         var controller = new AbortController();
39810                         requests[k] = controller;
39811
39812                         d3_json(url, { signal: controller.signal })
39813                             .then(function(data) {
39814                                 delete _erCache.inflightTile[tile.id][k];
39815                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39816                                     delete _erCache.inflightTile[tile.id];
39817                                     _erCache.loadedTile[tile.id] = true;
39818                                 }
39819
39820                                 // Road segments at high zoom == oneways
39821                                 if (data.roadSegments) {
39822                                     data.roadSegments.forEach(function(feature) {
39823                                         // Position error at the approximate middle of the segment
39824                                         var points = feature.points;
39825                                         var mid = points.length / 2;
39826                                         var loc;
39827
39828                                         // Even number of points, find midpoint of the middle two
39829                                         // Odd number of points, use position of very middle point
39830                                         if (mid % 1 === 0) {
39831                                             loc = pointAverage([points[mid - 1], points[mid]]);
39832                                         } else {
39833                                             mid = points[Math.floor(mid)];
39834                                             loc = [mid.lon, mid.lat];
39835                                         }
39836
39837                                         // One-ways can land on same segment in opposite direction
39838                                         loc = preventCoincident(loc, false);
39839
39840                                         var d = new qaError({
39841                                             // Info required for every error
39842                                             loc: loc,
39843                                             service: 'improveOSM',
39844                                             error_type: k,
39845                                             // Extra details needed for this service
39846                                             error_key: k,
39847                                             identifier: { // this is used to post changes to the error
39848                                                 wayId: feature.wayId,
39849                                                 fromNodeId: feature.fromNodeId,
39850                                                 toNodeId: feature.toNodeId
39851                                             },
39852                                             object_id: feature.wayId,
39853                                             object_type: 'way',
39854                                             status: feature.status
39855                                         });
39856
39857                                         // Variables used in the description
39858                                         d.replacements = {
39859                                             percentage: feature.percentOfTrips,
39860                                             num_trips: feature.numberOfTrips,
39861                                             highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
39862                                             from_node: linkEntity('n' + feature.fromNodeId),
39863                                             to_node: linkEntity('n' + feature.toNodeId)
39864                                         };
39865
39866                                         _erCache.data[d.id] = d;
39867                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39868                                     });
39869                                 }
39870
39871                                 // Tiles at high zoom == missing roads
39872                                 if (data.tiles) {
39873                                     data.tiles.forEach(function(feature) {
39874                                         var geoType = feature.type.toLowerCase();
39875
39876                                         // Average of recorded points should land on the missing geometry
39877                                         // Missing geometry could happen to land on another error
39878                                         var loc = pointAverage(feature.points);
39879                                         loc = preventCoincident(loc, false);
39880
39881                                         var d = new qaError({
39882                                             // Info required for every error
39883                                             loc: loc,
39884                                             service: 'improveOSM',
39885                                             error_type: k + '-' + geoType,
39886                                             // Extra details needed for this service
39887                                             error_key: k,
39888                                             identifier: { x: feature.x, y: feature.y },
39889                                             status: feature.status
39890                                         });
39891
39892                                         d.replacements = {
39893                                             num_trips: feature.numberOfTrips,
39894                                             geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
39895                                         };
39896
39897                                         // -1 trips indicates data came from a 3rd party
39898                                         if (feature.numberOfTrips === -1) {
39899                                             d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
39900                                         }
39901
39902                                         _erCache.data[d.id] = d;
39903                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39904                                     });
39905                                 }
39906
39907                                 // Entities at high zoom == turn restrictions
39908                                 if (data.entities) {
39909                                     data.entities.forEach(function(feature) {
39910                                         // Turn restrictions could be missing at same junction
39911                                         // We also want to bump the error up so node is accessible
39912                                         var loc = feature.point;
39913                                         loc = preventCoincident([loc.lon, loc.lat], true);
39914
39915                                         // Elements are presented in a strange way
39916                                         var ids = feature.id.split(',');
39917                                         var from_way = ids[0];
39918                                         var via_node = ids[3];
39919                                         var to_way = ids[2].split(':')[1];
39920
39921                                         var d = new qaError({
39922                                             // Info required for every error
39923                                             loc: loc,
39924                                             service: 'improveOSM',
39925                                             error_type: k,
39926                                             // Extra details needed for this service
39927                                             error_key: k,
39928                                             identifier: feature.id,
39929                                             object_id: via_node,
39930                                             object_type: 'node',
39931                                             status: feature.status
39932                                         });
39933
39934                                         // Travel direction along from_way clarifies the turn restriction
39935                                         var p1 = feature.segments[0].points[0];
39936                                         var p2 = feature.segments[0].points[1];
39937
39938                                         var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
39939
39940                                         // Variables used in the description
39941                                         d.replacements = {
39942                                             num_passed: feature.numberOfPasses,
39943                                             num_trips: feature.segments[0].numberOfTrips,
39944                                             turn_restriction: feature.turnType.toLowerCase(),
39945                                             from_way: linkEntity('w' + from_way),
39946                                             to_way: linkEntity('w' + to_way),
39947                                             travel_direction: dir_of_travel,
39948                                             junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
39949                                         };
39950
39951                                         _erCache.data[d.id] = d;
39952                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39953                                         dispatch$2.call('loaded');
39954                                     });
39955                                 }
39956                             })
39957                             .catch(function() {
39958                                 delete _erCache.inflightTile[tile.id][k];
39959                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39960                                     delete _erCache.inflightTile[tile.id];
39961                                     _erCache.loadedTile[tile.id] = true;
39962                                 }
39963                             });
39964                     });
39965
39966                     _erCache.inflightTile[tile.id] = requests;
39967                 });
39968             },
39969
39970             getComments: function(d, callback) {
39971                 // If comments already retrieved no need to do so again
39972                 if (d.comments !== undefined) {
39973                     if (callback) callback({}, d);
39974                     return;
39975                 }
39976
39977                 var key = d.error_key;
39978                 var qParams = {};
39979
39980                 if (key === 'ow') {
39981                     qParams = d.identifier;
39982                 } else if (key === 'mr') {
39983                     qParams.tileX = d.identifier.x;
39984                     qParams.tileY = d.identifier.y;
39985                 } else if (key === 'tr') {
39986                     qParams.targetId = d.identifier;
39987                 }
39988
39989                 var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
39990
39991                 var that = this;
39992                 d3_json(url)
39993                     .then(function(data) {
39994                         // comments are served newest to oldest
39995                         var comments = data.comments ? data.comments.reverse() : [];
39996                         that.replaceError(d.update({ comments: comments }));
39997                         if (callback) callback(null, d);
39998                     })
39999                     .catch(function(err) {
40000                         if (callback) callback(err.message);
40001                     });
40002             },
40003
40004             postUpdate: function(d, callback) {
40005                 if (!serviceOsm.authenticated()) { // Username required in payload
40006                     return callback({ message: 'Not Authenticated', status: -3}, d);
40007                 }
40008                 if (_erCache.inflightPost[d.id]) {
40009                     return callback({ message: 'Error update already inflight', status: -2 }, d);
40010                 }
40011
40012                 var that = this;
40013
40014                 // Payload can only be sent once username is established
40015                 serviceOsm.userDetails(sendPayload);
40016
40017                 function sendPayload(err, user) {
40018                     if (err) { return callback(err, d); }
40019
40020                     var key = d.error_key;
40021                     var url = _impOsmUrls[key] + '/comment';
40022                     var payload = {
40023                         username: user.display_name
40024                     };
40025
40026                     // Each error type has different data for identification
40027                     if (key === 'ow') {
40028                         payload.roadSegments = [ d.identifier ];
40029                     } else if (key === 'mr') {
40030                         payload.tiles = [ d.identifier ];
40031                     } else if (key === 'tr') {
40032                         payload.targetIds = [ d.identifier ];
40033                     }
40034
40035                     if (d.newStatus !== undefined) {
40036                         payload.status = d.newStatus;
40037                         payload.text = 'status changed';
40038                     }
40039
40040                     // Comment take place of default text
40041                     if (d.newComment !== undefined) {
40042                         payload.text = d.newComment;
40043                     }
40044
40045                     var controller = new AbortController();
40046                     _erCache.inflightPost[d.id] = controller;
40047
40048                     var options = {
40049                         method: 'POST',
40050                         signal: controller.signal,
40051                         body: JSON.stringify(payload)
40052                     };
40053
40054                      d3_json(url, options)
40055                         .then(function() {
40056                             delete _erCache.inflightPost[d.id];
40057
40058                             // Just a comment, update error in cache
40059                             if (d.newStatus === undefined) {
40060                                 var now = new Date();
40061                                 var comments = d.comments ? d.comments : [];
40062
40063                                 comments.push({
40064                                     username: payload.username,
40065                                     text: payload.text,
40066                                     timestamp: now.getTime() / 1000
40067                                 });
40068
40069                                 that.replaceError(d.update({
40070                                     comments: comments,
40071                                     newComment: undefined
40072                                 }));
40073                             } else {
40074                                 that.removeError(d);
40075                                 if (d.newStatus === 'SOLVED') {
40076                                     // No pretty identifier, so we just use coordinates
40077                                     var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
40078                                     _erCache.closed[key + ':' + closedID] = true;
40079                                 }
40080                             }
40081                             if (callback) callback(null, d);
40082                         })
40083                         .catch(function(err) {
40084                             delete _erCache.inflightPost[d.id];
40085                             if (callback) callback(err.message);
40086                         });
40087                 }
40088             },
40089
40090
40091             // get all cached errors covering the viewport
40092             getErrors: function(projection) {
40093                 var viewport = projection.clipExtent();
40094                 var min = [viewport[0][0], viewport[1][1]];
40095                 var max = [viewport[1][0], viewport[0][1]];
40096                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40097
40098                 return _erCache.rtree.search(bbox).map(function(d) {
40099                     return d.data;
40100                 });
40101             },
40102
40103             // get a single error from the cache
40104             getError: function(id) {
40105                 return _erCache.data[id];
40106             },
40107
40108             // replace a single error in the cache
40109             replaceError: function(error) {
40110                 if (!(error instanceof qaError) || !error.id) return;
40111
40112                 _erCache.data[error.id] = error;
40113                 updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
40114                 return error;
40115             },
40116
40117             // remove a single error from the cache
40118             removeError: function(error) {
40119                 if (!(error instanceof qaError) || !error.id) return;
40120
40121                 delete _erCache.data[error.id];
40122                 updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
40123             },
40124
40125             // Used to populate `closed:improveosm` changeset tag
40126             getClosedIDs: function() {
40127                 return Object.keys(_erCache.closed).sort();
40128             }
40129         };
40130
40131         /*
40132             A standalone SVG element that contains only a `defs` sub-element. To be
40133             used once globally, since defs IDs must be unique within a document.
40134         */
40135         function svgDefs(context) {
40136
40137             function drawDefs(selection) {
40138                 var defs = selection.append('defs');
40139
40140                 // add markers
40141                 defs
40142                     .append('marker')
40143                     .attr('id', 'oneway-marker')
40144                     .attr('viewBox', '0 0 10 5')
40145                     .attr('refX', 2.5)
40146                     .attr('refY', 2.5)
40147                     .attr('markerWidth', 2)
40148                     .attr('markerHeight', 2)
40149                     .attr('markerUnits', 'strokeWidth')
40150                     .attr('orient', 'auto')
40151                     .append('path')
40152                     .attr('class', 'oneway-marker-path')
40153                     .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')
40154                     .attr('stroke', 'none')
40155                     .attr('fill', '#000')
40156                     .attr('opacity', '0.75');
40157
40158                 // SVG markers have to be given a colour where they're defined
40159                 // (they can't inherit it from the line they're attached to),
40160                 // so we need to manually define markers for each color of tag
40161                 // (also, it's slightly nicer if we can control the
40162                 // positioning for different tags)
40163                 function addSidedMarker(name, color, offset) {
40164                     defs
40165                         .append('marker')
40166                         .attr('id', 'sided-marker-' + name)
40167                         .attr('viewBox', '0 0 2 2')
40168                         .attr('refX', 1)
40169                         .attr('refY', -offset)
40170                         .attr('markerWidth', 1.5)
40171                         .attr('markerHeight', 1.5)
40172                         .attr('markerUnits', 'strokeWidth')
40173                         .attr('orient', 'auto')
40174                         .append('path')
40175                         .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
40176                         .attr('d', 'M 0,0 L 1,1 L 2,0 z')
40177                         .attr('stroke', 'none')
40178                         .attr('fill', color);
40179                 }
40180                 addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
40181                 // for a coastline, the arrows are (somewhat unintuitively) on
40182                 // the water side, so let's color them blue (with a gap) to
40183                 // give a stronger indication
40184                 addSidedMarker('coastline', '#77dede', 1);
40185                 // barriers have a dashed line, and separating the triangle
40186                 // from the line visually suits that
40187                 addSidedMarker('barrier', '#ddd', 1);
40188                 addSidedMarker('man_made', '#fff', 0);
40189
40190                 defs
40191                     .append('marker')
40192                     .attr('id', 'viewfield-marker')
40193                     .attr('viewBox', '0 0 16 16')
40194                     .attr('refX', 8)
40195                     .attr('refY', 16)
40196                     .attr('markerWidth', 4)
40197                     .attr('markerHeight', 4)
40198                     .attr('markerUnits', 'strokeWidth')
40199                     .attr('orient', 'auto')
40200                     .append('path')
40201                     .attr('class', 'viewfield-marker-path')
40202                     .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')
40203                     .attr('fill', '#333')
40204                     .attr('fill-opacity', '0.75')
40205                     .attr('stroke', '#fff')
40206                     .attr('stroke-width', '0.5px')
40207                     .attr('stroke-opacity', '0.75');
40208
40209                 defs
40210                     .append('marker')
40211                     .attr('id', 'viewfield-marker-wireframe')
40212                     .attr('viewBox', '0 0 16 16')
40213                     .attr('refX', 8)
40214                     .attr('refY', 16)
40215                     .attr('markerWidth', 4)
40216                     .attr('markerHeight', 4)
40217                     .attr('markerUnits', 'strokeWidth')
40218                     .attr('orient', 'auto')
40219                     .append('path')
40220                     .attr('class', 'viewfield-marker-path')
40221                     .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')
40222                     .attr('fill', 'none')
40223                     .attr('stroke', '#fff')
40224                     .attr('stroke-width', '0.5px')
40225                     .attr('stroke-opacity', '0.75');
40226
40227                 // add patterns
40228                 var patterns = defs.selectAll('pattern')
40229                     .data([
40230                         // pattern name, pattern image name
40231                         ['beach', 'dots'],
40232                         ['construction', 'construction'],
40233                         ['cemetery', 'cemetery'],
40234                         ['cemetery_christian', 'cemetery_christian'],
40235                         ['cemetery_buddhist', 'cemetery_buddhist'],
40236                         ['cemetery_muslim', 'cemetery_muslim'],
40237                         ['cemetery_jewish', 'cemetery_jewish'],
40238                         ['farmland', 'farmland'],
40239                         ['farmyard', 'farmyard'],
40240                         ['forest', 'forest'],
40241                         ['forest_broadleaved', 'forest_broadleaved'],
40242                         ['forest_needleleaved', 'forest_needleleaved'],
40243                         ['forest_leafless', 'forest_leafless'],
40244                         ['grass', 'grass'],
40245                         ['landfill', 'landfill'],
40246                         ['meadow', 'grass'],
40247                         ['orchard', 'orchard'],
40248                         ['pond', 'pond'],
40249                         ['quarry', 'quarry'],
40250                         ['scrub', 'bushes'],
40251                         ['vineyard', 'vineyard'],
40252                         ['water_standing', 'lines'],
40253                         ['waves', 'waves'],
40254                         ['wetland', 'wetland'],
40255                         ['wetland_marsh', 'wetland_marsh'],
40256                         ['wetland_swamp', 'wetland_swamp'],
40257                         ['wetland_bog', 'wetland_bog'],
40258                         ['wetland_reedbed', 'wetland_reedbed']
40259                     ])
40260                     .enter()
40261                     .append('pattern')
40262                     .attr('id', function (d) { return 'pattern-' + d[0]; })
40263                     .attr('width', 32)
40264                     .attr('height', 32)
40265                     .attr('patternUnits', 'userSpaceOnUse');
40266
40267                 patterns
40268                     .append('rect')
40269                     .attr('x', 0)
40270                     .attr('y', 0)
40271                     .attr('width', 32)
40272                     .attr('height', 32)
40273                     .attr('class', function (d) { return 'pattern-color-' + d[0]; });
40274
40275                 patterns
40276                     .append('image')
40277                     .attr('x', 0)
40278                     .attr('y', 0)
40279                     .attr('width', 32)
40280                     .attr('height', 32)
40281                     .attr('xlink:href', function (d) {
40282                         return context.imagePath('pattern/' + d[1] + '.png');
40283                     });
40284
40285                 // add clip paths
40286                 defs.selectAll('clipPath')
40287                     .data([12, 18, 20, 32, 45])
40288                     .enter()
40289                     .append('clipPath')
40290                     .attr('id', function (d) { return 'clip-square-' + d; })
40291                     .append('rect')
40292                     .attr('x', 0)
40293                     .attr('y', 0)
40294                     .attr('width', function (d) { return d; })
40295                     .attr('height', function (d) { return d; });
40296
40297                 // add symbol spritesheets
40298                 defs
40299                     .call(drawDefs.addSprites, [
40300                         'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite'
40301                     ], true);
40302             }
40303
40304
40305             drawDefs.addSprites = function(selection, ids, overrideColors) {
40306                 var spritesheets = selection.selectAll('.spritesheet');
40307                 var currData = spritesheets.data();
40308                 var data = utilArrayUniq(currData.concat(ids));
40309
40310                 spritesheets
40311                     .data(data)
40312                     .enter()
40313                     .append('g')
40314                     .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
40315                     .each(function(d) {
40316                         var url = context.imagePath(d + '.svg');
40317                         var node = d3_select(this).node();
40318
40319                         svg(url)
40320                             .then(function(svg) {
40321                                 node.appendChild(
40322                                     d3_select(svg.documentElement).attr('id', d).node()
40323                                 );
40324                                 if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
40325                                     d3_select(node).selectAll('path')
40326                                         .attr('fill', 'currentColor');
40327                                 }
40328                             })
40329                             .catch(function() {
40330                                 /* ignore */
40331                             });
40332                     });
40333             };
40334
40335
40336             return drawDefs;
40337         }
40338
40339         /* global Mapillary:false */
40340
40341
40342         var apibase = 'https://a.mapillary.com/v3/';
40343         var viewercss = 'mapillary-js/mapillary.min.css';
40344         var viewerjs = 'mapillary-js/mapillary.min.js';
40345         var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
40346         var maxResults = 1000;
40347         var tileZoom = 14;
40348         var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
40349         var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
40350         var _mlyFallback = false;
40351         var _mlyCache;
40352         var _mlyClicks;
40353         var _mlySelectedImage;
40354         var _mlyViewer;
40355
40356
40357         function abortRequest$2(controller) {
40358             controller.abort();
40359         }
40360
40361
40362         function maxPageAtZoom(z) {
40363             if (z < 15)   return 2;
40364             if (z === 15) return 5;
40365             if (z === 16) return 10;
40366             if (z === 17) return 20;
40367             if (z === 18) return 40;
40368             if (z > 18)   return 80;
40369         }
40370
40371
40372         function loadTiles(which, url, projection) {
40373             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
40374             var tiles = tiler$2.getTiles(projection);
40375
40376             // abort inflight requests that are no longer needed
40377             var cache = _mlyCache[which];
40378             Object.keys(cache.inflight).forEach(function(k) {
40379                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
40380                 if (!wanted) {
40381                     abortRequest$2(cache.inflight[k]);
40382                     delete cache.inflight[k];
40383                 }
40384             });
40385
40386             tiles.forEach(function(tile) {
40387                 loadNextTilePage(which, currZoom, url, tile);
40388             });
40389         }
40390
40391
40392         function loadNextTilePage(which, currZoom, url, tile) {
40393             var cache = _mlyCache[which];
40394             var rect = tile.extent.rectangle();
40395             var maxPages = maxPageAtZoom(currZoom);
40396             var nextPage = cache.nextPage[tile.id] || 0;
40397             var nextURL = cache.nextURL[tile.id] || url +
40398                 utilQsString({
40399                     per_page: maxResults,
40400                     page: nextPage,
40401                     client_id: clientId,
40402                     bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
40403                 });
40404
40405             if (nextPage > maxPages) return;
40406
40407             var id = tile.id + ',' + String(nextPage);
40408             if (cache.loaded[id] || cache.inflight[id]) return;
40409
40410             var controller = new AbortController();
40411             cache.inflight[id] = controller;
40412
40413             var options = {
40414                 method: 'GET',
40415                 signal: controller.signal,
40416                 headers: { 'Content-Type': 'application/json' }
40417             };
40418
40419             fetch(nextURL, options)
40420                 .then(function(response) {
40421                     if (!response.ok) {
40422                         throw new Error(response.status + ' ' + response.statusText);
40423                     }
40424                     var linkHeader = response.headers.get('Link');
40425                     if (linkHeader) {
40426                         var pagination = parsePagination(linkHeader);
40427                         if (pagination.next) {
40428                             cache.nextURL[tile.id] = pagination.next;
40429                         }
40430                     }
40431                     return response.json();
40432                 })
40433                 .then(function(data) {
40434                     cache.loaded[id] = true;
40435                     delete cache.inflight[id];
40436                     if (!data || !data.features || !data.features.length) {
40437                         throw new Error('No Data');
40438                     }
40439
40440                     var features = data.features.map(function(feature) {
40441                         var loc = feature.geometry.coordinates;
40442                         var d;
40443
40444                         // An image (shown as a green dot on the map) is a single street photo with extra
40445                         // information such as location, camera angle (CA), camera model, and so on.
40446                         // Each image feature is a GeoJSON Point
40447                         if (which === 'images') {
40448                             d = {
40449                                 loc: loc,
40450                                 key: feature.properties.key,
40451                                 ca: feature.properties.ca,
40452                                 captured_at: feature.properties.captured_at,
40453                                 captured_by: feature.properties.username,
40454                                 pano: feature.properties.pano
40455                             };
40456
40457                             cache.forImageKey[d.key] = d;     // cache imageKey -> image
40458
40459                         // Mapillary organizes images as sequences. A sequence of images are continuously captured
40460                         // by a user at a give time. Sequences are shown on the map as green lines.
40461                         // Each sequence feature is a GeoJSON LineString
40462                         } else if (which === 'sequences') {
40463                             var sequenceKey = feature.properties.key;
40464                             cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
40465                             feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
40466                                 cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
40467                             });
40468                             return false;    // because no `d` data worth loading into an rbush
40469
40470                         // An image detection is a semantic pixel area on an image. The area could indicate
40471                         // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
40472                         // Each image_detection feature is a GeoJSON Point (located where the image was taken)
40473                         } else if (which === 'image_detections') {
40474                             d = {
40475                                 key: feature.properties.key,
40476                                 image_key: feature.properties.image_key,
40477                                 value: feature.properties.value,
40478                                 package: feature.properties.package,
40479                                 shape: feature.properties.shape
40480                             };
40481
40482                             // cache imageKey -> image_detections
40483                             if (!cache.forImageKey[d.image_key]) {
40484                                 cache.forImageKey[d.image_key] = [];
40485                             }
40486                             cache.forImageKey[d.image_key].push(d);
40487                             return false;    // because no `d` data worth loading into an rbush
40488
40489
40490                         // A map feature is a real world object that can be shown on a map. It could be any object
40491                         // recognized from images, manually added in images, or added on the map.
40492                         // Each map feature is a GeoJSON Point (located where the feature is)
40493                         } else if (which === 'map_features') {
40494                             d = {
40495                                 loc: loc,
40496                                 key: feature.properties.key,
40497                                 value: feature.properties.value,
40498                                 package: feature.properties.package,
40499                                 detections: feature.properties.detections
40500                             };
40501                         }
40502
40503                         return {
40504                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40505                         };
40506
40507                     }).filter(Boolean);
40508
40509                     if (cache.rtree && features) {
40510                         cache.rtree.load(features);
40511                     }
40512
40513                     if (data.features.length === maxResults) {  // more pages to load
40514                         cache.nextPage[tile.id] = nextPage + 1;
40515                         loadNextTilePage(which, currZoom, url, tile);
40516                     } else {
40517                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
40518                     }
40519
40520                     if (which === 'images' || which === 'sequences') {
40521                         dispatch$3.call('loadedImages');
40522                     } else if (which === 'map_features') {
40523                         dispatch$3.call('loadedSigns');
40524                     }
40525                 })
40526                 .catch(function() {
40527                     cache.loaded[id] = true;
40528                     delete cache.inflight[id];
40529                 });
40530         }
40531
40532         // extract links to pages of API results
40533         function parsePagination(links) {
40534             return links.split(',').map(function(rel) {
40535                 var elements = rel.split(';');
40536                 if (elements.length === 2) {
40537                     return [
40538                         /<(.+)>/.exec(elements[0])[1],
40539                         /rel="(.+)"/.exec(elements[1])[1]
40540                     ];
40541                 } else {
40542                     return ['',''];
40543                 }
40544             }).reduce(function(pagination, val) {
40545                 pagination[val[1]] = val[0];
40546                 return pagination;
40547             }, {});
40548         }
40549
40550
40551         // partition viewport into higher zoom tiles
40552         function partitionViewport(projection) {
40553             var z = geoScaleToZoom(projection.scale());
40554             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
40555             var tiler = utilTiler().zoomExtent([z2, z2]);
40556
40557             return tiler.getTiles(projection)
40558                 .map(function(tile) { return tile.extent; });
40559         }
40560
40561
40562         // no more than `limit` results per partition.
40563         function searchLimited(limit, projection, rtree) {
40564             limit = limit || 5;
40565
40566             return partitionViewport(projection)
40567                 .reduce(function(result, extent) {
40568                     var found = rtree.search(extent.bbox())
40569                         .slice(0, limit)
40570                         .map(function(d) { return d.data; });
40571
40572                     return (found.length ? result.concat(found) : result);
40573                 }, []);
40574         }
40575
40576
40577
40578         var serviceMapillary = {
40579
40580             init: function() {
40581                 if (!_mlyCache) {
40582                     this.reset();
40583                 }
40584
40585                 this.event = utilRebind(this, dispatch$3, 'on');
40586             },
40587
40588             reset: function() {
40589                 if (_mlyCache) {
40590                     Object.values(_mlyCache.images.inflight).forEach(abortRequest$2);
40591                     Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$2);
40592                     Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$2);
40593                     Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$2);
40594                 }
40595
40596                 _mlyCache = {
40597                     images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
40598                     image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
40599                     map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
40600                     sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
40601                 };
40602
40603                 _mlySelectedImage = null;
40604                 _mlyClicks = [];
40605             },
40606
40607
40608             images: function(projection) {
40609                 var limit = 5;
40610                 return searchLimited(limit, projection, _mlyCache.images.rtree);
40611             },
40612
40613
40614             signs: function(projection) {
40615                 var limit = 5;
40616                 return searchLimited(limit, projection, _mlyCache.map_features.rtree);
40617             },
40618
40619
40620             cachedImage: function(imageKey) {
40621                 return _mlyCache.images.forImageKey[imageKey];
40622             },
40623
40624
40625             sequences: function(projection) {
40626                 var viewport = projection.clipExtent();
40627                 var min = [viewport[0][0], viewport[1][1]];
40628                 var max = [viewport[1][0], viewport[0][1]];
40629                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40630                 var sequenceKeys = {};
40631
40632                 // all sequences for images in viewport
40633                 _mlyCache.images.rtree.search(bbox)
40634                     .forEach(function(d) {
40635                         var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
40636                         if (sequenceKey) {
40637                             sequenceKeys[sequenceKey] = true;
40638                         }
40639                     });
40640
40641                 // Return lineStrings for the sequences
40642                 return Object.keys(sequenceKeys).map(function(sequenceKey) {
40643                     return _mlyCache.sequences.lineString[sequenceKey];
40644                 });
40645             },
40646
40647
40648             signsSupported: function() {
40649                 return true;
40650             },
40651
40652
40653             loadImages: function(projection) {
40654                 loadTiles('images', apibase + 'images?', projection);
40655                 loadTiles('sequences', apibase + 'sequences?', projection);
40656             },
40657
40658
40659             loadSigns: function(projection) {
40660                 // if we are looking at signs, we'll actually need to fetch images too
40661                 loadTiles('images', apibase + 'images?', projection);
40662                 loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
40663                 loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
40664             },
40665
40666
40667             loadViewer: function(context) {
40668                 // add mly-wrapper
40669                 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
40670                     .data([0]);
40671
40672                 wrap.enter()
40673                     .append('div')
40674                     .attr('id', 'mly')
40675                     .attr('class', 'photo-wrapper mly-wrapper')
40676                     .classed('hide', true);
40677
40678                 // load mapillary-viewercss
40679                 d3_select('head').selectAll('#mapillary-viewercss')
40680                     .data([0])
40681                     .enter()
40682                     .append('link')
40683                     .attr('id', 'mapillary-viewercss')
40684                     .attr('rel', 'stylesheet')
40685                     .attr('href', context.asset(viewercss));
40686
40687                 // load mapillary-viewerjs
40688                 d3_select('head').selectAll('#mapillary-viewerjs')
40689                     .data([0])
40690                     .enter()
40691                     .append('script')
40692                     .attr('id', 'mapillary-viewerjs')
40693                     .attr('src', context.asset(viewerjs));
40694
40695                 // load mapillary signs sprite
40696                 var defs = context.container().select('defs');
40697                 defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
40698
40699                 // Register viewer resize handler
40700                 context.ui().photoviewer.on('resize', function() {
40701                     if (_mlyViewer) {
40702                         _mlyViewer.resize();
40703                     }
40704                 });
40705             },
40706
40707
40708             showViewer: function() {
40709                 var wrap = d3_select('#photoviewer')
40710                     .classed('hide', false);
40711
40712                 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
40713
40714                 if (isHidden && _mlyViewer) {
40715                     wrap
40716                         .selectAll('.photo-wrapper:not(.mly-wrapper)')
40717                         .classed('hide', true);
40718
40719                     wrap
40720                         .selectAll('.photo-wrapper.mly-wrapper')
40721                         .classed('hide', false);
40722
40723                     _mlyViewer.resize();
40724                 }
40725
40726                 return this;
40727             },
40728
40729
40730             hideViewer: function() {
40731                 _mlySelectedImage = null;
40732
40733                 if (!_mlyFallback && _mlyViewer) {
40734                     _mlyViewer.getComponent('sequence').stop();
40735                 }
40736
40737                 var viewer = d3_select('#photoviewer');
40738                 if (!viewer.empty()) viewer.datum(null);
40739
40740                 viewer
40741                     .classed('hide', true)
40742                     .selectAll('.photo-wrapper')
40743                     .classed('hide', true);
40744
40745                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40746                     .classed('currentView', false);
40747
40748                 return this.setStyles(null, true);
40749             },
40750
40751
40752             parsePagination: parsePagination,
40753
40754
40755             updateViewer: function(imageKey, context) {
40756                 if (!imageKey) return this;
40757
40758                 if (!_mlyViewer) {
40759                     this.initViewer(imageKey, context);
40760                 } else {
40761                     _mlyViewer.moveToKey(imageKey)
40762                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40763                 }
40764
40765                 return this;
40766             },
40767
40768
40769             initViewer: function(imageKey, context) {
40770                 var that = this;
40771                 if (window.Mapillary && imageKey) {
40772                     var opts = {
40773                         baseImageSize: 320,
40774                         component: {
40775                             cover: false,
40776                             keyboard: false,
40777                             tag: true
40778                         }
40779                     };
40780
40781                     // Disable components requiring WebGL support
40782                     if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
40783                         _mlyFallback = true;
40784                         opts.component = {
40785                             cover: false,
40786                             direction: false,
40787                             imagePlane: false,
40788                             keyboard: false,
40789                             mouse: false,
40790                             sequence: false,
40791                             tag: false,
40792                             image: true,        // fallback
40793                             navigation: true    // fallback
40794                         };
40795                     }
40796
40797                     _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
40798                     _mlyViewer.on('nodechanged', nodeChanged);
40799                     _mlyViewer.on('bearingchanged', bearingChanged);
40800                     _mlyViewer.moveToKey(imageKey)
40801                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40802                 }
40803
40804                 // nodeChanged: called after the viewer has changed images and is ready.
40805                 //
40806                 // There is some logic here to batch up clicks into a _mlyClicks array
40807                 // because the user might click on a lot of markers quickly and nodechanged
40808                 // may be called out of order asychronously.
40809                 //
40810                 // Clicks are added to the array in `selectedImage` and removed here.
40811                 //
40812                 function nodeChanged(node) {
40813                     if (!_mlyFallback) {
40814                         _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
40815                     }
40816
40817                     var clicks = _mlyClicks;
40818                     var index = clicks.indexOf(node.key);
40819                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
40820
40821                     if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
40822                         clicks.splice(index, 1);   // remove the click
40823                         // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
40824                         // one more time to update the detections and attribution..
40825                         if (node.key === selectedKey) {
40826                             that.selectImage(_mlySelectedImage, node.key, true);
40827                         }
40828                     } else {             // `nodechanged` initiated from the Mapillary viewer controls..
40829                         var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
40830                         context.map().centerEase(loc);
40831                         that.selectImage(undefined, node.key, true);
40832                     }
40833                 }
40834
40835                 function bearingChanged(e) {
40836                     dispatch$3.call('bearingChanged', undefined, e);
40837                 }
40838             },
40839
40840
40841             // Pass the image datum itself in `d` or the `imageKey` string.
40842             // This allows images to be selected from places that dont have access
40843             // to the full image datum (like the street signs layer or the js viewer)
40844             selectImage: function(d, imageKey, fromViewer) {
40845                 if (!d && imageKey) {
40846                     // If the user clicked on something that's not an image marker, we
40847                     // might get in here.. Cache lookup can fail, e.g. if the user
40848                     // clicked a streetsign, but images are loading slowly asynchronously.
40849                     // We'll try to carry on anyway if there is no datum.  There just
40850                     // might be a delay before user sees detections, captured_at, etc.
40851                     d = _mlyCache.images.forImageKey[imageKey];
40852                 }
40853
40854                 _mlySelectedImage = d;
40855                 var viewer = d3_select('#photoviewer');
40856                 if (!viewer.empty()) viewer.datum(d);
40857
40858                 imageKey = (d && d.key) || imageKey;
40859                 if (!fromViewer && imageKey) {
40860                     _mlyClicks.push(imageKey);
40861                 }
40862
40863                 this.setStyles(null, true);
40864
40865                 // if signs signs are shown, highlight the ones that appear in this image
40866                 d3_selectAll('.layer-mapillary-signs .icon-sign')
40867                     .classed('currentView', function(d) {
40868                         return d.detections.some(function(detection) {
40869                             return detection.image_key === imageKey;
40870                         });
40871                     });
40872
40873                 if (d) {
40874                     this.updateDetections(d);
40875                 }
40876
40877                 return this;
40878             },
40879
40880
40881             getSelectedImage: function() {
40882                 return _mlySelectedImage;
40883             },
40884
40885
40886             getSequenceKeyForImage: function(d) {
40887                 var imageKey = d && d.key;
40888                 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
40889             },
40890
40891
40892             // Updates the currently highlighted sequence and selected bubble.
40893             // Reset is only necessary when interacting with the viewport because
40894             // this implicitly changes the currently selected bubble/sequence
40895             setStyles: function(hovered, reset) {
40896                 if (reset) {  // reset all layers
40897                     d3_selectAll('.viewfield-group')
40898                         .classed('highlighted', false)
40899                         .classed('hovered', false)
40900                         .classed('currentView', false);
40901
40902                     d3_selectAll('.sequence')
40903                         .classed('highlighted', false)
40904                         .classed('currentView', false);
40905                 }
40906
40907                 var hoveredImageKey = hovered && hovered.key;
40908                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
40909                 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
40910                 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
40911
40912                 var viewer = d3_select('#photoviewer');
40913                 var selected = viewer.empty() ? undefined : viewer.datum();
40914                 var selectedImageKey = selected && selected.key;
40915                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
40916                 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
40917                 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
40918
40919                 // highlight sibling viewfields on either the selected or the hovered sequences
40920                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
40921
40922                 d3_selectAll('.layer-mapillary .viewfield-group')
40923                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
40924                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
40925                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
40926
40927                 d3_selectAll('.layer-mapillary .sequence')
40928                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
40929                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
40930
40931                 // update viewfields if needed
40932                 d3_selectAll('.viewfield-group .viewfield')
40933                     .attr('d', viewfieldPath);
40934
40935                 function viewfieldPath() {
40936                     var d = this.parentNode.__data__;
40937                     if (d.pano && d.key !== selectedImageKey) {
40938                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
40939                     } else {
40940                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
40941                     }
40942                 }
40943
40944                 return this;
40945             },
40946
40947
40948             updateDetections: function(d) {
40949                 if (!_mlyViewer || _mlyFallback) return;
40950
40951                 var imageKey = d && d.key;
40952                 if (!imageKey) return;
40953
40954                 var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
40955                 detections.forEach(function(data) {
40956                     var tag = makeTag(data);
40957                     if (tag) {
40958                         var tagComponent = _mlyViewer.getComponent('tag');
40959                         tagComponent.add([tag]);
40960                     }
40961                 });
40962
40963                 function makeTag(data) {
40964                     var valueParts = data.value.split('--');
40965                     if (valueParts.length !== 3) return;
40966
40967                     var text = valueParts[1].replace(/-/g, ' ');
40968                     var tag;
40969
40970                     // Currently only two shapes <Polygon|Point>
40971                     if (data.shape.type === 'Polygon') {
40972                         var polygonGeometry = new Mapillary
40973                             .TagComponent
40974                             .PolygonGeometry(data.shape.coordinates[0]);
40975
40976                         tag = new Mapillary.TagComponent.OutlineTag(
40977                             data.key,
40978                             polygonGeometry,
40979                             {
40980                                 text: text,
40981                                 textColor: 0xffff00,
40982                                 lineColor: 0xffff00,
40983                                 lineWidth: 2,
40984                                 fillColor: 0xffff00,
40985                                 fillOpacity: 0.3,
40986                             }
40987                         );
40988
40989                     } else if (data.shape.type === 'Point') {
40990                         var pointGeometry = new Mapillary
40991                             .TagComponent
40992                             .PointGeometry(data.shape.coordinates[0]);
40993
40994                         tag = new Mapillary.TagComponent.SpotTag(
40995                             data.key,
40996                             pointGeometry,
40997                             {
40998                                 text: text,
40999                                 color: 0xffff00,
41000                                 textColor: 0xffff00
41001                             }
41002                         );
41003                     }
41004
41005                     return tag;
41006                 }
41007             },
41008
41009
41010             cache: function() {
41011                 return _mlyCache;
41012             }
41013
41014         };
41015
41016         function validationIssue(attrs) {
41017             this.type = attrs.type;                // required - name of rule that created the issue (e.g. 'missing_tag')
41018             this.subtype = attrs.subtype;          // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
41019             this.severity = attrs.severity;        // required - 'warning' or 'error'
41020             this.message = attrs.message;          // required - function returning localized string
41021             this.reference = attrs.reference;      // optional - function(selection) to render reference information
41022             this.entityIds = attrs.entityIds;      // optional - array of IDs of entities involved in the issue
41023             this.loc = attrs.loc;                  // optional - [lon, lat] to zoom in on to see the issue
41024             this.data = attrs.data;                // optional - object containing extra data for the fixes
41025             this.fixes = attrs.fixes || [];              // optional - array of validationIssueFix objects
41026             this.hash = attrs.hash;                // optional - string to further differentiate the issue
41027
41028             this.id = generateID.apply(this);      // generated - see below
41029             this.autoFix = null;                   // generated - if autofix exists, will be set below
41030
41031             // A unique, deterministic string hash.
41032             // Issues with identical id values are considered identical.
41033             function generateID() {
41034                 var parts = [this.type];
41035
41036                 if (this.hash) {   // subclasses can pass in their own differentiator
41037                     parts.push(this.hash);
41038                 }
41039
41040                 if (this.subtype) {
41041                     parts.push(this.subtype);
41042                 }
41043
41044                 // include the entities this issue is for
41045                 // (sort them so the id is deterministic)
41046                 if (this.entityIds) {
41047                     var entityKeys = this.entityIds.slice().sort();
41048                     parts.push.apply(parts, entityKeys);
41049                 }
41050
41051                 return parts.join(':');
41052             }
41053
41054             this.extent = function(resolver) {
41055                 if (this.loc) {
41056                     return geoExtent(this.loc);
41057                 }
41058                 if (this.entityIds && this.entityIds.length) {
41059                     return this.entityIds.reduce(function(extent, entityId) {
41060                         return extent.extend(resolver.entity(entityId).extent(resolver));
41061                     }, geoExtent());
41062                 }
41063                 return null;
41064             };
41065
41066
41067             if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
41068                 for (var i = 0; i < this.fixes.length; i++) {
41069                     var fix = this.fixes[i];
41070                     fix.issue = this;
41071                     if (fix.autoArgs) {
41072                         this.autoFix = fix;
41073                     }
41074                 }
41075             }
41076         }
41077
41078
41079         function validationIssueFix(attrs) {
41080             this.title = attrs.title;                 // Required
41081             this.onClick = attrs.onClick;             // Required
41082             this.icon = attrs.icon;                   // Optional - shows 'iD-icon-wrench' if not set
41083             this.entityIds = attrs.entityIds || [];   // Optional - Used for hover-higlighting.
41084             this.autoArgs = attrs.autoArgs;           // Optional - pass [actions, annotation] arglist if this fix can automatically run
41085
41086             this.issue = null;    // Generated link - added by ValidationIssue constructor
41087         }
41088
41089         var buildRuleChecks = function() {
41090             return {
41091                 equals: function (equals) {
41092                     return function(tags) {
41093                         return Object.keys(equals).every(function(k) {
41094                             return equals[k] === tags[k];
41095                         });
41096                     };
41097                 },
41098                 notEquals: function (notEquals) {
41099                     return function(tags) {
41100                         return Object.keys(notEquals).some(function(k) {
41101                             return notEquals[k] !== tags[k];
41102                         });
41103                     };
41104                 },
41105                 absence: function(absence) {
41106                     return function(tags) {
41107                         return Object.keys(tags).indexOf(absence) === -1;
41108                     };
41109                 },
41110                 presence: function(presence) {
41111                     return function(tags) {
41112                         return Object.keys(tags).indexOf(presence) > -1;
41113                     };
41114                 },
41115                 greaterThan: function(greaterThan) {
41116                     var key = Object.keys(greaterThan)[0];
41117                     var value = greaterThan[key];
41118
41119                     return function(tags) {
41120                         return tags[key] > value;
41121                     };
41122                 },
41123                 greaterThanEqual: function(greaterThanEqual) {
41124                     var key = Object.keys(greaterThanEqual)[0];
41125                     var value = greaterThanEqual[key];
41126
41127                     return function(tags) {
41128                         return tags[key] >= value;
41129                     };
41130                 },
41131                 lessThan: function(lessThan) {
41132                     var key = Object.keys(lessThan)[0];
41133                     var value = lessThan[key];
41134
41135                     return function(tags) {
41136                         return tags[key] < value;
41137                     };
41138                 },
41139                 lessThanEqual: function(lessThanEqual) {
41140                     var key = Object.keys(lessThanEqual)[0];
41141                     var value = lessThanEqual[key];
41142
41143                     return function(tags) {
41144                         return tags[key] <= value;
41145                     };
41146                 },
41147                 positiveRegex: function(positiveRegex) {
41148                     var tagKey = Object.keys(positiveRegex)[0];
41149                     var expression = positiveRegex[tagKey].join('|');
41150                     var regex = new RegExp(expression);
41151
41152                     return function(tags) {
41153                         return regex.test(tags[tagKey]);
41154                     };
41155                 },
41156                 negativeRegex: function(negativeRegex) {
41157                     var tagKey = Object.keys(negativeRegex)[0];
41158                     var expression = negativeRegex[tagKey].join('|');
41159                     var regex = new RegExp(expression);
41160
41161                     return function(tags) {
41162                         return !regex.test(tags[tagKey]);
41163                     };
41164                 }
41165             };
41166         };
41167
41168         var buildLineKeys = function() {
41169             return {
41170                 highway: {
41171                     rest_area: true,
41172                     services: true
41173                 },
41174                 railway: {
41175                     roundhouse: true,
41176                     station: true,
41177                     traverser: true,
41178                     turntable: true,
41179                     wash: true
41180                 }
41181             };
41182         };
41183
41184         var serviceMapRules = {
41185             init: function() {
41186                 this._ruleChecks  = buildRuleChecks();
41187                 this._validationRules = [];
41188                 this._areaKeys = osmAreaKeys;
41189                 this._lineKeys = buildLineKeys();
41190             },
41191
41192             // list of rules only relevant to tag checks...
41193             filterRuleChecks: function(selector) {
41194                 var _ruleChecks = this._ruleChecks;
41195                 return Object.keys(selector).reduce(function(rules, key) {
41196                     if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
41197                         rules.push(_ruleChecks[key](selector[key]));
41198                     }
41199                     return rules;
41200                 }, []);
41201             },
41202
41203             // builds tagMap from mapcss-parse selector object...
41204             buildTagMap: function(selector) {
41205                 var getRegexValues = function(regexes) {
41206                     return regexes.map(function(regex) {
41207                         return regex.replace(/\$|\^/g, '');
41208                     });
41209                 };
41210
41211                 var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
41212                     var values;
41213                     var isRegex = /regex/gi.test(key);
41214                     var isEqual = /equals/gi.test(key);
41215
41216                     if (isRegex || isEqual) {
41217                         Object.keys(selector[key]).forEach(function(selectorKey) {
41218                             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
41219
41220                             if (expectedTags.hasOwnProperty(selectorKey)) {
41221                                 values = values.concat(expectedTags[selectorKey]);
41222                             }
41223
41224                             expectedTags[selectorKey] = values;
41225                         });
41226
41227                     } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
41228                         var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
41229
41230                         values = [selector[key][tagKey]];
41231
41232                         if (expectedTags.hasOwnProperty(tagKey)) {
41233                             values = values.concat(expectedTags[tagKey]);
41234                         }
41235
41236                         expectedTags[tagKey] = values;
41237                     }
41238
41239                     return expectedTags;
41240                 }, {});
41241
41242                 return tagMap;
41243             },
41244
41245             // inspired by osmWay#isArea()
41246             inferGeometry: function(tagMap) {
41247                 var _lineKeys = this._lineKeys;
41248                 var _areaKeys = this._areaKeys;
41249
41250                 var isAreaKeyBlackList = function(key) {
41251                     return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
41252                 };
41253                 var isLineKeysWhiteList = function(key) {
41254                     return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
41255                 };
41256
41257                 if (tagMap.hasOwnProperty('area')) {
41258                     if (tagMap.area.indexOf('yes') > -1) {
41259                         return 'area';
41260                     }
41261                     if (tagMap.area.indexOf('no') > -1) {
41262                         return 'line';
41263                     }
41264                 }
41265
41266                 for (var key in tagMap) {
41267                     if (key in _areaKeys && !isAreaKeyBlackList(key)) {
41268                         return 'area';
41269                     }
41270                     if (key in _lineKeys && isLineKeysWhiteList(key)) {
41271                         return 'area';
41272                     }
41273                 }
41274
41275                 return 'line';
41276             },
41277
41278             // adds from mapcss-parse selector check...
41279             addRule: function(selector) {
41280                 var rule = {
41281                     // checks relevant to mapcss-selector
41282                     checks: this.filterRuleChecks(selector),
41283                     // true if all conditions for a tag error are true..
41284                     matches: function(entity) {
41285                         return this.checks.every(function(check) {
41286                             return check(entity.tags);
41287                         });
41288                     },
41289                     // borrowed from Way#isArea()
41290                     inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
41291                     geometryMatches: function(entity, graph) {
41292                         if (entity.type === 'node' || entity.type === 'relation') {
41293                             return selector.geometry === entity.type;
41294                         } else if (entity.type === 'way') {
41295                             return this.inferredGeometry === entity.geometry(graph);
41296                         }
41297                     },
41298                     // when geometries match and tag matches are present, return a warning...
41299                     findIssues: function (entity, graph, issues) {
41300                         if (this.geometryMatches(entity, graph) && this.matches(entity)) {
41301                             var severity = Object.keys(selector).indexOf('error') > -1
41302                                     ? 'error'
41303                                     : 'warning';
41304                             var message = selector[severity];
41305                             issues.push(new validationIssue({
41306                                 type: 'maprules',
41307                                 severity: severity,
41308                                 message: function() {
41309                                     return message;
41310                                 },
41311                                 entityIds: [entity.id]
41312                             }));
41313                         }
41314                     }
41315                 };
41316                 this._validationRules.push(rule);
41317             },
41318
41319             clearRules: function() { this._validationRules = []; },
41320
41321             // returns validationRules...
41322             validationRules: function() { return this._validationRules; },
41323
41324             // returns ruleChecks
41325             ruleChecks: function() { return this._ruleChecks; }
41326         };
41327
41328         var apibase$1 = 'https://nominatim.openstreetmap.org/';
41329         var _inflight = {};
41330         var _nominatimCache;
41331
41332
41333         var serviceNominatim = {
41334
41335             init: function() {
41336                 _inflight = {};
41337                 _nominatimCache = rbush_1();
41338             },
41339
41340             reset: function() {
41341                 Object.values(_inflight).forEach(function(controller) { controller.abort(); });
41342                 _inflight = {};
41343                 _nominatimCache = rbush_1();
41344             },
41345
41346
41347             countryCode: function (location, callback) {
41348                 this.reverse(location, function(err, result) {
41349                     if (err) {
41350                         return callback(err);
41351                     } else if (result.address) {
41352                         return callback(null, result.address.country_code);
41353                     } else {
41354                         return callback('Unable to geocode', null);
41355                     }
41356                 });
41357             },
41358
41359
41360             reverse: function (loc, callback) {
41361                 var cached = _nominatimCache.search(
41362                     { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
41363                 );
41364
41365                 if (cached.length > 0) {
41366                     if (callback) callback(null, cached[0].data);
41367                     return;
41368                 }
41369
41370                 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
41371                 var url = apibase$1 + 'reverse?' + utilQsString(params);
41372
41373                 if (_inflight[url]) return;
41374                 var controller = new AbortController();
41375                 _inflight[url] = controller;
41376
41377                 d3_json(url, { signal: controller.signal })
41378                     .then(function(result) {
41379                         delete _inflight[url];
41380                         if (result && result.error) {
41381                             throw new Error(result.error);
41382                         }
41383                         var extent = geoExtent(loc).padByMeters(200);
41384                         _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
41385                         if (callback) callback(null, result);
41386                     })
41387                     .catch(function(err) {
41388                         delete _inflight[url];
41389                         if (err.name === 'AbortError') return;
41390                         if (callback) callback(err.message);
41391                     });
41392             },
41393
41394
41395             search: function (val, callback) {
41396                 var searchVal = encodeURIComponent(val);
41397                 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
41398
41399                 if (_inflight[url]) return;
41400                 var controller = new AbortController();
41401                 _inflight[url] = controller;
41402
41403                 d3_json(url, { signal: controller.signal })
41404                     .then(function(result) {
41405                         delete _inflight[url];
41406                         if (result && result.error) {
41407                             throw new Error(result.error);
41408                         }
41409                         if (callback) callback(null, result);
41410                     })
41411                     .catch(function(err) {
41412                         delete _inflight[url];
41413                         if (err.name === 'AbortError') return;
41414                         if (callback) callback(err.message);
41415                     });
41416             }
41417
41418         };
41419
41420         var apibase$2 = 'https://openstreetcam.org';
41421         var maxResults$1 = 1000;
41422         var tileZoom$1 = 14;
41423         var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
41424         var dispatch$4 = dispatch('loadedImages');
41425         var imgZoom = d3_zoom()
41426             .extent([[0, 0], [320, 240]])
41427             .translateExtent([[0, 0], [320, 240]])
41428             .scaleExtent([1, 15])
41429             .on('zoom', zoomPan);
41430         var _oscCache;
41431         var _oscSelectedImage;
41432
41433
41434         function abortRequest$3(controller) {
41435             controller.abort();
41436         }
41437
41438
41439         function maxPageAtZoom$1(z) {
41440             if (z < 15)   return 2;
41441             if (z === 15) return 5;
41442             if (z === 16) return 10;
41443             if (z === 17) return 20;
41444             if (z === 18) return 40;
41445             if (z > 18)   return 80;
41446         }
41447
41448
41449         function loadTiles$1(which, url, projection) {
41450             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41451             var tiles = tiler$3.getTiles(projection);
41452
41453             // abort inflight requests that are no longer needed
41454             var cache = _oscCache[which];
41455             Object.keys(cache.inflight).forEach(function(k) {
41456                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
41457                 if (!wanted) {
41458                     abortRequest$3(cache.inflight[k]);
41459                     delete cache.inflight[k];
41460                 }
41461             });
41462
41463             tiles.forEach(function(tile) {
41464                 loadNextTilePage$1(which, currZoom, url, tile);
41465             });
41466         }
41467
41468
41469         function loadNextTilePage$1(which, currZoom, url, tile) {
41470             var cache = _oscCache[which];
41471             var bbox = tile.extent.bbox();
41472             var maxPages = maxPageAtZoom$1(currZoom);
41473             var nextPage = cache.nextPage[tile.id] || 1;
41474             var params = utilQsString({
41475                 ipp: maxResults$1,
41476                 page: nextPage,
41477                 // client_id: clientId,
41478                 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
41479                 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
41480             }, true);
41481
41482             if (nextPage > maxPages) return;
41483
41484             var id = tile.id + ',' + String(nextPage);
41485             if (cache.loaded[id] || cache.inflight[id]) return;
41486
41487             var controller = new AbortController();
41488             cache.inflight[id] = controller;
41489
41490             var options = {
41491                 method: 'POST',
41492                 signal: controller.signal,
41493                 body: params,
41494                 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
41495             };
41496
41497             d3_json(url, options)
41498                 .then(function(data) {
41499                     cache.loaded[id] = true;
41500                     delete cache.inflight[id];
41501                     if (!data || !data.currentPageItems || !data.currentPageItems.length) {
41502                         throw new Error('No Data');
41503                     }
41504
41505                     var features = data.currentPageItems.map(function(item) {
41506                         var loc = [+item.lng, +item.lat];
41507                         var d;
41508
41509                         if (which === 'images') {
41510                             d = {
41511                                 loc: loc,
41512                                 key: item.id,
41513                                 ca: +item.heading,
41514                                 captured_at: (item.shot_date || item.date_added),
41515                                 captured_by: item.username,
41516                                 imagePath: item.lth_name,
41517                                 sequence_id: item.sequence_id,
41518                                 sequence_index: +item.sequence_index
41519                             };
41520
41521                             // cache sequence info
41522                             var seq = _oscCache.sequences[d.sequence_id];
41523                             if (!seq) {
41524                                 seq = { rotation: 0, images: [] };
41525                                 _oscCache.sequences[d.sequence_id] = seq;
41526                             }
41527                             seq.images[d.sequence_index] = d;
41528                         }
41529
41530                         return {
41531                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
41532                         };
41533                     });
41534
41535                     cache.rtree.load(features);
41536
41537                     if (data.currentPageItems.length === maxResults$1) {  // more pages to load
41538                         cache.nextPage[tile.id] = nextPage + 1;
41539                         loadNextTilePage$1(which, currZoom, url, tile);
41540                     } else {
41541                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
41542                     }
41543
41544                     if (which === 'images') {
41545                         dispatch$4.call('loadedImages');
41546                     }
41547                 })
41548                 .catch(function() {
41549                     cache.loaded[id] = true;
41550                     delete cache.inflight[id];
41551                 });
41552         }
41553
41554
41555         // partition viewport into higher zoom tiles
41556         function partitionViewport$1(projection) {
41557             var z = geoScaleToZoom(projection.scale());
41558             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
41559             var tiler = utilTiler().zoomExtent([z2, z2]);
41560
41561             return tiler.getTiles(projection)
41562                 .map(function(tile) { return tile.extent; });
41563         }
41564
41565
41566         // no more than `limit` results per partition.
41567         function searchLimited$1(limit, projection, rtree) {
41568             limit = limit || 5;
41569
41570             return partitionViewport$1(projection)
41571                 .reduce(function(result, extent) {
41572                     var found = rtree.search(extent.bbox())
41573                         .slice(0, limit)
41574                         .map(function(d) { return d.data; });
41575
41576                     return (found.length ? result.concat(found) : result);
41577                 }, []);
41578         }
41579
41580
41581         function zoomPan() {
41582             var t = event.transform;
41583             d3_select('#photoviewer .osc-image-wrap')
41584                 .call(utilSetTransform, t.x, t.y, t.k);
41585         }
41586
41587
41588         var serviceOpenstreetcam = {
41589
41590             init: function() {
41591                 if (!_oscCache) {
41592                     this.reset();
41593                 }
41594
41595                 this.event = utilRebind(this, dispatch$4, 'on');
41596             },
41597
41598             reset: function() {
41599                 if (_oscCache) {
41600                     Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
41601                 }
41602
41603                 _oscCache = {
41604                     images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
41605                     sequences: {}
41606                 };
41607
41608                 _oscSelectedImage = null;
41609             },
41610
41611
41612             images: function(projection) {
41613                 var limit = 5;
41614                 return searchLimited$1(limit, projection, _oscCache.images.rtree);
41615             },
41616
41617
41618             sequences: function(projection) {
41619                 var viewport = projection.clipExtent();
41620                 var min = [viewport[0][0], viewport[1][1]];
41621                 var max = [viewport[1][0], viewport[0][1]];
41622                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
41623                 var sequenceKeys = {};
41624
41625                 // all sequences for images in viewport
41626                 _oscCache.images.rtree.search(bbox)
41627                     .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
41628
41629                 // make linestrings from those sequences
41630                 var lineStrings = [];
41631                 Object.keys(sequenceKeys)
41632                     .forEach(function(sequenceKey) {
41633                         var seq = _oscCache.sequences[sequenceKey];
41634                         var images = seq && seq.images;
41635                         if (images) {
41636                             lineStrings.push({
41637                                 type: 'LineString',
41638                                 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
41639                                 properties: { key: sequenceKey }
41640                             });
41641                         }
41642                     });
41643                 return lineStrings;
41644             },
41645
41646
41647             loadImages: function(projection) {
41648                 var url = apibase$2 + '/1.0/list/nearby-photos/';
41649                 loadTiles$1('images', url, projection);
41650             },
41651
41652
41653             loadViewer: function(context) {
41654                 var that = this;
41655
41656                 // add osc-wrapper
41657                 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
41658                     .data([0]);
41659
41660                 var wrapEnter = wrap.enter()
41661                     .append('div')
41662                     .attr('class', 'photo-wrapper osc-wrapper')
41663                     .classed('hide', true)
41664                     .call(imgZoom)
41665                     .on('dblclick.zoom', null);
41666
41667                 wrapEnter
41668                     .append('div')
41669                     .attr('class', 'photo-attribution fillD');
41670
41671                 var controlsEnter = wrapEnter
41672                     .append('div')
41673                     .attr('class', 'photo-controls-wrap')
41674                     .append('div')
41675                     .attr('class', 'photo-controls');
41676
41677                 controlsEnter
41678                     .append('button')
41679                     .on('click.back', step(-1))
41680                     .text('◄');
41681
41682                 controlsEnter
41683                     .append('button')
41684                     .on('click.rotate-ccw', rotate(-90))
41685                     .text('⤿');
41686
41687                 controlsEnter
41688                     .append('button')
41689                     .on('click.rotate-cw', rotate(90))
41690                     .text('⤾');
41691
41692                 controlsEnter
41693                     .append('button')
41694                     .on('click.forward', step(1))
41695                     .text('►');
41696
41697                 wrapEnter
41698                     .append('div')
41699                     .attr('class', 'osc-image-wrap');
41700
41701
41702                 // Register viewer resize handler
41703                 context.ui().photoviewer.on('resize', function(dimensions) {
41704                     imgZoom = d3_zoom()
41705                         .extent([[0, 0], dimensions])
41706                         .translateExtent([[0, 0], dimensions])
41707                         .scaleExtent([1, 15])
41708                         .on('zoom', zoomPan);
41709                 });
41710
41711
41712                 function rotate(deg) {
41713                     return function() {
41714                         if (!_oscSelectedImage) return;
41715                         var sequenceKey = _oscSelectedImage.sequence_id;
41716                         var sequence = _oscCache.sequences[sequenceKey];
41717                         if (!sequence) return;
41718
41719                         var r = sequence.rotation || 0;
41720                         r += deg;
41721
41722                         if (r > 180) r -= 360;
41723                         if (r < -180) r += 360;
41724                         sequence.rotation = r;
41725
41726                         var wrap = d3_select('#photoviewer .osc-wrapper');
41727
41728                         wrap
41729                             .transition()
41730                             .duration(100)
41731                             .call(imgZoom.transform, identity$8);
41732
41733                         wrap.selectAll('.osc-image')
41734                             .transition()
41735                             .duration(100)
41736                             .style('transform', 'rotate(' + r + 'deg)');
41737                     };
41738                 }
41739
41740                 function step(stepBy) {
41741                     return function() {
41742                         if (!_oscSelectedImage) return;
41743                         var sequenceKey = _oscSelectedImage.sequence_id;
41744                         var sequence = _oscCache.sequences[sequenceKey];
41745                         if (!sequence) return;
41746
41747                         var nextIndex = _oscSelectedImage.sequence_index + stepBy;
41748                         var nextImage = sequence.images[nextIndex];
41749                         if (!nextImage) return;
41750
41751                         context.map().centerEase(nextImage.loc);
41752
41753                         that
41754                             .selectImage(nextImage)
41755                             .updateViewer(nextImage);
41756                     };
41757                 }
41758             },
41759
41760
41761             showViewer: function() {
41762                 var viewer = d3_select('#photoviewer')
41763                     .classed('hide', false);
41764
41765                 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
41766
41767                 if (isHidden) {
41768                     viewer
41769                         .selectAll('.photo-wrapper:not(.osc-wrapper)')
41770                         .classed('hide', true);
41771
41772                     viewer
41773                         .selectAll('.photo-wrapper.osc-wrapper')
41774                         .classed('hide', false);
41775                 }
41776
41777                 return this;
41778             },
41779
41780
41781             hideViewer: function() {
41782                 _oscSelectedImage = null;
41783
41784                 var viewer = d3_select('#photoviewer');
41785                 if (!viewer.empty()) viewer.datum(null);
41786
41787                 viewer
41788                     .classed('hide', true)
41789                     .selectAll('.photo-wrapper')
41790                     .classed('hide', true);
41791
41792                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
41793                     .classed('currentView', false);
41794
41795                 return this.setStyles(null, true);
41796             },
41797
41798
41799             updateViewer: function(d) {
41800                 var wrap = d3_select('#photoviewer .osc-wrapper');
41801                 var imageWrap = wrap.selectAll('.osc-image-wrap');
41802                 var attribution = wrap.selectAll('.photo-attribution').html('');
41803
41804                 wrap
41805                     .transition()
41806                     .duration(100)
41807                     .call(imgZoom.transform, identity$8);
41808
41809                 imageWrap
41810                     .selectAll('.osc-image')
41811                     .remove();
41812
41813                 if (d) {
41814                     var sequence = _oscCache.sequences[d.sequence_id];
41815                     var r = (sequence && sequence.rotation) || 0;
41816
41817                     imageWrap
41818                         .append('img')
41819                         .attr('class', 'osc-image')
41820                         .attr('src', apibase$2 + '/' + d.imagePath)
41821                         .style('transform', 'rotate(' + r + 'deg)');
41822
41823                     if (d.captured_by) {
41824                         attribution
41825                             .append('a')
41826                             .attr('class', 'captured_by')
41827                             .attr('target', '_blank')
41828                             .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
41829                             .text('@' + d.captured_by);
41830
41831                         attribution
41832                             .append('span')
41833                             .text('|');
41834                     }
41835
41836                     if (d.captured_at) {
41837                         attribution
41838                             .append('span')
41839                             .attr('class', 'captured_at')
41840                             .text(localeDateString(d.captured_at));
41841
41842                         attribution
41843                             .append('span')
41844                             .text('|');
41845                     }
41846
41847                     attribution
41848                         .append('a')
41849                         .attr('class', 'image-link')
41850                         .attr('target', '_blank')
41851                         .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
41852                         .text('openstreetcam.org');
41853                 }
41854
41855                 return this;
41856
41857
41858                 function localeDateString(s) {
41859                     if (!s) return null;
41860                     var detected = utilDetect();
41861                     var options = { day: 'numeric', month: 'short', year: 'numeric' };
41862                     var d = new Date(s);
41863                     if (isNaN(d.getTime())) return null;
41864                     return d.toLocaleDateString(detected.locale, options);
41865                 }
41866             },
41867
41868
41869             selectImage: function(d) {
41870                 _oscSelectedImage = d;
41871                 var viewer = d3_select('#photoviewer');
41872                 if (!viewer.empty()) viewer.datum(d);
41873
41874                 this.setStyles(null, true);
41875
41876                 d3_selectAll('.icon-sign')
41877                     .classed('currentView', false);
41878
41879                 return this;
41880             },
41881
41882
41883             getSelectedImage: function() {
41884                 return _oscSelectedImage;
41885             },
41886
41887
41888             getSequenceKeyForImage: function(d) {
41889                 return d && d.sequence_id;
41890             },
41891
41892
41893             // Updates the currently highlighted sequence and selected bubble.
41894             // Reset is only necessary when interacting with the viewport because
41895             // this implicitly changes the currently selected bubble/sequence
41896             setStyles: function(hovered, reset) {
41897                 if (reset) {  // reset all layers
41898                     d3_selectAll('.viewfield-group')
41899                         .classed('highlighted', false)
41900                         .classed('hovered', false)
41901                         .classed('currentView', false);
41902
41903                     d3_selectAll('.sequence')
41904                         .classed('highlighted', false)
41905                         .classed('currentView', false);
41906                 }
41907
41908                 var hoveredImageKey = hovered && hovered.key;
41909                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
41910                 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
41911                 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
41912
41913                 var viewer = d3_select('#photoviewer');
41914                 var selected = viewer.empty() ? undefined : viewer.datum();
41915                 var selectedImageKey = selected && selected.key;
41916                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
41917                 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
41918                 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
41919
41920                 // highlight sibling viewfields on either the selected or the hovered sequences
41921                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
41922
41923                 d3_selectAll('.layer-openstreetcam .viewfield-group')
41924                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
41925                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
41926                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
41927
41928                 d3_selectAll('.layer-openstreetcam .sequence')
41929                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
41930                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
41931
41932                 // update viewfields if needed
41933                 d3_selectAll('.viewfield-group .viewfield')
41934                     .attr('d', viewfieldPath);
41935
41936                 function viewfieldPath() {
41937                     var d = this.parentNode.__data__;
41938                     if (d.pano && d.key !== selectedImageKey) {
41939                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
41940                     } else {
41941                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
41942                     }
41943                 }
41944
41945                 return this;
41946             },
41947
41948
41949             cache: function() {
41950                 return _oscCache;
41951             }
41952
41953         };
41954
41955         /**
41956          * Checks if `value` is the
41957          * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
41958          * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
41959          *
41960          * @static
41961          * @memberOf _
41962          * @since 0.1.0
41963          * @category Lang
41964          * @param {*} value The value to check.
41965          * @returns {boolean} Returns `true` if `value` is an object, else `false`.
41966          * @example
41967          *
41968          * _.isObject({});
41969          * // => true
41970          *
41971          * _.isObject([1, 2, 3]);
41972          * // => true
41973          *
41974          * _.isObject(_.noop);
41975          * // => true
41976          *
41977          * _.isObject(null);
41978          * // => false
41979          */
41980         function isObject$1(value) {
41981           var type = typeof value;
41982           return value != null && (type == 'object' || type == 'function');
41983         }
41984
41985         /** Detect free variable `global` from Node.js. */
41986         var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
41987
41988         /** Detect free variable `self`. */
41989         var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
41990
41991         /** Used as a reference to the global object. */
41992         var root$3 = freeGlobal || freeSelf || Function('return this')();
41993
41994         /**
41995          * Gets the timestamp of the number of milliseconds that have elapsed since
41996          * the Unix epoch (1 January 1970 00:00:00 UTC).
41997          *
41998          * @static
41999          * @memberOf _
42000          * @since 2.4.0
42001          * @category Date
42002          * @returns {number} Returns the timestamp.
42003          * @example
42004          *
42005          * _.defer(function(stamp) {
42006          *   console.log(_.now() - stamp);
42007          * }, _.now());
42008          * // => Logs the number of milliseconds it took for the deferred invocation.
42009          */
42010         var now$1 = function() {
42011           return root$3.Date.now();
42012         };
42013
42014         /** Built-in value references. */
42015         var Symbol$1 = root$3.Symbol;
42016
42017         /** Used for built-in method references. */
42018         var objectProto = Object.prototype;
42019
42020         /** Used to check objects for own properties. */
42021         var hasOwnProperty$1 = objectProto.hasOwnProperty;
42022
42023         /**
42024          * Used to resolve the
42025          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42026          * of values.
42027          */
42028         var nativeObjectToString = objectProto.toString;
42029
42030         /** Built-in value references. */
42031         var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
42032
42033         /**
42034          * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
42035          *
42036          * @private
42037          * @param {*} value The value to query.
42038          * @returns {string} Returns the raw `toStringTag`.
42039          */
42040         function getRawTag(value) {
42041           var isOwn = hasOwnProperty$1.call(value, symToStringTag),
42042               tag = value[symToStringTag];
42043
42044           try {
42045             value[symToStringTag] = undefined;
42046             var unmasked = true;
42047           } catch (e) {}
42048
42049           var result = nativeObjectToString.call(value);
42050           if (unmasked) {
42051             if (isOwn) {
42052               value[symToStringTag] = tag;
42053             } else {
42054               delete value[symToStringTag];
42055             }
42056           }
42057           return result;
42058         }
42059
42060         /** Used for built-in method references. */
42061         var objectProto$1 = Object.prototype;
42062
42063         /**
42064          * Used to resolve the
42065          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42066          * of values.
42067          */
42068         var nativeObjectToString$1 = objectProto$1.toString;
42069
42070         /**
42071          * Converts `value` to a string using `Object.prototype.toString`.
42072          *
42073          * @private
42074          * @param {*} value The value to convert.
42075          * @returns {string} Returns the converted string.
42076          */
42077         function objectToString(value) {
42078           return nativeObjectToString$1.call(value);
42079         }
42080
42081         /** `Object#toString` result references. */
42082         var nullTag = '[object Null]',
42083             undefinedTag = '[object Undefined]';
42084
42085         /** Built-in value references. */
42086         var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
42087
42088         /**
42089          * The base implementation of `getTag` without fallbacks for buggy environments.
42090          *
42091          * @private
42092          * @param {*} value The value to query.
42093          * @returns {string} Returns the `toStringTag`.
42094          */
42095         function baseGetTag(value) {
42096           if (value == null) {
42097             return value === undefined ? undefinedTag : nullTag;
42098           }
42099           return (symToStringTag$1 && symToStringTag$1 in Object(value))
42100             ? getRawTag(value)
42101             : objectToString(value);
42102         }
42103
42104         /**
42105          * Checks if `value` is object-like. A value is object-like if it's not `null`
42106          * and has a `typeof` result of "object".
42107          *
42108          * @static
42109          * @memberOf _
42110          * @since 4.0.0
42111          * @category Lang
42112          * @param {*} value The value to check.
42113          * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
42114          * @example
42115          *
42116          * _.isObjectLike({});
42117          * // => true
42118          *
42119          * _.isObjectLike([1, 2, 3]);
42120          * // => true
42121          *
42122          * _.isObjectLike(_.noop);
42123          * // => false
42124          *
42125          * _.isObjectLike(null);
42126          * // => false
42127          */
42128         function isObjectLike(value) {
42129           return value != null && typeof value == 'object';
42130         }
42131
42132         /** `Object#toString` result references. */
42133         var symbolTag = '[object Symbol]';
42134
42135         /**
42136          * Checks if `value` is classified as a `Symbol` primitive or object.
42137          *
42138          * @static
42139          * @memberOf _
42140          * @since 4.0.0
42141          * @category Lang
42142          * @param {*} value The value to check.
42143          * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
42144          * @example
42145          *
42146          * _.isSymbol(Symbol.iterator);
42147          * // => true
42148          *
42149          * _.isSymbol('abc');
42150          * // => false
42151          */
42152         function isSymbol$2(value) {
42153           return typeof value == 'symbol' ||
42154             (isObjectLike(value) && baseGetTag(value) == symbolTag);
42155         }
42156
42157         /** Used as references for various `Number` constants. */
42158         var NAN = 0 / 0;
42159
42160         /** Used to match leading and trailing whitespace. */
42161         var reTrim = /^\s+|\s+$/g;
42162
42163         /** Used to detect bad signed hexadecimal string values. */
42164         var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
42165
42166         /** Used to detect binary string values. */
42167         var reIsBinary = /^0b[01]+$/i;
42168
42169         /** Used to detect octal string values. */
42170         var reIsOctal = /^0o[0-7]+$/i;
42171
42172         /** Built-in method references without a dependency on `root`. */
42173         var freeParseInt = parseInt;
42174
42175         /**
42176          * Converts `value` to a number.
42177          *
42178          * @static
42179          * @memberOf _
42180          * @since 4.0.0
42181          * @category Lang
42182          * @param {*} value The value to process.
42183          * @returns {number} Returns the number.
42184          * @example
42185          *
42186          * _.toNumber(3.2);
42187          * // => 3.2
42188          *
42189          * _.toNumber(Number.MIN_VALUE);
42190          * // => 5e-324
42191          *
42192          * _.toNumber(Infinity);
42193          * // => Infinity
42194          *
42195          * _.toNumber('3.2');
42196          * // => 3.2
42197          */
42198         function toNumber(value) {
42199           if (typeof value == 'number') {
42200             return value;
42201           }
42202           if (isSymbol$2(value)) {
42203             return NAN;
42204           }
42205           if (isObject$1(value)) {
42206             var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
42207             value = isObject$1(other) ? (other + '') : other;
42208           }
42209           if (typeof value != 'string') {
42210             return value === 0 ? value : +value;
42211           }
42212           value = value.replace(reTrim, '');
42213           var isBinary = reIsBinary.test(value);
42214           return (isBinary || reIsOctal.test(value))
42215             ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
42216             : (reIsBadHex.test(value) ? NAN : +value);
42217         }
42218
42219         /** Error message constants. */
42220         var FUNC_ERROR_TEXT = 'Expected a function';
42221
42222         /* Built-in method references for those with the same name as other `lodash` methods. */
42223         var nativeMax = Math.max,
42224             nativeMin = Math.min;
42225
42226         /**
42227          * Creates a debounced function that delays invoking `func` until after `wait`
42228          * milliseconds have elapsed since the last time the debounced function was
42229          * invoked. The debounced function comes with a `cancel` method to cancel
42230          * delayed `func` invocations and a `flush` method to immediately invoke them.
42231          * Provide `options` to indicate whether `func` should be invoked on the
42232          * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
42233          * with the last arguments provided to the debounced function. Subsequent
42234          * calls to the debounced function return the result of the last `func`
42235          * invocation.
42236          *
42237          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42238          * invoked on the trailing edge of the timeout only if the debounced function
42239          * is invoked more than once during the `wait` timeout.
42240          *
42241          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42242          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42243          *
42244          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42245          * for details over the differences between `_.debounce` and `_.throttle`.
42246          *
42247          * @static
42248          * @memberOf _
42249          * @since 0.1.0
42250          * @category Function
42251          * @param {Function} func The function to debounce.
42252          * @param {number} [wait=0] The number of milliseconds to delay.
42253          * @param {Object} [options={}] The options object.
42254          * @param {boolean} [options.leading=false]
42255          *  Specify invoking on the leading edge of the timeout.
42256          * @param {number} [options.maxWait]
42257          *  The maximum time `func` is allowed to be delayed before it's invoked.
42258          * @param {boolean} [options.trailing=true]
42259          *  Specify invoking on the trailing edge of the timeout.
42260          * @returns {Function} Returns the new debounced function.
42261          * @example
42262          *
42263          * // Avoid costly calculations while the window size is in flux.
42264          * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
42265          *
42266          * // Invoke `sendMail` when clicked, debouncing subsequent calls.
42267          * jQuery(element).on('click', _.debounce(sendMail, 300, {
42268          *   'leading': true,
42269          *   'trailing': false
42270          * }));
42271          *
42272          * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
42273          * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
42274          * var source = new EventSource('/stream');
42275          * jQuery(source).on('message', debounced);
42276          *
42277          * // Cancel the trailing debounced invocation.
42278          * jQuery(window).on('popstate', debounced.cancel);
42279          */
42280         function debounce(func, wait, options) {
42281           var lastArgs,
42282               lastThis,
42283               maxWait,
42284               result,
42285               timerId,
42286               lastCallTime,
42287               lastInvokeTime = 0,
42288               leading = false,
42289               maxing = false,
42290               trailing = true;
42291
42292           if (typeof func != 'function') {
42293             throw new TypeError(FUNC_ERROR_TEXT);
42294           }
42295           wait = toNumber(wait) || 0;
42296           if (isObject$1(options)) {
42297             leading = !!options.leading;
42298             maxing = 'maxWait' in options;
42299             maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
42300             trailing = 'trailing' in options ? !!options.trailing : trailing;
42301           }
42302
42303           function invokeFunc(time) {
42304             var args = lastArgs,
42305                 thisArg = lastThis;
42306
42307             lastArgs = lastThis = undefined;
42308             lastInvokeTime = time;
42309             result = func.apply(thisArg, args);
42310             return result;
42311           }
42312
42313           function leadingEdge(time) {
42314             // Reset any `maxWait` timer.
42315             lastInvokeTime = time;
42316             // Start the timer for the trailing edge.
42317             timerId = setTimeout(timerExpired, wait);
42318             // Invoke the leading edge.
42319             return leading ? invokeFunc(time) : result;
42320           }
42321
42322           function remainingWait(time) {
42323             var timeSinceLastCall = time - lastCallTime,
42324                 timeSinceLastInvoke = time - lastInvokeTime,
42325                 timeWaiting = wait - timeSinceLastCall;
42326
42327             return maxing
42328               ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
42329               : timeWaiting;
42330           }
42331
42332           function shouldInvoke(time) {
42333             var timeSinceLastCall = time - lastCallTime,
42334                 timeSinceLastInvoke = time - lastInvokeTime;
42335
42336             // Either this is the first call, activity has stopped and we're at the
42337             // trailing edge, the system time has gone backwards and we're treating
42338             // it as the trailing edge, or we've hit the `maxWait` limit.
42339             return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
42340               (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
42341           }
42342
42343           function timerExpired() {
42344             var time = now$1();
42345             if (shouldInvoke(time)) {
42346               return trailingEdge(time);
42347             }
42348             // Restart the timer.
42349             timerId = setTimeout(timerExpired, remainingWait(time));
42350           }
42351
42352           function trailingEdge(time) {
42353             timerId = undefined;
42354
42355             // Only invoke if we have `lastArgs` which means `func` has been
42356             // debounced at least once.
42357             if (trailing && lastArgs) {
42358               return invokeFunc(time);
42359             }
42360             lastArgs = lastThis = undefined;
42361             return result;
42362           }
42363
42364           function cancel() {
42365             if (timerId !== undefined) {
42366               clearTimeout(timerId);
42367             }
42368             lastInvokeTime = 0;
42369             lastArgs = lastCallTime = lastThis = timerId = undefined;
42370           }
42371
42372           function flush() {
42373             return timerId === undefined ? result : trailingEdge(now$1());
42374           }
42375
42376           function debounced() {
42377             var time = now$1(),
42378                 isInvoking = shouldInvoke(time);
42379
42380             lastArgs = arguments;
42381             lastThis = this;
42382             lastCallTime = time;
42383
42384             if (isInvoking) {
42385               if (timerId === undefined) {
42386                 return leadingEdge(lastCallTime);
42387               }
42388               if (maxing) {
42389                 // Handle invocations in a tight loop.
42390                 timerId = setTimeout(timerExpired, wait);
42391                 return invokeFunc(lastCallTime);
42392               }
42393             }
42394             if (timerId === undefined) {
42395               timerId = setTimeout(timerExpired, wait);
42396             }
42397             return result;
42398           }
42399           debounced.cancel = cancel;
42400           debounced.flush = flush;
42401           return debounced;
42402         }
42403
42404         /** Error message constants. */
42405         var FUNC_ERROR_TEXT$1 = 'Expected a function';
42406
42407         /**
42408          * Creates a throttled function that only invokes `func` at most once per
42409          * every `wait` milliseconds. The throttled function comes with a `cancel`
42410          * method to cancel delayed `func` invocations and a `flush` method to
42411          * immediately invoke them. Provide `options` to indicate whether `func`
42412          * should be invoked on the leading and/or trailing edge of the `wait`
42413          * timeout. The `func` is invoked with the last arguments provided to the
42414          * throttled function. Subsequent calls to the throttled function return the
42415          * result of the last `func` invocation.
42416          *
42417          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42418          * invoked on the trailing edge of the timeout only if the throttled function
42419          * is invoked more than once during the `wait` timeout.
42420          *
42421          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42422          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42423          *
42424          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42425          * for details over the differences between `_.throttle` and `_.debounce`.
42426          *
42427          * @static
42428          * @memberOf _
42429          * @since 0.1.0
42430          * @category Function
42431          * @param {Function} func The function to throttle.
42432          * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
42433          * @param {Object} [options={}] The options object.
42434          * @param {boolean} [options.leading=true]
42435          *  Specify invoking on the leading edge of the timeout.
42436          * @param {boolean} [options.trailing=true]
42437          *  Specify invoking on the trailing edge of the timeout.
42438          * @returns {Function} Returns the new throttled function.
42439          * @example
42440          *
42441          * // Avoid excessively updating the position while scrolling.
42442          * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
42443          *
42444          * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
42445          * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
42446          * jQuery(element).on('click', throttled);
42447          *
42448          * // Cancel the trailing throttled invocation.
42449          * jQuery(window).on('popstate', throttled.cancel);
42450          */
42451         function throttle(func, wait, options) {
42452           var leading = true,
42453               trailing = true;
42454
42455           if (typeof func != 'function') {
42456             throw new TypeError(FUNC_ERROR_TEXT$1);
42457           }
42458           if (isObject$1(options)) {
42459             leading = 'leading' in options ? !!options.leading : leading;
42460             trailing = 'trailing' in options ? !!options.trailing : trailing;
42461           }
42462           return debounce(func, wait, {
42463             'leading': leading,
42464             'maxWait': wait,
42465             'trailing': trailing
42466           });
42467         }
42468
42469         var hashes = createCommonjsModule(function (module, exports) {
42470         /**
42471          * jshashes - https://github.com/h2non/jshashes
42472          * Released under the "New BSD" license
42473          *
42474          * Algorithms specification:
42475          *
42476          * MD5 - http://www.ietf.org/rfc/rfc1321.txt
42477          * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
42478          * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42479          * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42480          * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42481          * HMAC - http://www.ietf.org/rfc/rfc2104.txt
42482          */
42483         (function() {
42484           var Hashes;
42485
42486           function utf8Encode(str) {
42487             var x, y, output = '',
42488               i = -1,
42489               l;
42490
42491             if (str && str.length) {
42492               l = str.length;
42493               while ((i += 1) < l) {
42494                 /* Decode utf-16 surrogate pairs */
42495                 x = str.charCodeAt(i);
42496                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
42497                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
42498                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
42499                   i += 1;
42500                 }
42501                 /* Encode output as utf-8 */
42502                 if (x <= 0x7F) {
42503                   output += String.fromCharCode(x);
42504                 } else if (x <= 0x7FF) {
42505                   output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
42506                     0x80 | (x & 0x3F));
42507                 } else if (x <= 0xFFFF) {
42508                   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
42509                     0x80 | ((x >>> 6) & 0x3F),
42510                     0x80 | (x & 0x3F));
42511                 } else if (x <= 0x1FFFFF) {
42512                   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
42513                     0x80 | ((x >>> 12) & 0x3F),
42514                     0x80 | ((x >>> 6) & 0x3F),
42515                     0x80 | (x & 0x3F));
42516                 }
42517               }
42518             }
42519             return output;
42520           }
42521
42522           function utf8Decode(str) {
42523             var i, ac, c1, c2, c3, arr = [],
42524               l;
42525             i = ac = c1 = c2 = c3 = 0;
42526
42527             if (str && str.length) {
42528               l = str.length;
42529               str += '';
42530
42531               while (i < l) {
42532                 c1 = str.charCodeAt(i);
42533                 ac += 1;
42534                 if (c1 < 128) {
42535                   arr[ac] = String.fromCharCode(c1);
42536                   i += 1;
42537                 } else if (c1 > 191 && c1 < 224) {
42538                   c2 = str.charCodeAt(i + 1);
42539                   arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
42540                   i += 2;
42541                 } else {
42542                   c2 = str.charCodeAt(i + 1);
42543                   c3 = str.charCodeAt(i + 2);
42544                   arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
42545                   i += 3;
42546                 }
42547               }
42548             }
42549             return arr.join('');
42550           }
42551
42552           /**
42553            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
42554            * to work around bugs in some JS interpreters.
42555            */
42556
42557           function safe_add(x, y) {
42558             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
42559               msw = (x >> 16) + (y >> 16) + (lsw >> 16);
42560             return (msw << 16) | (lsw & 0xFFFF);
42561           }
42562
42563           /**
42564            * Bitwise rotate a 32-bit number to the left.
42565            */
42566
42567           function bit_rol(num, cnt) {
42568             return (num << cnt) | (num >>> (32 - cnt));
42569           }
42570
42571           /**
42572            * Convert a raw string to a hex string
42573            */
42574
42575           function rstr2hex(input, hexcase) {
42576             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
42577               output = '',
42578               x, i = 0,
42579               l = input.length;
42580             for (; i < l; i += 1) {
42581               x = input.charCodeAt(i);
42582               output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
42583             }
42584             return output;
42585           }
42586
42587           /**
42588            * Convert an array of big-endian words to a string
42589            */
42590
42591           function binb2rstr(input) {
42592             var i, l = input.length * 32,
42593               output = '';
42594             for (i = 0; i < l; i += 8) {
42595               output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
42596             }
42597             return output;
42598           }
42599
42600           /**
42601            * Convert an array of little-endian words to a string
42602            */
42603
42604           function binl2rstr(input) {
42605             var i, l = input.length * 32,
42606               output = '';
42607             for (i = 0; i < l; i += 8) {
42608               output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42609             }
42610             return output;
42611           }
42612
42613           /**
42614            * Convert a raw string to an array of little-endian words
42615            * Characters >255 have their high-byte silently ignored.
42616            */
42617
42618           function rstr2binl(input) {
42619             var i, l = input.length * 8,
42620               output = Array(input.length >> 2),
42621               lo = output.length;
42622             for (i = 0; i < lo; i += 1) {
42623               output[i] = 0;
42624             }
42625             for (i = 0; i < l; i += 8) {
42626               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
42627             }
42628             return output;
42629           }
42630
42631           /**
42632            * Convert a raw string to an array of big-endian words
42633            * Characters >255 have their high-byte silently ignored.
42634            */
42635
42636           function rstr2binb(input) {
42637             var i, l = input.length * 8,
42638               output = Array(input.length >> 2),
42639               lo = output.length;
42640             for (i = 0; i < lo; i += 1) {
42641               output[i] = 0;
42642             }
42643             for (i = 0; i < l; i += 8) {
42644               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
42645             }
42646             return output;
42647           }
42648
42649           /**
42650            * Convert a raw string to an arbitrary string encoding
42651            */
42652
42653           function rstr2any(input, encoding) {
42654             var divisor = encoding.length,
42655               remainders = Array(),
42656               i, q, x, ld, quotient, dividend, output, full_length;
42657
42658             /* Convert to an array of 16-bit big-endian values, forming the dividend */
42659             dividend = Array(Math.ceil(input.length / 2));
42660             ld = dividend.length;
42661             for (i = 0; i < ld; i += 1) {
42662               dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
42663             }
42664
42665             /**
42666              * Repeatedly perform a long division. The binary array forms the dividend,
42667              * the length of the encoding is the divisor. Once computed, the quotient
42668              * forms the dividend for the next step. We stop when the dividend is zerHashes.
42669              * All remainders are stored for later use.
42670              */
42671             while (dividend.length > 0) {
42672               quotient = Array();
42673               x = 0;
42674               for (i = 0; i < dividend.length; i += 1) {
42675                 x = (x << 16) + dividend[i];
42676                 q = Math.floor(x / divisor);
42677                 x -= q * divisor;
42678                 if (quotient.length > 0 || q > 0) {
42679                   quotient[quotient.length] = q;
42680                 }
42681               }
42682               remainders[remainders.length] = x;
42683               dividend = quotient;
42684             }
42685
42686             /* Convert the remainders to the output string */
42687             output = '';
42688             for (i = remainders.length - 1; i >= 0; i--) {
42689               output += encoding.charAt(remainders[i]);
42690             }
42691
42692             /* Append leading zero equivalents */
42693             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
42694             for (i = output.length; i < full_length; i += 1) {
42695               output = encoding[0] + output;
42696             }
42697             return output;
42698           }
42699
42700           /**
42701            * Convert a raw string to a base-64 string
42702            */
42703
42704           function rstr2b64(input, b64pad) {
42705             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42706               output = '',
42707               len = input.length,
42708               i, j, triplet;
42709             b64pad = b64pad || '=';
42710             for (i = 0; i < len; i += 3) {
42711               triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42712               for (j = 0; j < 4; j += 1) {
42713                 if (i * 8 + j * 6 > input.length * 8) {
42714                   output += b64pad;
42715                 } else {
42716                   output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42717                 }
42718               }
42719             }
42720             return output;
42721           }
42722
42723           Hashes = {
42724             /**
42725              * @property {String} version
42726              * @readonly
42727              */
42728             VERSION: '1.0.6',
42729             /**
42730              * @member Hashes
42731              * @class Base64
42732              * @constructor
42733              */
42734             Base64: function() {
42735               // private properties
42736               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42737                 pad = '=', // default pad according with the RFC standard
42738                 utf8 = true; // by default enable UTF-8 support encoding
42739
42740               // public method for encoding
42741               this.encode = function(input) {
42742                 var i, j, triplet,
42743                   output = '',
42744                   len = input.length;
42745
42746                 pad = pad || '=';
42747                 input = (utf8) ? utf8Encode(input) : input;
42748
42749                 for (i = 0; i < len; i += 3) {
42750                   triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42751                   for (j = 0; j < 4; j += 1) {
42752                     if (i * 8 + j * 6 > len * 8) {
42753                       output += pad;
42754                     } else {
42755                       output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42756                     }
42757                   }
42758                 }
42759                 return output;
42760               };
42761
42762               // public method for decoding
42763               this.decode = function(input) {
42764                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
42765                 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
42766                   dec = '',
42767                   arr = [];
42768                 if (!input) {
42769                   return input;
42770                 }
42771
42772                 i = ac = 0;
42773                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
42774                 //input += '';
42775
42776                 do { // unpack four hexets into three octets using index points in b64
42777                   h1 = tab.indexOf(input.charAt(i += 1));
42778                   h2 = tab.indexOf(input.charAt(i += 1));
42779                   h3 = tab.indexOf(input.charAt(i += 1));
42780                   h4 = tab.indexOf(input.charAt(i += 1));
42781
42782                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
42783
42784                   o1 = bits >> 16 & 0xff;
42785                   o2 = bits >> 8 & 0xff;
42786                   o3 = bits & 0xff;
42787                   ac += 1;
42788
42789                   if (h3 === 64) {
42790                     arr[ac] = String.fromCharCode(o1);
42791                   } else if (h4 === 64) {
42792                     arr[ac] = String.fromCharCode(o1, o2);
42793                   } else {
42794                     arr[ac] = String.fromCharCode(o1, o2, o3);
42795                   }
42796                 } while (i < input.length);
42797
42798                 dec = arr.join('');
42799                 dec = (utf8) ? utf8Decode(dec) : dec;
42800
42801                 return dec;
42802               };
42803
42804               // set custom pad string
42805               this.setPad = function(str) {
42806                 pad = str || pad;
42807                 return this;
42808               };
42809               // set custom tab string characters
42810               this.setTab = function(str) {
42811                 tab = str || tab;
42812                 return this;
42813               };
42814               this.setUTF8 = function(bool) {
42815                 if (typeof bool === 'boolean') {
42816                   utf8 = bool;
42817                 }
42818                 return this;
42819               };
42820             },
42821
42822             /**
42823              * CRC-32 calculation
42824              * @member Hashes
42825              * @method CRC32
42826              * @static
42827              * @param {String} str Input String
42828              * @return {String}
42829              */
42830             CRC32: function(str) {
42831               var crc = 0,
42832                 x = 0,
42833                 y = 0,
42834                 table, i, iTop;
42835               str = utf8Encode(str);
42836
42837               table = [
42838                 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
42839                 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
42840                 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
42841                 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
42842                 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
42843                 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
42844                 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
42845                 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
42846                 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
42847                 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
42848                 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
42849                 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
42850                 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
42851                 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
42852                 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
42853                 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
42854                 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
42855                 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
42856                 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
42857                 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
42858                 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
42859                 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
42860                 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
42861                 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
42862                 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
42863                 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
42864               ].join('');
42865
42866               crc = crc ^ (-1);
42867               for (i = 0, iTop = str.length; i < iTop; i += 1) {
42868                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
42869                 x = '0x' + table.substr(y * 9, 8);
42870                 crc = (crc >>> 8) ^ x;
42871               }
42872               // always return a positive number (that's what >>> 0 does)
42873               return (crc ^ (-1)) >>> 0;
42874             },
42875             /**
42876              * @member Hashes
42877              * @class MD5
42878              * @constructor
42879              * @param {Object} [config]
42880              *
42881              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
42882              * Digest Algorithm, as defined in RFC 1321.
42883              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
42884              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
42885              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
42886              */
42887             MD5: function(options) {
42888               /**
42889                * Private config properties. You may need to tweak these to be compatible with
42890                * the server-side, but the defaults work in most cases.
42891                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
42892                */
42893               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
42894                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
42895                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
42896
42897               // privileged (public) methods
42898               this.hex = function(s) {
42899                 return rstr2hex(rstr(s), hexcase);
42900               };
42901               this.b64 = function(s) {
42902                 return rstr2b64(rstr(s), b64pad);
42903               };
42904               this.any = function(s, e) {
42905                 return rstr2any(rstr(s), e);
42906               };
42907               this.raw = function(s) {
42908                 return rstr(s);
42909               };
42910               this.hex_hmac = function(k, d) {
42911                 return rstr2hex(rstr_hmac(k, d), hexcase);
42912               };
42913               this.b64_hmac = function(k, d) {
42914                 return rstr2b64(rstr_hmac(k, d), b64pad);
42915               };
42916               this.any_hmac = function(k, d, e) {
42917                 return rstr2any(rstr_hmac(k, d), e);
42918               };
42919               /**
42920                * Perform a simple self-test to see if the VM is working
42921                * @return {String} Hexadecimal hash sample
42922                */
42923               this.vm_test = function() {
42924                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42925               };
42926               /**
42927                * Enable/disable uppercase hexadecimal returned string
42928                * @param {Boolean}
42929                * @return {Object} this
42930                */
42931               this.setUpperCase = function(a) {
42932                 if (typeof a === 'boolean') {
42933                   hexcase = a;
42934                 }
42935                 return this;
42936               };
42937               /**
42938                * Defines a base64 pad string
42939                * @param {String} Pad
42940                * @return {Object} this
42941                */
42942               this.setPad = function(a) {
42943                 b64pad = a || b64pad;
42944                 return this;
42945               };
42946               /**
42947                * Defines a base64 pad string
42948                * @param {Boolean}
42949                * @return {Object} [this]
42950                */
42951               this.setUTF8 = function(a) {
42952                 if (typeof a === 'boolean') {
42953                   utf8 = a;
42954                 }
42955                 return this;
42956               };
42957
42958               // private methods
42959
42960               /**
42961                * Calculate the MD5 of a raw string
42962                */
42963
42964               function rstr(s) {
42965                 s = (utf8) ? utf8Encode(s) : s;
42966                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
42967               }
42968
42969               /**
42970                * Calculate the HMAC-MD5, of a key and some data (raw strings)
42971                */
42972
42973               function rstr_hmac(key, data) {
42974                 var bkey, ipad, opad, hash, i;
42975
42976                 key = (utf8) ? utf8Encode(key) : key;
42977                 data = (utf8) ? utf8Encode(data) : data;
42978                 bkey = rstr2binl(key);
42979                 if (bkey.length > 16) {
42980                   bkey = binl(bkey, key.length * 8);
42981                 }
42982
42983                 ipad = Array(16), opad = Array(16);
42984                 for (i = 0; i < 16; i += 1) {
42985                   ipad[i] = bkey[i] ^ 0x36363636;
42986                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
42987                 }
42988                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42989                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
42990               }
42991
42992               /**
42993                * Calculate the MD5 of an array of little-endian words, and a bit length.
42994                */
42995
42996               function binl(x, len) {
42997                 var i, olda, oldb, oldc, oldd,
42998                   a = 1732584193,
42999                   b = -271733879,
43000                   c = -1732584194,
43001                   d = 271733878;
43002
43003                 /* append padding */
43004                 x[len >> 5] |= 0x80 << ((len) % 32);
43005                 x[(((len + 64) >>> 9) << 4) + 14] = len;
43006
43007                 for (i = 0; i < x.length; i += 16) {
43008                   olda = a;
43009                   oldb = b;
43010                   oldc = c;
43011                   oldd = d;
43012
43013                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
43014                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
43015                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
43016                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
43017                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
43018                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
43019                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
43020                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
43021                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
43022                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
43023                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
43024                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
43025                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
43026                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
43027                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
43028                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
43029
43030                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
43031                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
43032                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
43033                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
43034                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
43035                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
43036                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
43037                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
43038                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
43039                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
43040                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
43041                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
43042                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
43043                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
43044                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
43045                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
43046
43047                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
43048                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
43049                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
43050                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
43051                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
43052                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
43053                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
43054                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
43055                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
43056                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
43057                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
43058                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
43059                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
43060                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
43061                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
43062                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
43063
43064                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
43065                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
43066                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
43067                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
43068                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
43069                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
43070                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
43071                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
43072                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
43073                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
43074                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
43075                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
43076                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
43077                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
43078                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
43079                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
43080
43081                   a = safe_add(a, olda);
43082                   b = safe_add(b, oldb);
43083                   c = safe_add(c, oldc);
43084                   d = safe_add(d, oldd);
43085                 }
43086                 return Array(a, b, c, d);
43087               }
43088
43089               /**
43090                * These functions implement the four basic operations the algorithm uses.
43091                */
43092
43093               function md5_cmn(q, a, b, x, s, t) {
43094                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
43095               }
43096
43097               function md5_ff(a, b, c, d, x, s, t) {
43098                 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
43099               }
43100
43101               function md5_gg(a, b, c, d, x, s, t) {
43102                 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
43103               }
43104
43105               function md5_hh(a, b, c, d, x, s, t) {
43106                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
43107               }
43108
43109               function md5_ii(a, b, c, d, x, s, t) {
43110                 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
43111               }
43112             },
43113             /**
43114              * @member Hashes
43115              * @class Hashes.SHA1
43116              * @param {Object} [config]
43117              * @constructor
43118              *
43119              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
43120              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
43121              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43122              * See http://pajhome.org.uk/crypt/md5 for details.
43123              */
43124             SHA1: function(options) {
43125               /**
43126                * Private config properties. You may need to tweak these to be compatible with
43127                * the server-side, but the defaults work in most cases.
43128                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43129                */
43130               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43131                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43132                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43133
43134               // public methods
43135               this.hex = function(s) {
43136                 return rstr2hex(rstr(s), hexcase);
43137               };
43138               this.b64 = function(s) {
43139                 return rstr2b64(rstr(s), b64pad);
43140               };
43141               this.any = function(s, e) {
43142                 return rstr2any(rstr(s), e);
43143               };
43144               this.raw = function(s) {
43145                 return rstr(s);
43146               };
43147               this.hex_hmac = function(k, d) {
43148                 return rstr2hex(rstr_hmac(k, d));
43149               };
43150               this.b64_hmac = function(k, d) {
43151                 return rstr2b64(rstr_hmac(k, d), b64pad);
43152               };
43153               this.any_hmac = function(k, d, e) {
43154                 return rstr2any(rstr_hmac(k, d), e);
43155               };
43156               /**
43157                * Perform a simple self-test to see if the VM is working
43158                * @return {String} Hexadecimal hash sample
43159                * @public
43160                */
43161               this.vm_test = function() {
43162                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43163               };
43164               /**
43165                * @description Enable/disable uppercase hexadecimal returned string
43166                * @param {boolean}
43167                * @return {Object} this
43168                * @public
43169                */
43170               this.setUpperCase = function(a) {
43171                 if (typeof a === 'boolean') {
43172                   hexcase = a;
43173                 }
43174                 return this;
43175               };
43176               /**
43177                * @description Defines a base64 pad string
43178                * @param {string} Pad
43179                * @return {Object} this
43180                * @public
43181                */
43182               this.setPad = function(a) {
43183                 b64pad = a || b64pad;
43184                 return this;
43185               };
43186               /**
43187                * @description Defines a base64 pad string
43188                * @param {boolean}
43189                * @return {Object} this
43190                * @public
43191                */
43192               this.setUTF8 = function(a) {
43193                 if (typeof a === 'boolean') {
43194                   utf8 = a;
43195                 }
43196                 return this;
43197               };
43198
43199               // private methods
43200
43201               /**
43202                * Calculate the SHA-512 of a raw string
43203                */
43204
43205               function rstr(s) {
43206                 s = (utf8) ? utf8Encode(s) : s;
43207                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43208               }
43209
43210               /**
43211                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
43212                */
43213
43214               function rstr_hmac(key, data) {
43215                 var bkey, ipad, opad, i, hash;
43216                 key = (utf8) ? utf8Encode(key) : key;
43217                 data = (utf8) ? utf8Encode(data) : data;
43218                 bkey = rstr2binb(key);
43219
43220                 if (bkey.length > 16) {
43221                   bkey = binb(bkey, key.length * 8);
43222                 }
43223                 ipad = Array(16), opad = Array(16);
43224                 for (i = 0; i < 16; i += 1) {
43225                   ipad[i] = bkey[i] ^ 0x36363636;
43226                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43227                 }
43228                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43229                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
43230               }
43231
43232               /**
43233                * Calculate the SHA-1 of an array of big-endian words, and a bit length
43234                */
43235
43236               function binb(x, len) {
43237                 var i, j, t, olda, oldb, oldc, oldd, olde,
43238                   w = Array(80),
43239                   a = 1732584193,
43240                   b = -271733879,
43241                   c = -1732584194,
43242                   d = 271733878,
43243                   e = -1009589776;
43244
43245                 /* append padding */
43246                 x[len >> 5] |= 0x80 << (24 - len % 32);
43247                 x[((len + 64 >> 9) << 4) + 15] = len;
43248
43249                 for (i = 0; i < x.length; i += 16) {
43250                   olda = a;
43251                   oldb = b;
43252                   oldc = c;
43253                   oldd = d;
43254                   olde = e;
43255
43256                   for (j = 0; j < 80; j += 1) {
43257                     if (j < 16) {
43258                       w[j] = x[i + j];
43259                     } else {
43260                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
43261                     }
43262                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
43263                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
43264                     e = d;
43265                     d = c;
43266                     c = bit_rol(b, 30);
43267                     b = a;
43268                     a = t;
43269                   }
43270
43271                   a = safe_add(a, olda);
43272                   b = safe_add(b, oldb);
43273                   c = safe_add(c, oldc);
43274                   d = safe_add(d, oldd);
43275                   e = safe_add(e, olde);
43276                 }
43277                 return Array(a, b, c, d, e);
43278               }
43279
43280               /**
43281                * Perform the appropriate triplet combination function for the current
43282                * iteration
43283                */
43284
43285               function sha1_ft(t, b, c, d) {
43286                 if (t < 20) {
43287                   return (b & c) | ((~b) & d);
43288                 }
43289                 if (t < 40) {
43290                   return b ^ c ^ d;
43291                 }
43292                 if (t < 60) {
43293                   return (b & c) | (b & d) | (c & d);
43294                 }
43295                 return b ^ c ^ d;
43296               }
43297
43298               /**
43299                * Determine the appropriate additive constant for the current iteration
43300                */
43301
43302               function sha1_kt(t) {
43303                 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
43304                   (t < 60) ? -1894007588 : -899497514;
43305               }
43306             },
43307             /**
43308              * @class Hashes.SHA256
43309              * @param {config}
43310              *
43311              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
43312              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
43313              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43314              * See http://pajhome.org.uk/crypt/md5 for details.
43315              * Also http://anmar.eu.org/projects/jssha2/
43316              */
43317             SHA256: function(options) {
43318               /**
43319                * Private properties configuration variables. You may need to tweak these to be compatible with
43320                * the server-side, but the defaults work in most cases.
43321                * @see this.setUpperCase() method
43322                * @see this.setPad() method
43323                */
43324               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
43325                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43326                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43327                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43328                 /* enable/disable utf8 encoding */
43329                 sha256_K;
43330
43331               /* privileged (public) methods */
43332               this.hex = function(s) {
43333                 return rstr2hex(rstr(s, utf8));
43334               };
43335               this.b64 = function(s) {
43336                 return rstr2b64(rstr(s, utf8), b64pad);
43337               };
43338               this.any = function(s, e) {
43339                 return rstr2any(rstr(s, utf8), e);
43340               };
43341               this.raw = function(s) {
43342                 return rstr(s, utf8);
43343               };
43344               this.hex_hmac = function(k, d) {
43345                 return rstr2hex(rstr_hmac(k, d));
43346               };
43347               this.b64_hmac = function(k, d) {
43348                 return rstr2b64(rstr_hmac(k, d), b64pad);
43349               };
43350               this.any_hmac = function(k, d, e) {
43351                 return rstr2any(rstr_hmac(k, d), e);
43352               };
43353               /**
43354                * Perform a simple self-test to see if the VM is working
43355                * @return {String} Hexadecimal hash sample
43356                * @public
43357                */
43358               this.vm_test = function() {
43359                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43360               };
43361               /**
43362                * Enable/disable uppercase hexadecimal returned string
43363                * @param {boolean}
43364                * @return {Object} this
43365                * @public
43366                */
43367               this.setUpperCase = function(a) {
43368                 if (typeof a === 'boolean') {
43369                   hexcase = a;
43370                 }
43371                 return this;
43372               };
43373               /**
43374                * @description Defines a base64 pad string
43375                * @param {string} Pad
43376                * @return {Object} this
43377                * @public
43378                */
43379               this.setPad = function(a) {
43380                 b64pad = a || b64pad;
43381                 return this;
43382               };
43383               /**
43384                * Defines a base64 pad string
43385                * @param {boolean}
43386                * @return {Object} this
43387                * @public
43388                */
43389               this.setUTF8 = function(a) {
43390                 if (typeof a === 'boolean') {
43391                   utf8 = a;
43392                 }
43393                 return this;
43394               };
43395
43396               // private methods
43397
43398               /**
43399                * Calculate the SHA-512 of a raw string
43400                */
43401
43402               function rstr(s, utf8) {
43403                 s = (utf8) ? utf8Encode(s) : s;
43404                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43405               }
43406
43407               /**
43408                * Calculate the HMAC-sha256 of a key and some data (raw strings)
43409                */
43410
43411               function rstr_hmac(key, data) {
43412                 key = (utf8) ? utf8Encode(key) : key;
43413                 data = (utf8) ? utf8Encode(data) : data;
43414                 var hash, i = 0,
43415                   bkey = rstr2binb(key),
43416                   ipad = Array(16),
43417                   opad = Array(16);
43418
43419                 if (bkey.length > 16) {
43420                   bkey = binb(bkey, key.length * 8);
43421                 }
43422
43423                 for (; i < 16; i += 1) {
43424                   ipad[i] = bkey[i] ^ 0x36363636;
43425                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43426                 }
43427
43428                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43429                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
43430               }
43431
43432               /*
43433                * Main sha256 function, with its support functions
43434                */
43435
43436               function sha256_S(X, n) {
43437                 return (X >>> n) | (X << (32 - n));
43438               }
43439
43440               function sha256_R(X, n) {
43441                 return (X >>> n);
43442               }
43443
43444               function sha256_Ch(x, y, z) {
43445                 return ((x & y) ^ ((~x) & z));
43446               }
43447
43448               function sha256_Maj(x, y, z) {
43449                 return ((x & y) ^ (x & z) ^ (y & z));
43450               }
43451
43452               function sha256_Sigma0256(x) {
43453                 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
43454               }
43455
43456               function sha256_Sigma1256(x) {
43457                 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
43458               }
43459
43460               function sha256_Gamma0256(x) {
43461                 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
43462               }
43463
43464               function sha256_Gamma1256(x) {
43465                 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
43466               }
43467
43468               sha256_K = [
43469                 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
43470                 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
43471                 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
43472                 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
43473                 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
43474                 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
43475                 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
43476               ];
43477
43478               function binb(m, l) {
43479                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
43480                   1359893119, -1694144372, 528734635, 1541459225
43481                 ];
43482                 var W = new Array(64);
43483                 var a, b, c, d, e, f, g, h;
43484                 var i, j, T1, T2;
43485
43486                 /* append padding */
43487                 m[l >> 5] |= 0x80 << (24 - l % 32);
43488                 m[((l + 64 >> 9) << 4) + 15] = l;
43489
43490                 for (i = 0; i < m.length; i += 16) {
43491                   a = HASH[0];
43492                   b = HASH[1];
43493                   c = HASH[2];
43494                   d = HASH[3];
43495                   e = HASH[4];
43496                   f = HASH[5];
43497                   g = HASH[6];
43498                   h = HASH[7];
43499
43500                   for (j = 0; j < 64; j += 1) {
43501                     if (j < 16) {
43502                       W[j] = m[j + i];
43503                     } else {
43504                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
43505                         sha256_Gamma0256(W[j - 15])), W[j - 16]);
43506                     }
43507
43508                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
43509                       sha256_K[j]), W[j]);
43510                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
43511                     h = g;
43512                     g = f;
43513                     f = e;
43514                     e = safe_add(d, T1);
43515                     d = c;
43516                     c = b;
43517                     b = a;
43518                     a = safe_add(T1, T2);
43519                   }
43520
43521                   HASH[0] = safe_add(a, HASH[0]);
43522                   HASH[1] = safe_add(b, HASH[1]);
43523                   HASH[2] = safe_add(c, HASH[2]);
43524                   HASH[3] = safe_add(d, HASH[3]);
43525                   HASH[4] = safe_add(e, HASH[4]);
43526                   HASH[5] = safe_add(f, HASH[5]);
43527                   HASH[6] = safe_add(g, HASH[6]);
43528                   HASH[7] = safe_add(h, HASH[7]);
43529                 }
43530                 return HASH;
43531               }
43532
43533             },
43534
43535             /**
43536              * @class Hashes.SHA512
43537              * @param {config}
43538              *
43539              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
43540              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
43541              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43542              * See http://pajhome.org.uk/crypt/md5 for details.
43543              */
43544             SHA512: function(options) {
43545               /**
43546                * Private properties configuration variables. You may need to tweak these to be compatible with
43547                * the server-side, but the defaults work in most cases.
43548                * @see this.setUpperCase() method
43549                * @see this.setPad() method
43550                */
43551               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43552                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43553                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43554                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43555                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43556                 /* enable/disable utf8 encoding */
43557                 sha512_k;
43558
43559               /* privileged (public) methods */
43560               this.hex = function(s) {
43561                 return rstr2hex(rstr(s));
43562               };
43563               this.b64 = function(s) {
43564                 return rstr2b64(rstr(s), b64pad);
43565               };
43566               this.any = function(s, e) {
43567                 return rstr2any(rstr(s), e);
43568               };
43569               this.raw = function(s) {
43570                 return rstr(s);
43571               };
43572               this.hex_hmac = function(k, d) {
43573                 return rstr2hex(rstr_hmac(k, d));
43574               };
43575               this.b64_hmac = function(k, d) {
43576                 return rstr2b64(rstr_hmac(k, d), b64pad);
43577               };
43578               this.any_hmac = function(k, d, e) {
43579                 return rstr2any(rstr_hmac(k, d), e);
43580               };
43581               /**
43582                * Perform a simple self-test to see if the VM is working
43583                * @return {String} Hexadecimal hash sample
43584                * @public
43585                */
43586               this.vm_test = function() {
43587                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43588               };
43589               /**
43590                * @description Enable/disable uppercase hexadecimal returned string
43591                * @param {boolean}
43592                * @return {Object} this
43593                * @public
43594                */
43595               this.setUpperCase = function(a) {
43596                 if (typeof a === 'boolean') {
43597                   hexcase = a;
43598                 }
43599                 return this;
43600               };
43601               /**
43602                * @description Defines a base64 pad string
43603                * @param {string} Pad
43604                * @return {Object} this
43605                * @public
43606                */
43607               this.setPad = function(a) {
43608                 b64pad = a || b64pad;
43609                 return this;
43610               };
43611               /**
43612                * @description Defines a base64 pad string
43613                * @param {boolean}
43614                * @return {Object} this
43615                * @public
43616                */
43617               this.setUTF8 = function(a) {
43618                 if (typeof a === 'boolean') {
43619                   utf8 = a;
43620                 }
43621                 return this;
43622               };
43623
43624               /* private methods */
43625
43626               /**
43627                * Calculate the SHA-512 of a raw string
43628                */
43629
43630               function rstr(s) {
43631                 s = (utf8) ? utf8Encode(s) : s;
43632                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43633               }
43634               /*
43635                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
43636                */
43637
43638               function rstr_hmac(key, data) {
43639                 key = (utf8) ? utf8Encode(key) : key;
43640                 data = (utf8) ? utf8Encode(data) : data;
43641
43642                 var hash, i = 0,
43643                   bkey = rstr2binb(key),
43644                   ipad = Array(32),
43645                   opad = Array(32);
43646
43647                 if (bkey.length > 32) {
43648                   bkey = binb(bkey, key.length * 8);
43649                 }
43650
43651                 for (; i < 32; i += 1) {
43652                   ipad[i] = bkey[i] ^ 0x36363636;
43653                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43654                 }
43655
43656                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
43657                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
43658               }
43659
43660               /**
43661                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
43662                */
43663
43664               function binb(x, len) {
43665                 var j, i, l,
43666                   W = new Array(80),
43667                   hash = new Array(16),
43668                   //Initial hash values
43669                   H = [
43670                     new int64(0x6a09e667, -205731576),
43671                     new int64(-1150833019, -2067093701),
43672                     new int64(0x3c6ef372, -23791573),
43673                     new int64(-1521486534, 0x5f1d36f1),
43674                     new int64(0x510e527f, -1377402159),
43675                     new int64(-1694144372, 0x2b3e6c1f),
43676                     new int64(0x1f83d9ab, -79577749),
43677                     new int64(0x5be0cd19, 0x137e2179)
43678                   ],
43679                   T1 = new int64(0, 0),
43680                   T2 = new int64(0, 0),
43681                   a = new int64(0, 0),
43682                   b = new int64(0, 0),
43683                   c = new int64(0, 0),
43684                   d = new int64(0, 0),
43685                   e = new int64(0, 0),
43686                   f = new int64(0, 0),
43687                   g = new int64(0, 0),
43688                   h = new int64(0, 0),
43689                   //Temporary variables not specified by the document
43690                   s0 = new int64(0, 0),
43691                   s1 = new int64(0, 0),
43692                   Ch = new int64(0, 0),
43693                   Maj = new int64(0, 0),
43694                   r1 = new int64(0, 0),
43695                   r2 = new int64(0, 0),
43696                   r3 = new int64(0, 0);
43697
43698                 if (sha512_k === undefined) {
43699                   //SHA512 constants
43700                   sha512_k = [
43701                     new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
43702                     new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
43703                     new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
43704                     new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
43705                     new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
43706                     new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
43707                     new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
43708                     new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
43709                     new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
43710                     new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
43711                     new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
43712                     new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
43713                     new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
43714                     new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
43715                     new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
43716                     new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
43717                     new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
43718                     new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
43719                     new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
43720                     new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
43721                     new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
43722                     new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
43723                     new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
43724                     new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
43725                     new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
43726                     new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
43727                     new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
43728                     new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
43729                     new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
43730                     new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
43731                     new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
43732                     new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
43733                     new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
43734                     new int64(-354779690, -840897762), new int64(-176337025, -294727304),
43735                     new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
43736                     new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
43737                     new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
43738                     new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
43739                     new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
43740                     new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
43741                   ];
43742                 }
43743
43744                 for (i = 0; i < 80; i += 1) {
43745                   W[i] = new int64(0, 0);
43746                 }
43747
43748                 // append padding to the source string. The format is described in the FIPS.
43749                 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
43750                 x[((len + 128 >> 10) << 5) + 31] = len;
43751                 l = x.length;
43752                 for (i = 0; i < l; i += 32) { //32 dwords is the block size
43753                   int64copy(a, H[0]);
43754                   int64copy(b, H[1]);
43755                   int64copy(c, H[2]);
43756                   int64copy(d, H[3]);
43757                   int64copy(e, H[4]);
43758                   int64copy(f, H[5]);
43759                   int64copy(g, H[6]);
43760                   int64copy(h, H[7]);
43761
43762                   for (j = 0; j < 16; j += 1) {
43763                     W[j].h = x[i + 2 * j];
43764                     W[j].l = x[i + 2 * j + 1];
43765                   }
43766
43767                   for (j = 16; j < 80; j += 1) {
43768                     //sigma1
43769                     int64rrot(r1, W[j - 2], 19);
43770                     int64revrrot(r2, W[j - 2], 29);
43771                     int64shr(r3, W[j - 2], 6);
43772                     s1.l = r1.l ^ r2.l ^ r3.l;
43773                     s1.h = r1.h ^ r2.h ^ r3.h;
43774                     //sigma0
43775                     int64rrot(r1, W[j - 15], 1);
43776                     int64rrot(r2, W[j - 15], 8);
43777                     int64shr(r3, W[j - 15], 7);
43778                     s0.l = r1.l ^ r2.l ^ r3.l;
43779                     s0.h = r1.h ^ r2.h ^ r3.h;
43780
43781                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
43782                   }
43783
43784                   for (j = 0; j < 80; j += 1) {
43785                     //Ch
43786                     Ch.l = (e.l & f.l) ^ (~e.l & g.l);
43787                     Ch.h = (e.h & f.h) ^ (~e.h & g.h);
43788
43789                     //Sigma1
43790                     int64rrot(r1, e, 14);
43791                     int64rrot(r2, e, 18);
43792                     int64revrrot(r3, e, 9);
43793                     s1.l = r1.l ^ r2.l ^ r3.l;
43794                     s1.h = r1.h ^ r2.h ^ r3.h;
43795
43796                     //Sigma0
43797                     int64rrot(r1, a, 28);
43798                     int64revrrot(r2, a, 2);
43799                     int64revrrot(r3, a, 7);
43800                     s0.l = r1.l ^ r2.l ^ r3.l;
43801                     s0.h = r1.h ^ r2.h ^ r3.h;
43802
43803                     //Maj
43804                     Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
43805                     Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
43806
43807                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
43808                     int64add(T2, s0, Maj);
43809
43810                     int64copy(h, g);
43811                     int64copy(g, f);
43812                     int64copy(f, e);
43813                     int64add(e, d, T1);
43814                     int64copy(d, c);
43815                     int64copy(c, b);
43816                     int64copy(b, a);
43817                     int64add(a, T1, T2);
43818                   }
43819                   int64add(H[0], H[0], a);
43820                   int64add(H[1], H[1], b);
43821                   int64add(H[2], H[2], c);
43822                   int64add(H[3], H[3], d);
43823                   int64add(H[4], H[4], e);
43824                   int64add(H[5], H[5], f);
43825                   int64add(H[6], H[6], g);
43826                   int64add(H[7], H[7], h);
43827                 }
43828
43829                 //represent the hash as an array of 32-bit dwords
43830                 for (i = 0; i < 8; i += 1) {
43831                   hash[2 * i] = H[i].h;
43832                   hash[2 * i + 1] = H[i].l;
43833                 }
43834                 return hash;
43835               }
43836
43837               //A constructor for 64-bit numbers
43838
43839               function int64(h, l) {
43840                 this.h = h;
43841                 this.l = l;
43842                 //this.toString = int64toString;
43843               }
43844
43845               //Copies src into dst, assuming both are 64-bit numbers
43846
43847               function int64copy(dst, src) {
43848                 dst.h = src.h;
43849                 dst.l = src.l;
43850               }
43851
43852               //Right-rotates a 64-bit number by shift
43853               //Won't handle cases of shift>=32
43854               //The function revrrot() is for that
43855
43856               function int64rrot(dst, x, shift) {
43857                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43858                 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
43859               }
43860
43861               //Reverses the dwords of the source and then rotates right by shift.
43862               //This is equivalent to rotation by 32+shift
43863
43864               function int64revrrot(dst, x, shift) {
43865                 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
43866                 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
43867               }
43868
43869               //Bitwise-shifts right a 64-bit number by shift
43870               //Won't handle shift>=32, but it's never needed in SHA512
43871
43872               function int64shr(dst, x, shift) {
43873                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43874                 dst.h = (x.h >>> shift);
43875               }
43876
43877               //Adds two 64-bit numbers
43878               //Like the original implementation, does not rely on 32-bit operations
43879
43880               function int64add(dst, x, y) {
43881                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
43882                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
43883                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
43884                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
43885                 dst.l = (w0 & 0xffff) | (w1 << 16);
43886                 dst.h = (w2 & 0xffff) | (w3 << 16);
43887               }
43888
43889               //Same, except with 4 addends. Works faster than adding them one by one.
43890
43891               function int64add4(dst, a, b, c, d) {
43892                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
43893                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
43894                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
43895                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
43896                 dst.l = (w0 & 0xffff) | (w1 << 16);
43897                 dst.h = (w2 & 0xffff) | (w3 << 16);
43898               }
43899
43900               //Same, except with 5 addends
43901
43902               function int64add5(dst, a, b, c, d, e) {
43903                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
43904                   w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
43905                   w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
43906                   w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
43907                 dst.l = (w0 & 0xffff) | (w1 << 16);
43908                 dst.h = (w2 & 0xffff) | (w3 << 16);
43909               }
43910             },
43911             /**
43912              * @class Hashes.RMD160
43913              * @constructor
43914              * @param {Object} [config]
43915              *
43916              * A JavaScript implementation of the RIPEMD-160 Algorithm
43917              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
43918              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43919              * See http://pajhome.org.uk/crypt/md5 for details.
43920              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
43921              */
43922             RMD160: function(options) {
43923               /**
43924                * Private properties configuration variables. You may need to tweak these to be compatible with
43925                * the server-side, but the defaults work in most cases.
43926                * @see this.setUpperCase() method
43927                * @see this.setPad() method
43928                */
43929               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43930                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43931                 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
43932                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43933                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43934                 /* enable/disable utf8 encoding */
43935                 rmd160_r1 = [
43936                   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
43937                   7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
43938                   3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
43939                   1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
43940                   4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
43941                 ],
43942                 rmd160_r2 = [
43943                   5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
43944                   6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
43945                   15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
43946                   8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
43947                   12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
43948                 ],
43949                 rmd160_s1 = [
43950                   11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
43951                   7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
43952                   11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
43953                   11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
43954                   9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
43955                 ],
43956                 rmd160_s2 = [
43957                   8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
43958                   9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
43959                   9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
43960                   15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
43961                   8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
43962                 ];
43963
43964               /* privileged (public) methods */
43965               this.hex = function(s) {
43966                 return rstr2hex(rstr(s));
43967               };
43968               this.b64 = function(s) {
43969                 return rstr2b64(rstr(s), b64pad);
43970               };
43971               this.any = function(s, e) {
43972                 return rstr2any(rstr(s), e);
43973               };
43974               this.raw = function(s) {
43975                 return rstr(s);
43976               };
43977               this.hex_hmac = function(k, d) {
43978                 return rstr2hex(rstr_hmac(k, d));
43979               };
43980               this.b64_hmac = function(k, d) {
43981                 return rstr2b64(rstr_hmac(k, d), b64pad);
43982               };
43983               this.any_hmac = function(k, d, e) {
43984                 return rstr2any(rstr_hmac(k, d), e);
43985               };
43986               /**
43987                * Perform a simple self-test to see if the VM is working
43988                * @return {String} Hexadecimal hash sample
43989                * @public
43990                */
43991               this.vm_test = function() {
43992                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43993               };
43994               /**
43995                * @description Enable/disable uppercase hexadecimal returned string
43996                * @param {boolean}
43997                * @return {Object} this
43998                * @public
43999                */
44000               this.setUpperCase = function(a) {
44001                 if (typeof a === 'boolean') {
44002                   hexcase = a;
44003                 }
44004                 return this;
44005               };
44006               /**
44007                * @description Defines a base64 pad string
44008                * @param {string} Pad
44009                * @return {Object} this
44010                * @public
44011                */
44012               this.setPad = function(a) {
44013                 if (typeof a !== 'undefined') {
44014                   b64pad = a;
44015                 }
44016                 return this;
44017               };
44018               /**
44019                * @description Defines a base64 pad string
44020                * @param {boolean}
44021                * @return {Object} this
44022                * @public
44023                */
44024               this.setUTF8 = function(a) {
44025                 if (typeof a === 'boolean') {
44026                   utf8 = a;
44027                 }
44028                 return this;
44029               };
44030
44031               /* private methods */
44032
44033               /**
44034                * Calculate the rmd160 of a raw string
44035                */
44036
44037               function rstr(s) {
44038                 s = (utf8) ? utf8Encode(s) : s;
44039                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
44040               }
44041
44042               /**
44043                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
44044                */
44045
44046               function rstr_hmac(key, data) {
44047                 key = (utf8) ? utf8Encode(key) : key;
44048                 data = (utf8) ? utf8Encode(data) : data;
44049                 var i, hash,
44050                   bkey = rstr2binl(key),
44051                   ipad = Array(16),
44052                   opad = Array(16);
44053
44054                 if (bkey.length > 16) {
44055                   bkey = binl(bkey, key.length * 8);
44056                 }
44057
44058                 for (i = 0; i < 16; i += 1) {
44059                   ipad[i] = bkey[i] ^ 0x36363636;
44060                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
44061                 }
44062                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
44063                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
44064               }
44065
44066               /**
44067                * Convert an array of little-endian words to a string
44068                */
44069
44070               function binl2rstr(input) {
44071                 var i, output = '',
44072                   l = input.length * 32;
44073                 for (i = 0; i < l; i += 8) {
44074                   output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
44075                 }
44076                 return output;
44077               }
44078
44079               /**
44080                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
44081                */
44082
44083               function binl(x, len) {
44084                 var T, j, i, l,
44085                   h0 = 0x67452301,
44086                   h1 = 0xefcdab89,
44087                   h2 = 0x98badcfe,
44088                   h3 = 0x10325476,
44089                   h4 = 0xc3d2e1f0,
44090                   A1, B1, C1, D1, E1,
44091                   A2, B2, C2, D2, E2;
44092
44093                 /* append padding */
44094                 x[len >> 5] |= 0x80 << (len % 32);
44095                 x[(((len + 64) >>> 9) << 4) + 14] = len;
44096                 l = x.length;
44097
44098                 for (i = 0; i < l; i += 16) {
44099                   A1 = A2 = h0;
44100                   B1 = B2 = h1;
44101                   C1 = C2 = h2;
44102                   D1 = D2 = h3;
44103                   E1 = E2 = h4;
44104                   for (j = 0; j <= 79; j += 1) {
44105                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
44106                     T = safe_add(T, x[i + rmd160_r1[j]]);
44107                     T = safe_add(T, rmd160_K1(j));
44108                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
44109                     A1 = E1;
44110                     E1 = D1;
44111                     D1 = bit_rol(C1, 10);
44112                     C1 = B1;
44113                     B1 = T;
44114                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
44115                     T = safe_add(T, x[i + rmd160_r2[j]]);
44116                     T = safe_add(T, rmd160_K2(j));
44117                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
44118                     A2 = E2;
44119                     E2 = D2;
44120                     D2 = bit_rol(C2, 10);
44121                     C2 = B2;
44122                     B2 = T;
44123                   }
44124
44125                   T = safe_add(h1, safe_add(C1, D2));
44126                   h1 = safe_add(h2, safe_add(D1, E2));
44127                   h2 = safe_add(h3, safe_add(E1, A2));
44128                   h3 = safe_add(h4, safe_add(A1, B2));
44129                   h4 = safe_add(h0, safe_add(B1, C2));
44130                   h0 = T;
44131                 }
44132                 return [h0, h1, h2, h3, h4];
44133               }
44134
44135               // specific algorithm methods
44136
44137               function rmd160_f(j, x, y, z) {
44138                 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
44139                   (16 <= j && j <= 31) ? (x & y) | (~x & z) :
44140                   (32 <= j && j <= 47) ? (x | ~y) ^ z :
44141                   (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
44142                   (64 <= j && j <= 79) ? x ^ (y | ~z) :
44143                   'rmd160_f: j out of range';
44144               }
44145
44146               function rmd160_K1(j) {
44147                 return (0 <= j && j <= 15) ? 0x00000000 :
44148                   (16 <= j && j <= 31) ? 0x5a827999 :
44149                   (32 <= j && j <= 47) ? 0x6ed9eba1 :
44150                   (48 <= j && j <= 63) ? 0x8f1bbcdc :
44151                   (64 <= j && j <= 79) ? 0xa953fd4e :
44152                   'rmd160_K1: j out of range';
44153               }
44154
44155               function rmd160_K2(j) {
44156                 return (0 <= j && j <= 15) ? 0x50a28be6 :
44157                   (16 <= j && j <= 31) ? 0x5c4dd124 :
44158                   (32 <= j && j <= 47) ? 0x6d703ef3 :
44159                   (48 <= j && j <= 63) ? 0x7a6d76e9 :
44160                   (64 <= j && j <= 79) ? 0x00000000 :
44161                   'rmd160_K2: j out of range';
44162               }
44163             }
44164           };
44165
44166           // exposes Hashes
44167           (function(window, undefined$1) {
44168             var freeExports = false;
44169             {
44170               freeExports = exports;
44171               if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
44172                 window = commonjsGlobal;
44173               }
44174             }
44175
44176             if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
44177               // define as an anonymous module, so, through path mapping, it can be aliased
44178               undefined$1(function() {
44179                 return Hashes;
44180               });
44181             } else if (freeExports) {
44182               // in Node.js or RingoJS v0.8.0+
44183               if (module && module.exports === freeExports) {
44184                 module.exports = Hashes;
44185               }
44186               // in Narwhal or RingoJS v0.7.0-
44187               else {
44188                 freeExports.Hashes = Hashes;
44189               }
44190             } else {
44191               // in a browser or Rhino
44192               window.Hashes = Hashes;
44193             }
44194           }(this));
44195         }()); // IIFE
44196         });
44197
44198         var immutable = extend$2;
44199
44200         var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
44201
44202         function extend$2() {
44203             var target = {};
44204
44205             for (var i = 0; i < arguments.length; i++) {
44206                 var source = arguments[i];
44207
44208                 for (var key in source) {
44209                     if (hasOwnProperty$2.call(source, key)) {
44210                         target[key] = source[key];
44211                     }
44212                 }
44213             }
44214
44215             return target
44216         }
44217
44218         var sha1 = new hashes.SHA1();
44219
44220         var ohauth = {};
44221
44222         ohauth.qsString = function(obj) {
44223             return Object.keys(obj).sort().map(function(key) {
44224                 return ohauth.percentEncode(key) + '=' +
44225                     ohauth.percentEncode(obj[key]);
44226             }).join('&');
44227         };
44228
44229         ohauth.stringQs = function(str) {
44230             return str.split('&').filter(function (pair) {
44231                 return pair !== '';
44232             }).reduce(function(obj, pair){
44233                 var parts = pair.split('=');
44234                 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
44235                     '' : decodeURIComponent(parts[1]);
44236                 return obj;
44237             }, {});
44238         };
44239
44240         ohauth.rawxhr = function(method, url, data, headers, callback) {
44241             var xhr = new XMLHttpRequest(),
44242                 twoHundred = /^20\d$/;
44243             xhr.onreadystatechange = function() {
44244                 if (4 === xhr.readyState && 0 !== xhr.status) {
44245                     if (twoHundred.test(xhr.status)) callback(null, xhr);
44246                     else return callback(xhr, null);
44247                 }
44248             };
44249             xhr.onerror = function(e) { return callback(e, null); };
44250             xhr.open(method, url, true);
44251             for (var h in headers) xhr.setRequestHeader(h, headers[h]);
44252             xhr.send(data);
44253             return xhr;
44254         };
44255
44256         ohauth.xhr = function(method, url, auth, data, options, callback) {
44257             var headers = (options && options.header) || {
44258                 'Content-Type': 'application/x-www-form-urlencoded'
44259             };
44260             headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
44261             return ohauth.rawxhr(method, url, data, headers, callback);
44262         };
44263
44264         ohauth.nonce = function() {
44265             for (var o = ''; o.length < 6;) {
44266                 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
44267             }
44268             return o;
44269         };
44270
44271         ohauth.authHeader = function(obj) {
44272             return Object.keys(obj).sort().map(function(key) {
44273                 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
44274             }).join(', ');
44275         };
44276
44277         ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
44278
44279         ohauth.percentEncode = function(s) {
44280             return encodeURIComponent(s)
44281                 .replace(/\!/g, '%21').replace(/\'/g, '%27')
44282                 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
44283         };
44284
44285         ohauth.baseString = function(method, url, params) {
44286             if (params.oauth_signature) delete params.oauth_signature;
44287             return [
44288                 method,
44289                 ohauth.percentEncode(url),
44290                 ohauth.percentEncode(ohauth.qsString(params))].join('&');
44291         };
44292
44293         ohauth.signature = function(oauth_secret, token_secret, baseString) {
44294             return sha1.b64_hmac(
44295                 ohauth.percentEncode(oauth_secret) + '&' +
44296                 ohauth.percentEncode(token_secret),
44297                 baseString);
44298         };
44299
44300         /**
44301          * Takes an options object for configuration (consumer_key,
44302          * consumer_secret, version, signature_method, token, token_secret)
44303          * and returns a function that generates the Authorization header
44304          * for given data.
44305          *
44306          * The returned function takes these parameters:
44307          * - method: GET/POST/...
44308          * - uri: full URI with protocol, port, path and query string
44309          * - extra_params: any extra parameters (that are passed in the POST data),
44310          *   can be an object or a from-urlencoded string.
44311          *
44312          * Returned function returns full OAuth header with "OAuth" string in it.
44313          */
44314
44315         ohauth.headerGenerator = function(options) {
44316             options = options || {};
44317             var consumer_key = options.consumer_key || '',
44318                 consumer_secret = options.consumer_secret || '',
44319                 signature_method = options.signature_method || 'HMAC-SHA1',
44320                 version = options.version || '1.0',
44321                 token = options.token || '',
44322                 token_secret = options.token_secret || '';
44323
44324             return function(method, uri, extra_params) {
44325                 method = method.toUpperCase();
44326                 if (typeof extra_params === 'string' && extra_params.length > 0) {
44327                     extra_params = ohauth.stringQs(extra_params);
44328                 }
44329
44330                 var uri_parts = uri.split('?', 2),
44331                 base_uri = uri_parts[0];
44332
44333                 var query_params = uri_parts.length === 2 ?
44334                     ohauth.stringQs(uri_parts[1]) : {};
44335
44336                 var oauth_params = {
44337                     oauth_consumer_key: consumer_key,
44338                     oauth_signature_method: signature_method,
44339                     oauth_version: version,
44340                     oauth_timestamp: ohauth.timestamp(),
44341                     oauth_nonce: ohauth.nonce()
44342                 };
44343
44344                 if (token) oauth_params.oauth_token = token;
44345
44346                 var all_params = immutable({}, oauth_params, query_params, extra_params),
44347                     base_str = ohauth.baseString(method, base_uri, all_params);
44348
44349                 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
44350
44351                 return 'OAuth ' + ohauth.authHeader(oauth_params);
44352             };
44353         };
44354
44355         var ohauth_1 = ohauth;
44356
44357         var resolveUrl = createCommonjsModule(function (module, exports) {
44358         // Copyright 2014 Simon Lydell
44359         // X11 (“MIT”) Licensed. (See LICENSE.)
44360
44361         void (function(root, factory) {
44362           {
44363             module.exports = factory();
44364           }
44365         }(commonjsGlobal, function() {
44366
44367           function resolveUrl(/* ...urls */) {
44368             var numUrls = arguments.length;
44369
44370             if (numUrls === 0) {
44371               throw new Error("resolveUrl requires at least one argument; got none.")
44372             }
44373
44374             var base = document.createElement("base");
44375             base.href = arguments[0];
44376
44377             if (numUrls === 1) {
44378               return base.href
44379             }
44380
44381             var head = document.getElementsByTagName("head")[0];
44382             head.insertBefore(base, head.firstChild);
44383
44384             var a = document.createElement("a");
44385             var resolved;
44386
44387             for (var index = 1; index < numUrls; index++) {
44388               a.href = arguments[index];
44389               resolved = a.href;
44390               base.href = resolved;
44391             }
44392
44393             head.removeChild(base);
44394
44395             return resolved
44396           }
44397
44398           return resolveUrl
44399
44400         }));
44401         });
44402
44403         var assign$2 = make_assign();
44404         var create$7 = make_create();
44405         var trim$1 = make_trim();
44406         var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
44407
44408         var util = {
44409                 assign: assign$2,
44410                 create: create$7,
44411                 trim: trim$1,
44412                 bind: bind$3,
44413                 slice: slice$b,
44414                 each: each,
44415                 map: map$5,
44416                 pluck: pluck,
44417                 isList: isList,
44418                 isFunction: isFunction$2,
44419                 isObject: isObject$2,
44420                 Global: Global
44421         };
44422
44423         function make_assign() {
44424                 if (Object.assign) {
44425                         return Object.assign
44426                 } else {
44427                         return function shimAssign(obj, props1, props2, etc) {
44428                                 for (var i = 1; i < arguments.length; i++) {
44429                                         each(Object(arguments[i]), function(val, key) {
44430                                                 obj[key] = val;
44431                                         });
44432                                 }                       
44433                                 return obj
44434                         }
44435                 }
44436         }
44437
44438         function make_create() {
44439                 if (Object.create) {
44440                         return function create(obj, assignProps1, assignProps2, etc) {
44441                                 var assignArgsList = slice$b(arguments, 1);
44442                                 return assign$2.apply(this, [Object.create(obj)].concat(assignArgsList))
44443                         }
44444                 } else {
44445                         function F() {} // eslint-disable-line no-inner-declarations
44446                         return function create(obj, assignProps1, assignProps2, etc) {
44447                                 var assignArgsList = slice$b(arguments, 1);
44448                                 F.prototype = obj;
44449                                 return assign$2.apply(this, [new F()].concat(assignArgsList))
44450                         }
44451                 }
44452         }
44453
44454         function make_trim() {
44455                 if (String.prototype.trim) {
44456                         return function trim(str) {
44457                                 return String.prototype.trim.call(str)
44458                         }
44459                 } else {
44460                         return function trim(str) {
44461                                 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
44462                         }
44463                 }
44464         }
44465
44466         function bind$3(obj, fn) {
44467                 return function() {
44468                         return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
44469                 }
44470         }
44471
44472         function slice$b(arr, index) {
44473                 return Array.prototype.slice.call(arr, index || 0)
44474         }
44475
44476         function each(obj, fn) {
44477                 pluck(obj, function(val, key) {
44478                         fn(val, key);
44479                         return false
44480                 });
44481         }
44482
44483         function map$5(obj, fn) {
44484                 var res = (isList(obj) ? [] : {});
44485                 pluck(obj, function(v, k) {
44486                         res[k] = fn(v, k);
44487                         return false
44488                 });
44489                 return res
44490         }
44491
44492         function pluck(obj, fn) {
44493                 if (isList(obj)) {
44494                         for (var i=0; i<obj.length; i++) {
44495                                 if (fn(obj[i], i)) {
44496                                         return obj[i]
44497                                 }
44498                         }
44499                 } else {
44500                         for (var key in obj) {
44501                                 if (obj.hasOwnProperty(key)) {
44502                                         if (fn(obj[key], key)) {
44503                                                 return obj[key]
44504                                         }
44505                                 }
44506                         }
44507                 }
44508         }
44509
44510         function isList(val) {
44511                 return (val != null && typeof val != 'function' && typeof val.length == 'number')
44512         }
44513
44514         function isFunction$2(val) {
44515                 return val && {}.toString.call(val) === '[object Function]'
44516         }
44517
44518         function isObject$2(val) {
44519                 return val && {}.toString.call(val) === '[object Object]'
44520         }
44521
44522         var slice$c = util.slice;
44523         var pluck$1 = util.pluck;
44524         var each$1 = util.each;
44525         var bind$4 = util.bind;
44526         var create$8 = util.create;
44527         var isList$1 = util.isList;
44528         var isFunction$3 = util.isFunction;
44529         var isObject$3 = util.isObject;
44530
44531         var storeEngine = {
44532                 createStore: createStore
44533         };
44534
44535         var storeAPI = {
44536                 version: '2.0.12',
44537                 enabled: false,
44538                 
44539                 // get returns the value of the given key. If that value
44540                 // is undefined, it returns optionalDefaultValue instead.
44541                 get: function(key, optionalDefaultValue) {
44542                         var data = this.storage.read(this._namespacePrefix + key);
44543                         return this._deserialize(data, optionalDefaultValue)
44544                 },
44545
44546                 // set will store the given value at key and returns value.
44547                 // Calling set with value === undefined is equivalent to calling remove.
44548                 set: function(key, value) {
44549                         if (value === undefined) {
44550                                 return this.remove(key)
44551                         }
44552                         this.storage.write(this._namespacePrefix + key, this._serialize(value));
44553                         return value
44554                 },
44555
44556                 // remove deletes the key and value stored at the given key.
44557                 remove: function(key) {
44558                         this.storage.remove(this._namespacePrefix + key);
44559                 },
44560
44561                 // each will call the given callback once for each key-value pair
44562                 // in this store.
44563                 each: function(callback) {
44564                         var self = this;
44565                         this.storage.each(function(val, namespacedKey) {
44566                                 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
44567                         });
44568                 },
44569
44570                 // clearAll will remove all the stored key-value pairs in this store.
44571                 clearAll: function() {
44572                         this.storage.clearAll();
44573                 },
44574
44575                 // additional functionality that can't live in plugins
44576                 // ---------------------------------------------------
44577
44578                 // hasNamespace returns true if this store instance has the given namespace.
44579                 hasNamespace: function(namespace) {
44580                         return (this._namespacePrefix == '__storejs_'+namespace+'_')
44581                 },
44582
44583                 // createStore creates a store.js instance with the first
44584                 // functioning storage in the list of storage candidates,
44585                 // and applies the the given mixins to the instance.
44586                 createStore: function() {
44587                         return createStore.apply(this, arguments)
44588                 },
44589                 
44590                 addPlugin: function(plugin) {
44591                         this._addPlugin(plugin);
44592                 },
44593                 
44594                 namespace: function(namespace) {
44595                         return createStore(this.storage, this.plugins, namespace)
44596                 }
44597         };
44598
44599         function _warn() {
44600                 var _console = (typeof console == 'undefined' ? null : console);
44601                 if (!_console) { return }
44602                 var fn = (_console.warn ? _console.warn : _console.log);
44603                 fn.apply(_console, arguments);
44604         }
44605
44606         function createStore(storages, plugins, namespace) {
44607                 if (!namespace) {
44608                         namespace = '';
44609                 }
44610                 if (storages && !isList$1(storages)) {
44611                         storages = [storages];
44612                 }
44613                 if (plugins && !isList$1(plugins)) {
44614                         plugins = [plugins];
44615                 }
44616
44617                 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
44618                 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
44619                 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
44620                 if (!legalNamespaces.test(namespace)) {
44621                         throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
44622                 }
44623                 
44624                 var _privateStoreProps = {
44625                         _namespacePrefix: namespacePrefix,
44626                         _namespaceRegexp: namespaceRegexp,
44627
44628                         _testStorage: function(storage) {
44629                                 try {
44630                                         var testStr = '__storejs__test__';
44631                                         storage.write(testStr, testStr);
44632                                         var ok = (storage.read(testStr) === testStr);
44633                                         storage.remove(testStr);
44634                                         return ok
44635                                 } catch(e) {
44636                                         return false
44637                                 }
44638                         },
44639
44640                         _assignPluginFnProp: function(pluginFnProp, propName) {
44641                                 var oldFn = this[propName];
44642                                 this[propName] = function pluginFn() {
44643                                         var args = slice$c(arguments, 0);
44644                                         var self = this;
44645
44646                                         // super_fn calls the old function which was overwritten by
44647                                         // this mixin.
44648                                         function super_fn() {
44649                                                 if (!oldFn) { return }
44650                                                 each$1(arguments, function(arg, i) {
44651                                                         args[i] = arg;
44652                                                 });
44653                                                 return oldFn.apply(self, args)
44654                                         }
44655
44656                                         // Give mixing function access to super_fn by prefixing all mixin function
44657                                         // arguments with super_fn.
44658                                         var newFnArgs = [super_fn].concat(args);
44659
44660                                         return pluginFnProp.apply(self, newFnArgs)
44661                                 };
44662                         },
44663
44664                         _serialize: function(obj) {
44665                                 return JSON.stringify(obj)
44666                         },
44667
44668                         _deserialize: function(strVal, defaultVal) {
44669                                 if (!strVal) { return defaultVal }
44670                                 // It is possible that a raw string value has been previously stored
44671                                 // in a storage without using store.js, meaning it will be a raw
44672                                 // string value instead of a JSON serialized string. By defaulting
44673                                 // to the raw string value in case of a JSON parse error, we allow
44674                                 // for past stored values to be forwards-compatible with store.js
44675                                 var val = '';
44676                                 try { val = JSON.parse(strVal); }
44677                                 catch(e) { val = strVal; }
44678
44679                                 return (val !== undefined ? val : defaultVal)
44680                         },
44681                         
44682                         _addStorage: function(storage) {
44683                                 if (this.enabled) { return }
44684                                 if (this._testStorage(storage)) {
44685                                         this.storage = storage;
44686                                         this.enabled = true;
44687                                 }
44688                         },
44689
44690                         _addPlugin: function(plugin) {
44691                                 var self = this;
44692
44693                                 // If the plugin is an array, then add all plugins in the array.
44694                                 // This allows for a plugin to depend on other plugins.
44695                                 if (isList$1(plugin)) {
44696                                         each$1(plugin, function(plugin) {
44697                                                 self._addPlugin(plugin);
44698                                         });
44699                                         return
44700                                 }
44701
44702                                 // Keep track of all plugins we've seen so far, so that we
44703                                 // don't add any of them twice.
44704                                 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
44705                                         return (plugin === seenPlugin)
44706                                 });
44707                                 if (seenPlugin) {
44708                                         return
44709                                 }
44710                                 this.plugins.push(plugin);
44711
44712                                 // Check that the plugin is properly formed
44713                                 if (!isFunction$3(plugin)) {
44714                                         throw new Error('Plugins must be function values that return objects')
44715                                 }
44716
44717                                 var pluginProperties = plugin.call(this);
44718                                 if (!isObject$3(pluginProperties)) {
44719                                         throw new Error('Plugins must return an object of function properties')
44720                                 }
44721
44722                                 // Add the plugin function properties to this store instance.
44723                                 each$1(pluginProperties, function(pluginFnProp, propName) {
44724                                         if (!isFunction$3(pluginFnProp)) {
44725                                                 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
44726                                         }
44727                                         self._assignPluginFnProp(pluginFnProp, propName);
44728                                 });
44729                         },
44730                         
44731                         // Put deprecated properties in the private API, so as to not expose it to accidential
44732                         // discovery through inspection of the store object.
44733                         
44734                         // Deprecated: addStorage
44735                         addStorage: function(storage) {
44736                                 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
44737                                 this._addStorage(storage);
44738                         }
44739                 };
44740
44741                 var store = create$8(_privateStoreProps, storeAPI, {
44742                         plugins: []
44743                 });
44744                 store.raw = {};
44745                 each$1(store, function(prop, propName) {
44746                         if (isFunction$3(prop)) {
44747                                 store.raw[propName] = bind$4(store, prop);                      
44748                         }
44749                 });
44750                 each$1(storages, function(storage) {
44751                         store._addStorage(storage);
44752                 });
44753                 each$1(plugins, function(plugin) {
44754                         store._addPlugin(plugin);
44755                 });
44756                 return store
44757         }
44758
44759         var Global$1 = util.Global;
44760
44761         var localStorage_1 = {
44762                 name: 'localStorage',
44763                 read: read,
44764                 write: write,
44765                 each: each$2,
44766                 remove: remove$2,
44767                 clearAll: clearAll,
44768         };
44769
44770         function localStorage$1() {
44771                 return Global$1.localStorage
44772         }
44773
44774         function read(key) {
44775                 return localStorage$1().getItem(key)
44776         }
44777
44778         function write(key, data) {
44779                 return localStorage$1().setItem(key, data)
44780         }
44781
44782         function each$2(fn) {
44783                 for (var i = localStorage$1().length - 1; i >= 0; i--) {
44784                         var key = localStorage$1().key(i);
44785                         fn(read(key), key);
44786                 }
44787         }
44788
44789         function remove$2(key) {
44790                 return localStorage$1().removeItem(key)
44791         }
44792
44793         function clearAll() {
44794                 return localStorage$1().clear()
44795         }
44796
44797         // oldFF-globalStorage provides storage for Firefox
44798         // versions 6 and 7, where no localStorage, etc
44799         // is available.
44800
44801
44802         var Global$2 = util.Global;
44803
44804         var oldFFGlobalStorage = {
44805                 name: 'oldFF-globalStorage',
44806                 read: read$1,
44807                 write: write$1,
44808                 each: each$3,
44809                 remove: remove$3,
44810                 clearAll: clearAll$1,
44811         };
44812
44813         var globalStorage = Global$2.globalStorage;
44814
44815         function read$1(key) {
44816                 return globalStorage[key]
44817         }
44818
44819         function write$1(key, data) {
44820                 globalStorage[key] = data;
44821         }
44822
44823         function each$3(fn) {
44824                 for (var i = globalStorage.length - 1; i >= 0; i--) {
44825                         var key = globalStorage.key(i);
44826                         fn(globalStorage[key], key);
44827                 }
44828         }
44829
44830         function remove$3(key) {
44831                 return globalStorage.removeItem(key)
44832         }
44833
44834         function clearAll$1() {
44835                 each$3(function(key, _) {
44836                         delete globalStorage[key];
44837                 });
44838         }
44839
44840         // oldIE-userDataStorage provides storage for Internet Explorer
44841         // versions 6 and 7, where no localStorage, sessionStorage, etc
44842         // is available.
44843
44844
44845         var Global$3 = util.Global;
44846
44847         var oldIEUserDataStorage = {
44848                 name: 'oldIE-userDataStorage',
44849                 write: write$2,
44850                 read: read$2,
44851                 each: each$4,
44852                 remove: remove$4,
44853                 clearAll: clearAll$2,
44854         };
44855
44856         var storageName = 'storejs';
44857         var doc = Global$3.document;
44858         var _withStorageEl = _makeIEStorageElFunction();
44859         var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
44860
44861         function write$2(unfixedKey, data) {
44862                 if (disable) { return }
44863                 var fixedKey = fixKey(unfixedKey);
44864                 _withStorageEl(function(storageEl) {
44865                         storageEl.setAttribute(fixedKey, data);
44866                         storageEl.save(storageName);
44867                 });
44868         }
44869
44870         function read$2(unfixedKey) {
44871                 if (disable) { return }
44872                 var fixedKey = fixKey(unfixedKey);
44873                 var res = null;
44874                 _withStorageEl(function(storageEl) {
44875                         res = storageEl.getAttribute(fixedKey);
44876                 });
44877                 return res
44878         }
44879
44880         function each$4(callback) {
44881                 _withStorageEl(function(storageEl) {
44882                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44883                         for (var i=attributes.length-1; i>=0; i--) {
44884                                 var attr = attributes[i];
44885                                 callback(storageEl.getAttribute(attr.name), attr.name);
44886                         }
44887                 });
44888         }
44889
44890         function remove$4(unfixedKey) {
44891                 var fixedKey = fixKey(unfixedKey);
44892                 _withStorageEl(function(storageEl) {
44893                         storageEl.removeAttribute(fixedKey);
44894                         storageEl.save(storageName);
44895                 });
44896         }
44897
44898         function clearAll$2() {
44899                 _withStorageEl(function(storageEl) {
44900                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44901                         storageEl.load(storageName);
44902                         for (var i=attributes.length-1; i>=0; i--) {
44903                                 storageEl.removeAttribute(attributes[i].name);
44904                         }
44905                         storageEl.save(storageName);
44906                 });
44907         }
44908
44909         // Helpers
44910         //////////
44911
44912         // In IE7, keys cannot start with a digit or contain certain chars.
44913         // See https://github.com/marcuswestin/store.js/issues/40
44914         // See https://github.com/marcuswestin/store.js/issues/83
44915         var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
44916         function fixKey(key) {
44917                 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
44918         }
44919
44920         function _makeIEStorageElFunction() {
44921                 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
44922                         return null
44923                 }
44924                 var scriptTag = 'script',
44925                         storageOwner,
44926                         storageContainer,
44927                         storageEl;
44928
44929                 // Since #userData storage applies only to specific paths, we need to
44930                 // somehow link our data to a specific path.  We choose /favicon.ico
44931                 // as a pretty safe option, since all browsers already make a request to
44932                 // this URL anyway and being a 404 will not hurt us here.  We wrap an
44933                 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
44934                 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
44935                 // since the iframe access rules appear to allow direct access and
44936                 // manipulation of the document element, even for a 404 page.  This
44937                 // document can be used instead of the current document (which would
44938                 // have been limited to the current path) to perform #userData storage.
44939                 try {
44940                         /* global ActiveXObject */
44941                         storageContainer = new ActiveXObject('htmlfile');
44942                         storageContainer.open();
44943                         storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
44944                         storageContainer.close();
44945                         storageOwner = storageContainer.w.frames[0].document;
44946                         storageEl = storageOwner.createElement('div');
44947                 } catch(e) {
44948                         // somehow ActiveXObject instantiation failed (perhaps some special
44949                         // security settings or otherwse), fall back to per-path storage
44950                         storageEl = doc.createElement('div');
44951                         storageOwner = doc.body;
44952                 }
44953
44954                 return function(storeFunction) {
44955                         var args = [].slice.call(arguments, 0);
44956                         args.unshift(storageEl);
44957                         // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
44958                         // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
44959                         storageOwner.appendChild(storageEl);
44960                         storageEl.addBehavior('#default#userData');
44961                         storageEl.load(storageName);
44962                         storeFunction.apply(this, args);
44963                         storageOwner.removeChild(storageEl);
44964                         return
44965                 }
44966         }
44967
44968         // cookieStorage is useful Safari private browser mode, where localStorage
44969         // doesn't work but cookies do. This implementation is adopted from
44970         // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
44971
44972
44973         var Global$4 = util.Global;
44974         var trim$2 = util.trim;
44975
44976         var cookieStorage = {
44977                 name: 'cookieStorage',
44978                 read: read$3,
44979                 write: write$3,
44980                 each: each$5,
44981                 remove: remove$5,
44982                 clearAll: clearAll$3,
44983         };
44984
44985         var doc$1 = Global$4.document;
44986
44987         function read$3(key) {
44988                 if (!key || !_has(key)) { return null }
44989                 var regexpStr = "(?:^|.*;\\s*)" +
44990                         escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
44991                         "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
44992                 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
44993         }
44994
44995         function each$5(callback) {
44996                 var cookies = doc$1.cookie.split(/; ?/g);
44997                 for (var i = cookies.length - 1; i >= 0; i--) {
44998                         if (!trim$2(cookies[i])) {
44999                                 continue
45000                         }
45001                         var kvp = cookies[i].split('=');
45002                         var key = unescape(kvp[0]);
45003                         var val = unescape(kvp[1]);
45004                         callback(val, key);
45005                 }
45006         }
45007
45008         function write$3(key, data) {
45009                 if(!key) { return }
45010                 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
45011         }
45012
45013         function remove$5(key) {
45014                 if (!key || !_has(key)) {
45015                         return
45016                 }
45017                 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
45018         }
45019
45020         function clearAll$3() {
45021                 each$5(function(_, key) {
45022                         remove$5(key);
45023                 });
45024         }
45025
45026         function _has(key) {
45027                 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
45028         }
45029
45030         var Global$5 = util.Global;
45031
45032         var sessionStorage_1 = {
45033                 name: 'sessionStorage',
45034                 read: read$4,
45035                 write: write$4,
45036                 each: each$6,
45037                 remove: remove$6,
45038                 clearAll: clearAll$4
45039         };
45040
45041         function sessionStorage() {
45042                 return Global$5.sessionStorage
45043         }
45044
45045         function read$4(key) {
45046                 return sessionStorage().getItem(key)
45047         }
45048
45049         function write$4(key, data) {
45050                 return sessionStorage().setItem(key, data)
45051         }
45052
45053         function each$6(fn) {
45054                 for (var i = sessionStorage().length - 1; i >= 0; i--) {
45055                         var key = sessionStorage().key(i);
45056                         fn(read$4(key), key);
45057                 }
45058         }
45059
45060         function remove$6(key) {
45061                 return sessionStorage().removeItem(key)
45062         }
45063
45064         function clearAll$4() {
45065                 return sessionStorage().clear()
45066         }
45067
45068         // memoryStorage is a useful last fallback to ensure that the store
45069         // is functions (meaning store.get(), store.set(), etc will all function).
45070         // However, stored values will not persist when the browser navigates to
45071         // a new page or reloads the current page.
45072
45073         var memoryStorage_1 = {
45074                 name: 'memoryStorage',
45075                 read: read$5,
45076                 write: write$5,
45077                 each: each$7,
45078                 remove: remove$7,
45079                 clearAll: clearAll$5,
45080         };
45081
45082         var memoryStorage = {};
45083
45084         function read$5(key) {
45085                 return memoryStorage[key]
45086         }
45087
45088         function write$5(key, data) {
45089                 memoryStorage[key] = data;
45090         }
45091
45092         function each$7(callback) {
45093                 for (var key in memoryStorage) {
45094                         if (memoryStorage.hasOwnProperty(key)) {
45095                                 callback(memoryStorage[key], key);
45096                         }
45097                 }
45098         }
45099
45100         function remove$7(key) {
45101                 delete memoryStorage[key];
45102         }
45103
45104         function clearAll$5(key) {
45105                 memoryStorage = {};
45106         }
45107
45108         var all = [
45109                 // Listed in order of usage preference
45110                 localStorage_1,
45111                 oldFFGlobalStorage,
45112                 oldIEUserDataStorage,
45113                 cookieStorage,
45114                 sessionStorage_1,
45115                 memoryStorage_1
45116         ];
45117
45118         /* eslint-disable */
45119
45120         //  json2.js
45121         //  2016-10-28
45122         //  Public Domain.
45123         //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
45124         //  See http://www.JSON.org/js.html
45125         //  This code should be minified before deployment.
45126         //  See http://javascript.crockford.com/jsmin.html
45127
45128         //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
45129         //  NOT CONTROL.
45130
45131         //  This file creates a global JSON object containing two methods: stringify
45132         //  and parse. This file provides the ES5 JSON capability to ES3 systems.
45133         //  If a project might run on IE8 or earlier, then this file should be included.
45134         //  This file does nothing on ES5 systems.
45135
45136         //      JSON.stringify(value, replacer, space)
45137         //          value       any JavaScript value, usually an object or array.
45138         //          replacer    an optional parameter that determines how object
45139         //                      values are stringified for objects. It can be a
45140         //                      function or an array of strings.
45141         //          space       an optional parameter that specifies the indentation
45142         //                      of nested structures. If it is omitted, the text will
45143         //                      be packed without extra whitespace. If it is a number,
45144         //                      it will specify the number of spaces to indent at each
45145         //                      level. If it is a string (such as "\t" or "&nbsp;"),
45146         //                      it contains the characters used to indent at each level.
45147         //          This method produces a JSON text from a JavaScript value.
45148         //          When an object value is found, if the object contains a toJSON
45149         //          method, its toJSON method will be called and the result will be
45150         //          stringified. A toJSON method does not serialize: it returns the
45151         //          value represented by the name/value pair that should be serialized,
45152         //          or undefined if nothing should be serialized. The toJSON method
45153         //          will be passed the key associated with the value, and this will be
45154         //          bound to the value.
45155
45156         //          For example, this would serialize Dates as ISO strings.
45157
45158         //              Date.prototype.toJSON = function (key) {
45159         //                  function f(n) {
45160         //                      // Format integers to have at least two digits.
45161         //                      return (n < 10)
45162         //                          ? "0" + n
45163         //                          : n;
45164         //                  }
45165         //                  return this.getUTCFullYear()   + "-" +
45166         //                       f(this.getUTCMonth() + 1) + "-" +
45167         //                       f(this.getUTCDate())      + "T" +
45168         //                       f(this.getUTCHours())     + ":" +
45169         //                       f(this.getUTCMinutes())   + ":" +
45170         //                       f(this.getUTCSeconds())   + "Z";
45171         //              };
45172
45173         //          You can provide an optional replacer method. It will be passed the
45174         //          key and value of each member, with this bound to the containing
45175         //          object. The value that is returned from your method will be
45176         //          serialized. If your method returns undefined, then the member will
45177         //          be excluded from the serialization.
45178
45179         //          If the replacer parameter is an array of strings, then it will be
45180         //          used to select the members to be serialized. It filters the results
45181         //          such that only members with keys listed in the replacer array are
45182         //          stringified.
45183
45184         //          Values that do not have JSON representations, such as undefined or
45185         //          functions, will not be serialized. Such values in objects will be
45186         //          dropped; in arrays they will be replaced with null. You can use
45187         //          a replacer function to replace those with JSON values.
45188
45189         //          JSON.stringify(undefined) returns undefined.
45190
45191         //          The optional space parameter produces a stringification of the
45192         //          value that is filled with line breaks and indentation to make it
45193         //          easier to read.
45194
45195         //          If the space parameter is a non-empty string, then that string will
45196         //          be used for indentation. If the space parameter is a number, then
45197         //          the indentation will be that many spaces.
45198
45199         //          Example:
45200
45201         //          text = JSON.stringify(["e", {pluribus: "unum"}]);
45202         //          // text is '["e",{"pluribus":"unum"}]'
45203
45204         //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
45205         //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
45206
45207         //          text = JSON.stringify([new Date()], function (key, value) {
45208         //              return this[key] instanceof Date
45209         //                  ? "Date(" + this[key] + ")"
45210         //                  : value;
45211         //          });
45212         //          // text is '["Date(---current time---)"]'
45213
45214         //      JSON.parse(text, reviver)
45215         //          This method parses a JSON text to produce an object or array.
45216         //          It can throw a SyntaxError exception.
45217
45218         //          The optional reviver parameter is a function that can filter and
45219         //          transform the results. It receives each of the keys and values,
45220         //          and its return value is used instead of the original value.
45221         //          If it returns what it received, then the structure is not modified.
45222         //          If it returns undefined then the member is deleted.
45223
45224         //          Example:
45225
45226         //          // Parse the text. Values that look like ISO date strings will
45227         //          // be converted to Date objects.
45228
45229         //          myData = JSON.parse(text, function (key, value) {
45230         //              var a;
45231         //              if (typeof value === "string") {
45232         //                  a =
45233         //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
45234         //                  if (a) {
45235         //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
45236         //                          +a[5], +a[6]));
45237         //                  }
45238         //              }
45239         //              return value;
45240         //          });
45241
45242         //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
45243         //              var d;
45244         //              if (typeof value === "string" &&
45245         //                      value.slice(0, 5) === "Date(" &&
45246         //                      value.slice(-1) === ")") {
45247         //                  d = new Date(value.slice(5, -1));
45248         //                  if (d) {
45249         //                      return d;
45250         //                  }
45251         //              }
45252         //              return value;
45253         //          });
45254
45255         //  This is a reference implementation. You are free to copy, modify, or
45256         //  redistribute.
45257
45258         /*jslint
45259             eval, for, this
45260         */
45261
45262         /*property
45263             JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
45264             getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
45265             lastIndex, length, parse, prototype, push, replace, slice, stringify,
45266             test, toJSON, toString, valueOf
45267         */
45268
45269
45270         // Create a JSON object only if one does not already exist. We create the
45271         // methods in a closure to avoid creating global variables.
45272
45273         if (typeof JSON !== "object") {
45274             JSON = {};
45275         }
45276
45277         (function () {
45278
45279             var rx_one = /^[\],:{}\s]*$/;
45280             var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
45281             var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
45282             var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
45283             var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45284             var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45285
45286             function f(n) {
45287                 // Format integers to have at least two digits.
45288                 return n < 10
45289                     ? "0" + n
45290                     : n;
45291             }
45292
45293             function this_value() {
45294                 return this.valueOf();
45295             }
45296
45297             if (typeof Date.prototype.toJSON !== "function") {
45298
45299                 Date.prototype.toJSON = function () {
45300
45301                     return isFinite(this.valueOf())
45302                         ? this.getUTCFullYear() + "-" +
45303                                 f(this.getUTCMonth() + 1) + "-" +
45304                                 f(this.getUTCDate()) + "T" +
45305                                 f(this.getUTCHours()) + ":" +
45306                                 f(this.getUTCMinutes()) + ":" +
45307                                 f(this.getUTCSeconds()) + "Z"
45308                         : null;
45309                 };
45310
45311                 Boolean.prototype.toJSON = this_value;
45312                 Number.prototype.toJSON = this_value;
45313                 String.prototype.toJSON = this_value;
45314             }
45315
45316             var gap;
45317             var indent;
45318             var meta;
45319             var rep;
45320
45321
45322             function quote(string) {
45323
45324         // If the string contains no control characters, no quote characters, and no
45325         // backslash characters, then we can safely slap some quotes around it.
45326         // Otherwise we must also replace the offending characters with safe escape
45327         // sequences.
45328
45329                 rx_escapable.lastIndex = 0;
45330                 return rx_escapable.test(string)
45331                     ? "\"" + string.replace(rx_escapable, function (a) {
45332                         var c = meta[a];
45333                         return typeof c === "string"
45334                             ? c
45335                             : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45336                     }) + "\""
45337                     : "\"" + string + "\"";
45338             }
45339
45340
45341             function str(key, holder) {
45342
45343         // Produce a string from holder[key].
45344
45345                 var i;          // The loop counter.
45346                 var k;          // The member key.
45347                 var v;          // The member value.
45348                 var length;
45349                 var mind = gap;
45350                 var partial;
45351                 var value = holder[key];
45352
45353         // If the value has a toJSON method, call it to obtain a replacement value.
45354
45355                 if (value && typeof value === "object" &&
45356                         typeof value.toJSON === "function") {
45357                     value = value.toJSON(key);
45358                 }
45359
45360         // If we were called with a replacer function, then call the replacer to
45361         // obtain a replacement value.
45362
45363                 if (typeof rep === "function") {
45364                     value = rep.call(holder, key, value);
45365                 }
45366
45367         // What happens next depends on the value's type.
45368
45369                 switch (typeof value) {
45370                 case "string":
45371                     return quote(value);
45372
45373                 case "number":
45374
45375         // JSON numbers must be finite. Encode non-finite numbers as null.
45376
45377                     return isFinite(value)
45378                         ? String(value)
45379                         : "null";
45380
45381                 case "boolean":
45382                 case "null":
45383
45384         // If the value is a boolean or null, convert it to a string. Note:
45385         // typeof null does not produce "null". The case is included here in
45386         // the remote chance that this gets fixed someday.
45387
45388                     return String(value);
45389
45390         // If the type is "object", we might be dealing with an object or an array or
45391         // null.
45392
45393                 case "object":
45394
45395         // Due to a specification blunder in ECMAScript, typeof null is "object",
45396         // so watch out for that case.
45397
45398                     if (!value) {
45399                         return "null";
45400                     }
45401
45402         // Make an array to hold the partial results of stringifying this object value.
45403
45404                     gap += indent;
45405                     partial = [];
45406
45407         // Is the value an array?
45408
45409                     if (Object.prototype.toString.apply(value) === "[object Array]") {
45410
45411         // The value is an array. Stringify every element. Use null as a placeholder
45412         // for non-JSON values.
45413
45414                         length = value.length;
45415                         for (i = 0; i < length; i += 1) {
45416                             partial[i] = str(i, value) || "null";
45417                         }
45418
45419         // Join all of the elements together, separated with commas, and wrap them in
45420         // brackets.
45421
45422                         v = partial.length === 0
45423                             ? "[]"
45424                             : gap
45425                                 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
45426                                 : "[" + partial.join(",") + "]";
45427                         gap = mind;
45428                         return v;
45429                     }
45430
45431         // If the replacer is an array, use it to select the members to be stringified.
45432
45433                     if (rep && typeof rep === "object") {
45434                         length = rep.length;
45435                         for (i = 0; i < length; i += 1) {
45436                             if (typeof rep[i] === "string") {
45437                                 k = rep[i];
45438                                 v = str(k, value);
45439                                 if (v) {
45440                                     partial.push(quote(k) + (
45441                                         gap
45442                                             ? ": "
45443                                             : ":"
45444                                     ) + v);
45445                                 }
45446                             }
45447                         }
45448                     } else {
45449
45450         // Otherwise, iterate through all of the keys in the object.
45451
45452                         for (k in value) {
45453                             if (Object.prototype.hasOwnProperty.call(value, k)) {
45454                                 v = str(k, value);
45455                                 if (v) {
45456                                     partial.push(quote(k) + (
45457                                         gap
45458                                             ? ": "
45459                                             : ":"
45460                                     ) + v);
45461                                 }
45462                             }
45463                         }
45464                     }
45465
45466         // Join all of the member texts together, separated with commas,
45467         // and wrap them in braces.
45468
45469                     v = partial.length === 0
45470                         ? "{}"
45471                         : gap
45472                             ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
45473                             : "{" + partial.join(",") + "}";
45474                     gap = mind;
45475                     return v;
45476                 }
45477             }
45478
45479         // If the JSON object does not yet have a stringify method, give it one.
45480
45481             if (typeof JSON.stringify !== "function") {
45482                 meta = {    // table of character substitutions
45483                     "\b": "\\b",
45484                     "\t": "\\t",
45485                     "\n": "\\n",
45486                     "\f": "\\f",
45487                     "\r": "\\r",
45488                     "\"": "\\\"",
45489                     "\\": "\\\\"
45490                 };
45491                 JSON.stringify = function (value, replacer, space) {
45492
45493         // The stringify method takes a value and an optional replacer, and an optional
45494         // space parameter, and returns a JSON text. The replacer can be a function
45495         // that can replace values, or an array of strings that will select the keys.
45496         // A default replacer method can be provided. Use of the space parameter can
45497         // produce text that is more easily readable.
45498
45499                     var i;
45500                     gap = "";
45501                     indent = "";
45502
45503         // If the space parameter is a number, make an indent string containing that
45504         // many spaces.
45505
45506                     if (typeof space === "number") {
45507                         for (i = 0; i < space; i += 1) {
45508                             indent += " ";
45509                         }
45510
45511         // If the space parameter is a string, it will be used as the indent string.
45512
45513                     } else if (typeof space === "string") {
45514                         indent = space;
45515                     }
45516
45517         // If there is a replacer, it must be a function or an array.
45518         // Otherwise, throw an error.
45519
45520                     rep = replacer;
45521                     if (replacer && typeof replacer !== "function" &&
45522                             (typeof replacer !== "object" ||
45523                             typeof replacer.length !== "number")) {
45524                         throw new Error("JSON.stringify");
45525                     }
45526
45527         // Make a fake root object containing our value under the key of "".
45528         // Return the result of stringifying the value.
45529
45530                     return str("", {"": value});
45531                 };
45532             }
45533
45534
45535         // If the JSON object does not yet have a parse method, give it one.
45536
45537             if (typeof JSON.parse !== "function") {
45538                 JSON.parse = function (text, reviver) {
45539
45540         // The parse method takes a text and an optional reviver function, and returns
45541         // a JavaScript value if the text is a valid JSON text.
45542
45543                     var j;
45544
45545                     function walk(holder, key) {
45546
45547         // The walk method is used to recursively walk the resulting structure so
45548         // that modifications can be made.
45549
45550                         var k;
45551                         var v;
45552                         var value = holder[key];
45553                         if (value && typeof value === "object") {
45554                             for (k in value) {
45555                                 if (Object.prototype.hasOwnProperty.call(value, k)) {
45556                                     v = walk(value, k);
45557                                     if (v !== undefined) {
45558                                         value[k] = v;
45559                                     } else {
45560                                         delete value[k];
45561                                     }
45562                                 }
45563                             }
45564                         }
45565                         return reviver.call(holder, key, value);
45566                     }
45567
45568
45569         // Parsing happens in four stages. In the first stage, we replace certain
45570         // Unicode characters with escape sequences. JavaScript handles many characters
45571         // incorrectly, either silently deleting them, or treating them as line endings.
45572
45573                     text = String(text);
45574                     rx_dangerous.lastIndex = 0;
45575                     if (rx_dangerous.test(text)) {
45576                         text = text.replace(rx_dangerous, function (a) {
45577                             return "\\u" +
45578                                     ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45579                         });
45580                     }
45581
45582         // In the second stage, we run the text against regular expressions that look
45583         // for non-JSON patterns. We are especially concerned with "()" and "new"
45584         // because they can cause invocation, and "=" because it can cause mutation.
45585         // But just to be safe, we want to reject all unexpected forms.
45586
45587         // We split the second stage into 4 regexp operations in order to work around
45588         // crippling inefficiencies in IE's and Safari's regexp engines. First we
45589         // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
45590         // replace all simple value tokens with "]" characters. Third, we delete all
45591         // open brackets that follow a colon or comma or that begin the text. Finally,
45592         // we look to see that the remaining characters are only whitespace or "]" or
45593         // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
45594
45595                     if (
45596                         rx_one.test(
45597                             text
45598                                 .replace(rx_two, "@")
45599                                 .replace(rx_three, "]")
45600                                 .replace(rx_four, "")
45601                         )
45602                     ) {
45603
45604         // In the third stage we use the eval function to compile the text into a
45605         // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
45606         // in JavaScript: it can begin a block or an object literal. We wrap the text
45607         // in parens to eliminate the ambiguity.
45608
45609                         j = eval("(" + text + ")");
45610
45611         // In the optional fourth stage, we recursively walk the new structure, passing
45612         // each name/value pair to a reviver function for possible transformation.
45613
45614                         return (typeof reviver === "function")
45615                             ? walk({"": j}, "")
45616                             : j;
45617                     }
45618
45619         // If the text is not JSON parseable, then a SyntaxError is thrown.
45620
45621                     throw new SyntaxError("JSON.parse");
45622                 };
45623             }
45624         }());
45625
45626         var json2 = json2Plugin;
45627
45628         function json2Plugin() {
45629                 
45630                 return {}
45631         }
45632
45633         var plugins = [json2];
45634
45635         var store_legacy = storeEngine.createStore(all, plugins);
45636
45637         // # osm-auth
45638         //
45639         // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
45640         // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
45641         // does not support custom headers, which this uses everywhere.
45642         var osmAuth = function(o) {
45643
45644             var oauth = {};
45645
45646             // authenticated users will also have a request token secret, but it's
45647             // not used in transactions with the server
45648             oauth.authenticated = function() {
45649                 return !!(token('oauth_token') && token('oauth_token_secret'));
45650             };
45651
45652             oauth.logout = function() {
45653                 token('oauth_token', '');
45654                 token('oauth_token_secret', '');
45655                 token('oauth_request_token_secret', '');
45656                 return oauth;
45657             };
45658
45659             // TODO: detect lack of click event
45660             oauth.authenticate = function(callback) {
45661                 if (oauth.authenticated()) return callback();
45662
45663                 oauth.logout();
45664
45665                 // ## Getting a request token
45666                 var params = timenonce(getAuth(o)),
45667                     url = o.url + '/oauth/request_token';
45668
45669                 params.oauth_signature = ohauth_1.signature(
45670                     o.oauth_secret, '',
45671                     ohauth_1.baseString('POST', url, params));
45672
45673                 if (!o.singlepage) {
45674                     // Create a 600x550 popup window in the center of the screen
45675                     var w = 600, h = 550,
45676                         settings = [
45677                             ['width', w], ['height', h],
45678                             ['left', screen.width / 2 - w / 2],
45679                             ['top', screen.height / 2 - h / 2]].map(function(x) {
45680                                 return x.join('=');
45681                             }).join(','),
45682                         popup = window.open('about:blank', 'oauth_window', settings);
45683                 }
45684
45685                 // Request a request token. When this is complete, the popup
45686                 // window is redirected to OSM's authorization page.
45687                 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
45688                 o.loading();
45689
45690                 function reqTokenDone(err, xhr) {
45691                     o.done();
45692                     if (err) return callback(err);
45693                     var resp = ohauth_1.stringQs(xhr.response);
45694                     token('oauth_request_token_secret', resp.oauth_token_secret);
45695                     var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
45696                         oauth_token: resp.oauth_token,
45697                         oauth_callback: resolveUrl(o.landing)
45698                     });
45699
45700                     if (o.singlepage) {
45701                         location.href = authorize_url;
45702                     } else {
45703                         popup.location = authorize_url;
45704                     }
45705                 }
45706
45707                 // Called by a function in a landing page, in the popup window. The
45708                 // window closes itself.
45709                 window.authComplete = function(token) {
45710                     var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
45711                     get_access_token(oauth_token.oauth_token);
45712                     delete window.authComplete;
45713                 };
45714
45715                 // ## Getting an request token
45716                 //
45717                 // At this point we have an `oauth_token`, brought in from a function
45718                 // call on a landing page popup.
45719                 function get_access_token(oauth_token) {
45720                     var url = o.url + '/oauth/access_token',
45721                         params = timenonce(getAuth(o)),
45722                         request_token_secret = token('oauth_request_token_secret');
45723                     params.oauth_token = oauth_token;
45724                     params.oauth_signature = ohauth_1.signature(
45725                         o.oauth_secret,
45726                         request_token_secret,
45727                         ohauth_1.baseString('POST', url, params));
45728
45729                     // ## Getting an access token
45730                     //
45731                     // The final token required for authentication. At this point
45732                     // we have a `request token secret`
45733                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45734                     o.loading();
45735                 }
45736
45737                 function accessTokenDone(err, xhr) {
45738                     o.done();
45739                     if (err) return callback(err);
45740                     var access_token = ohauth_1.stringQs(xhr.response);
45741                     token('oauth_token', access_token.oauth_token);
45742                     token('oauth_token_secret', access_token.oauth_token_secret);
45743                     callback(null, oauth);
45744                 }
45745             };
45746
45747             oauth.bootstrapToken = function(oauth_token, callback) {
45748                 // ## Getting an request token
45749                 // At this point we have an `oauth_token`, brought in from a function
45750                 // call on a landing page popup.
45751                 function get_access_token(oauth_token) {
45752                     var url = o.url + '/oauth/access_token',
45753                         params = timenonce(getAuth(o)),
45754                         request_token_secret = token('oauth_request_token_secret');
45755                     params.oauth_token = oauth_token;
45756                     params.oauth_signature = ohauth_1.signature(
45757                         o.oauth_secret,
45758                         request_token_secret,
45759                         ohauth_1.baseString('POST', url, params));
45760
45761                     // ## Getting an access token
45762                     // The final token required for authentication. At this point
45763                     // we have a `request token secret`
45764                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45765                     o.loading();
45766                 }
45767
45768                 function accessTokenDone(err, xhr) {
45769                     o.done();
45770                     if (err) return callback(err);
45771                     var access_token = ohauth_1.stringQs(xhr.response);
45772                     token('oauth_token', access_token.oauth_token);
45773                     token('oauth_token_secret', access_token.oauth_token_secret);
45774                     callback(null, oauth);
45775                 }
45776
45777                 get_access_token(oauth_token);
45778             };
45779
45780             // # xhr
45781             //
45782             // A single XMLHttpRequest wrapper that does authenticated calls if the
45783             // user has logged in.
45784             oauth.xhr = function(options, callback) {
45785                 if (!oauth.authenticated()) {
45786                     if (o.auto) {
45787                         return oauth.authenticate(run);
45788                     } else {
45789                         callback('not authenticated', null);
45790                         return;
45791                     }
45792                 } else {
45793                     return run();
45794                 }
45795
45796                 function run() {
45797                     var params = timenonce(getAuth(o)),
45798                         oauth_token_secret = token('oauth_token_secret'),
45799                         url = (options.prefix !== false) ? o.url + options.path : options.path,
45800                         url_parts = url.replace(/#.*$/, '').split('?', 2),
45801                         base_url = url_parts[0],
45802                         query = (url_parts.length === 2) ? url_parts[1] : '';
45803
45804                     // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
45805                     if ((!options.options || !options.options.header ||
45806                         options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
45807                         options.content) {
45808                         params = immutable(params, ohauth_1.stringQs(options.content));
45809                     }
45810
45811                     params.oauth_token = token('oauth_token');
45812                     params.oauth_signature = ohauth_1.signature(
45813                         o.oauth_secret,
45814                         oauth_token_secret,
45815                         ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
45816                     );
45817
45818                     return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
45819                 }
45820
45821                 function done(err, xhr) {
45822                     if (err) return callback(err);
45823                     else if (xhr.responseXML) return callback(err, xhr.responseXML);
45824                     else return callback(err, xhr.response);
45825                 }
45826             };
45827
45828             // pre-authorize this object, if we can just get a token and token_secret
45829             // from the start
45830             oauth.preauth = function(c) {
45831                 if (!c) return;
45832                 if (c.oauth_token) token('oauth_token', c.oauth_token);
45833                 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
45834                 return oauth;
45835             };
45836
45837             oauth.options = function(_) {
45838                 if (!arguments.length) return o;
45839
45840                 o = _;
45841                 o.url = o.url || 'https://www.openstreetmap.org';
45842                 o.landing = o.landing || 'land.html';
45843                 o.singlepage = o.singlepage || false;
45844
45845                 // Optional loading and loading-done functions for nice UI feedback.
45846                 // by default, no-ops
45847                 o.loading = o.loading || function() {};
45848                 o.done = o.done || function() {};
45849
45850                 return oauth.preauth(o);
45851             };
45852
45853             // 'stamp' an authentication object from `getAuth()`
45854             // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
45855             // and timestamp
45856             function timenonce(o) {
45857                 o.oauth_timestamp = ohauth_1.timestamp();
45858                 o.oauth_nonce = ohauth_1.nonce();
45859                 return o;
45860             }
45861
45862             // get/set tokens. These are prefixed with the base URL so that `osm-auth`
45863             // can be used with multiple APIs and the keys in `localStorage`
45864             // will not clash
45865             var token;
45866
45867             if (store_legacy.enabled) {
45868                 token = function (x, y) {
45869                     if (arguments.length === 1) return store_legacy.get(o.url + x);
45870                     else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
45871                 };
45872             } else {
45873                 var storage = {};
45874                 token = function (x, y) {
45875                     if (arguments.length === 1) return storage[o.url + x];
45876                     else if (arguments.length === 2) return storage[o.url + x] = y;
45877                 };
45878             }
45879
45880             // Get an authentication object. If you just add and remove properties
45881             // from a single object, you'll need to use `delete` to make sure that
45882             // it doesn't contain undesired properties for authentication
45883             function getAuth(o) {
45884                 return {
45885                     oauth_consumer_key: o.oauth_consumer_key,
45886                     oauth_signature_method: 'HMAC-SHA1'
45887                 };
45888             }
45889
45890             // potentially pre-authorize
45891             oauth.options(o);
45892
45893             return oauth;
45894         };
45895
45896         var JXON = new (function () {
45897           var
45898             sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
45899             aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
45900
45901           function parseText (sValue) {
45902             if (rIsNull.test(sValue)) { return null; }
45903             if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
45904             if (isFinite(sValue)) { return parseFloat(sValue); }
45905             if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
45906             return sValue;
45907           }
45908
45909           function EmptyTree () { }
45910           EmptyTree.prototype.toString = function () { return 'null'; };
45911           EmptyTree.prototype.valueOf = function () { return null; };
45912
45913           function objectify (vValue) {
45914             return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
45915           }
45916
45917           function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
45918             var
45919               nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
45920               bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
45921
45922             var
45923               sProp, vContent, nLength = 0, sCollectedTxt = '',
45924               vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
45925
45926             if (bChildren) {
45927               for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
45928                 oNode = oParentNode.childNodes.item(nItem);
45929                 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
45930                 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
45931                 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
45932               }
45933             }
45934
45935             var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
45936
45937             if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
45938
45939             for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
45940               sProp = aCache[nElId].nodeName.toLowerCase();
45941               vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
45942               if (vResult.hasOwnProperty(sProp)) {
45943                 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
45944                 vResult[sProp].push(vContent);
45945               } else {
45946                 vResult[sProp] = vContent;
45947                 nLength++;
45948               }
45949             }
45950
45951             if (bAttributes) {
45952               var
45953                 nAttrLen = oParentNode.attributes.length,
45954                 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
45955
45956               for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
45957                 oAttrib = oParentNode.attributes.item(nAttrib);
45958                 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
45959               }
45960
45961               if (bNesteAttr) {
45962                 if (bFreeze) { Object.freeze(oAttrParent); }
45963                 vResult[sAttributesProp] = oAttrParent;
45964                 nLength -= nAttrLen - 1;
45965               }
45966             }
45967
45968             if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
45969               vResult[sValueProp] = vBuiltVal;
45970             } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
45971               vResult = vBuiltVal;
45972             }
45973
45974             if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
45975
45976             aCache.length = nLevelStart;
45977
45978             return vResult;
45979           }
45980
45981           function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
45982             var vValue, oChild;
45983
45984             if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
45985               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
45986             } else if (oParentObj.constructor === Date) {
45987               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
45988             }
45989
45990             for (var sName in oParentObj) {
45991               vValue = oParentObj[sName];
45992               if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
45993               if (sName === sValueProp) {
45994                 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
45995               } else if (sName === sAttributesProp) { /* verbosity level is 3 */
45996                 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
45997               } else if (sName.charAt(0) === sAttrPref) {
45998                 oParentEl.setAttribute(sName.slice(1), vValue);
45999               } else if (vValue.constructor === Array) {
46000                 for (var nItem = 0; nItem < vValue.length; nItem++) {
46001                   oChild = oXMLDoc.createElement(sName);
46002                   loadObjTree(oXMLDoc, oChild, vValue[nItem]);
46003                   oParentEl.appendChild(oChild);
46004                 }
46005               } else {
46006                 oChild = oXMLDoc.createElement(sName);
46007                 if (vValue instanceof Object) {
46008                   loadObjTree(oXMLDoc, oChild, vValue);
46009                 } else if (vValue !== null && vValue !== true) {
46010                   oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
46011                 }
46012                 oParentEl.appendChild(oChild);
46013              }
46014            }
46015           }
46016
46017           this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
46018             var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
46019             return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
46020           };
46021
46022           this.unbuild = function (oObjTree) {    
46023             var oNewDoc = document.implementation.createDocument('', '', null);
46024             loadObjTree(oNewDoc, oNewDoc, oObjTree);
46025             return oNewDoc;
46026           };
46027
46028           this.stringify = function (oObjTree) {
46029             return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
46030           };
46031         })();
46032
46033         // var myObject = JXON.build(doc);
46034         // we got our javascript object! try: alert(JSON.stringify(myObject));
46035
46036         // var newDoc = JXON.unbuild(myObject);
46037         // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
46038
46039         var tiler$4 = utilTiler();
46040         var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
46041         var urlroot = 'https://www.openstreetmap.org';
46042         var oauth = osmAuth({
46043             url: urlroot,
46044             oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
46045             oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
46046             loading: authLoading,
46047             done: authDone
46048         });
46049
46050         var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
46051         var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46052         var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46053         var _userCache = { toLoad: {}, user: {} };
46054         var _changeset = {};
46055
46056         var _deferred = new Set();
46057         var _connectionID = 1;
46058         var _tileZoom = 16;
46059         var _noteZoom = 12;
46060         var _rateLimitError;
46061         var _userChangesets;
46062         var _userDetails;
46063         var _off;
46064
46065
46066         function authLoading() {
46067             dispatch$5.call('authLoading');
46068         }
46069
46070
46071         function authDone() {
46072             dispatch$5.call('authDone');
46073         }
46074
46075
46076         function abortRequest$4(controllerOrXHR) {
46077             if (controllerOrXHR) {
46078                 controllerOrXHR.abort();
46079             }
46080         }
46081
46082
46083         function hasInflightRequests(cache) {
46084             return Object.keys(cache.inflight).length;
46085         }
46086
46087
46088         function abortUnwantedRequests$2(cache, visibleTiles) {
46089             Object.keys(cache.inflight).forEach(function(k) {
46090                 if (cache.toLoad[k]) return;
46091                 if (visibleTiles.find(function(tile) { return k === tile.id; })) return;
46092
46093                 abortRequest$4(cache.inflight[k]);
46094                 delete cache.inflight[k];
46095             });
46096         }
46097
46098
46099         function getLoc(attrs) {
46100             var lon = attrs.lon && attrs.lon.value;
46101             var lat = attrs.lat && attrs.lat.value;
46102             return [parseFloat(lon), parseFloat(lat)];
46103         }
46104
46105
46106         function getNodes(obj) {
46107             var elems = obj.getElementsByTagName('nd');
46108             var nodes = new Array(elems.length);
46109             for (var i = 0, l = elems.length; i < l; i++) {
46110                 nodes[i] = 'n' + elems[i].attributes.ref.value;
46111             }
46112             return nodes;
46113         }
46114
46115
46116         function getTags(obj) {
46117             var elems = obj.getElementsByTagName('tag');
46118             var tags = {};
46119             for (var i = 0, l = elems.length; i < l; i++) {
46120                 var attrs = elems[i].attributes;
46121                 tags[attrs.k.value] = attrs.v.value;
46122             }
46123
46124             return tags;
46125         }
46126
46127
46128         function getMembers(obj) {
46129             var elems = obj.getElementsByTagName('member');
46130             var members = new Array(elems.length);
46131             for (var i = 0, l = elems.length; i < l; i++) {
46132                 var attrs = elems[i].attributes;
46133                 members[i] = {
46134                     id: attrs.type.value[0] + attrs.ref.value,
46135                     type: attrs.type.value,
46136                     role: attrs.role.value
46137                 };
46138             }
46139             return members;
46140         }
46141
46142
46143         function getVisible(attrs) {
46144             return (!attrs.visible || attrs.visible.value !== 'false');
46145         }
46146
46147
46148         function parseComments(comments) {
46149             var parsedComments = [];
46150
46151             // for each comment
46152             for (var i = 0; i < comments.length; i++) {
46153                 var comment = comments[i];
46154                 if (comment.nodeName === 'comment') {
46155                     var childNodes = comment.childNodes;
46156                     var parsedComment = {};
46157
46158                     for (var j = 0; j < childNodes.length; j++) {
46159                         var node = childNodes[j];
46160                         var nodeName = node.nodeName;
46161                         if (nodeName === '#text') continue;
46162                         parsedComment[nodeName] = node.textContent;
46163
46164                         if (nodeName === 'uid') {
46165                             var uid = node.textContent;
46166                             if (uid && !_userCache.user[uid]) {
46167                                 _userCache.toLoad[uid] = true;
46168                             }
46169                         }
46170                     }
46171
46172                     if (parsedComment) {
46173                         parsedComments.push(parsedComment);
46174                     }
46175                 }
46176             }
46177             return parsedComments;
46178         }
46179
46180
46181         function encodeNoteRtree(note) {
46182             return {
46183                 minX: note.loc[0],
46184                 minY: note.loc[1],
46185                 maxX: note.loc[0],
46186                 maxY: note.loc[1],
46187                 data: note
46188             };
46189         }
46190
46191
46192         var parsers = {
46193             node: function nodeData(obj, uid) {
46194                 var attrs = obj.attributes;
46195                 return new osmNode({
46196                     id: uid,
46197                     visible: getVisible(attrs),
46198                     version: attrs.version.value,
46199                     changeset: attrs.changeset && attrs.changeset.value,
46200                     timestamp: attrs.timestamp && attrs.timestamp.value,
46201                     user: attrs.user && attrs.user.value,
46202                     uid: attrs.uid && attrs.uid.value,
46203                     loc: getLoc(attrs),
46204                     tags: getTags(obj)
46205                 });
46206             },
46207
46208             way: function wayData(obj, uid) {
46209                 var attrs = obj.attributes;
46210                 return new osmWay({
46211                     id: uid,
46212                     visible: getVisible(attrs),
46213                     version: attrs.version.value,
46214                     changeset: attrs.changeset && attrs.changeset.value,
46215                     timestamp: attrs.timestamp && attrs.timestamp.value,
46216                     user: attrs.user && attrs.user.value,
46217                     uid: attrs.uid && attrs.uid.value,
46218                     tags: getTags(obj),
46219                     nodes: getNodes(obj),
46220                 });
46221             },
46222
46223             relation: function relationData(obj, uid) {
46224                 var attrs = obj.attributes;
46225                 return new osmRelation({
46226                     id: uid,
46227                     visible: getVisible(attrs),
46228                     version: attrs.version.value,
46229                     changeset: attrs.changeset && attrs.changeset.value,
46230                     timestamp: attrs.timestamp && attrs.timestamp.value,
46231                     user: attrs.user && attrs.user.value,
46232                     uid: attrs.uid && attrs.uid.value,
46233                     tags: getTags(obj),
46234                     members: getMembers(obj)
46235                 });
46236             },
46237
46238             note: function parseNote(obj, uid) {
46239                 var attrs = obj.attributes;
46240                 var childNodes = obj.childNodes;
46241                 var props = {};
46242
46243                 props.id = uid;
46244                 props.loc = getLoc(attrs);
46245
46246                 // if notes are coincident, move them apart slightly
46247                 var coincident = false;
46248                 var epsilon = 0.00001;
46249                 do {
46250                     if (coincident) {
46251                         props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
46252                     }
46253                     var bbox = geoExtent(props.loc).bbox();
46254                     coincident = _noteCache.rtree.search(bbox).length;
46255                 } while (coincident);
46256
46257                 // parse note contents
46258                 for (var i = 0; i < childNodes.length; i++) {
46259                     var node = childNodes[i];
46260                     var nodeName = node.nodeName;
46261                     if (nodeName === '#text') continue;
46262
46263                     // if the element is comments, parse the comments
46264                     if (nodeName === 'comments') {
46265                         props[nodeName] = parseComments(node.childNodes);
46266                     } else {
46267                         props[nodeName] = node.textContent;
46268                     }
46269                 }
46270
46271                 var note = new osmNote(props);
46272                 var item = encodeNoteRtree(note);
46273                 _noteCache.note[note.id] = note;
46274                 _noteCache.rtree.insert(item);
46275
46276                 return note;
46277             },
46278
46279             user: function parseUser(obj, uid) {
46280                 var attrs = obj.attributes;
46281                 var user = {
46282                     id: uid,
46283                     display_name: attrs.display_name && attrs.display_name.value,
46284                     account_created: attrs.account_created && attrs.account_created.value,
46285                     changesets_count: 0
46286                 };
46287
46288                 var img = obj.getElementsByTagName('img');
46289                 if (img && img[0] && img[0].getAttribute('href')) {
46290                     user.image_url = img[0].getAttribute('href');
46291                 }
46292
46293                 var changesets = obj.getElementsByTagName('changesets');
46294                 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
46295                     user.changesets_count = changesets[0].getAttribute('count');
46296                 }
46297
46298                 _userCache.user[uid] = user;
46299                 delete _userCache.toLoad[uid];
46300                 return user;
46301             }
46302         };
46303
46304
46305         function parseXML(xml, callback, options) {
46306             options = Object.assign({ skipSeen: true }, options);
46307             if (!xml || !xml.childNodes) {
46308                 return callback({ message: 'No XML', status: -1 });
46309             }
46310
46311             var root = xml.childNodes[0];
46312             var children = root.childNodes;
46313
46314             var handle = window.requestIdleCallback(function() {
46315                 var results = [];
46316                 var result;
46317                 for (var i = 0; i < children.length; i++) {
46318                     result = parseChild(children[i]);
46319                     if (result) results.push(result);
46320                 }
46321                 callback(null, results);
46322             });
46323
46324             _deferred.add(handle);
46325
46326
46327             function parseChild(child) {
46328                 var parser = parsers[child.nodeName];
46329                 if (!parser) return null;
46330
46331                 var uid;
46332                 if (child.nodeName === 'user') {
46333                     uid = child.attributes.id.value;
46334                     if (options.skipSeen && _userCache.user[uid]) {
46335                         delete _userCache.toLoad[uid];
46336                         return null;
46337                     }
46338
46339                 } else if (child.nodeName === 'note') {
46340                     uid = child.getElementsByTagName('id')[0].textContent;
46341
46342                 } else {
46343                     uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
46344                     if (options.skipSeen) {
46345                         if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
46346                         _tileCache.seen[uid] = true;
46347                     }
46348                 }
46349
46350                 return parser(child, uid);
46351             }
46352         }
46353
46354
46355         // replace or remove note from rtree
46356         function updateRtree$2(item, replace) {
46357             _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
46358
46359             if (replace) {
46360                 _noteCache.rtree.insert(item);
46361             }
46362         }
46363
46364
46365         function wrapcb(thisArg, callback, cid) {
46366             return function(err, result) {
46367                 if (err) {
46368                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
46369                     if (err.status === 400 || err.status === 401 || err.status === 403) {
46370                         thisArg.logout();
46371                     }
46372                     return callback.call(thisArg, err);
46373
46374                 } else if (thisArg.getConnectionId() !== cid) {
46375                     return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
46376
46377                 } else {
46378                     return callback.call(thisArg, err, result);
46379                 }
46380             };
46381         }
46382
46383
46384         var serviceOsm = {
46385
46386             init: function() {
46387                 utilRebind(this, dispatch$5, 'on');
46388             },
46389
46390
46391             reset: function() {
46392                 Array.from(_deferred).forEach(function(handle) {
46393                     window.cancelIdleCallback(handle);
46394                     _deferred.delete(handle);
46395                 });
46396
46397                 _connectionID++;
46398                 _userChangesets = undefined;
46399                 _userDetails = undefined;
46400                 _rateLimitError = undefined;
46401
46402                 Object.values(_tileCache.inflight).forEach(abortRequest$4);
46403                 Object.values(_noteCache.inflight).forEach(abortRequest$4);
46404                 Object.values(_noteCache.inflightPost).forEach(abortRequest$4);
46405                 if (_changeset.inflight) abortRequest$4(_changeset.inflight);
46406
46407                 _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46408                 _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46409                 _userCache = { toLoad: {}, user: {} };
46410                 _changeset = {};
46411
46412                 return this;
46413             },
46414
46415
46416             getConnectionId: function() {
46417                 return _connectionID;
46418             },
46419
46420
46421             changesetURL: function(changesetID) {
46422                 return urlroot + '/changeset/' + changesetID;
46423             },
46424
46425
46426             changesetsURL: function(center, zoom) {
46427                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
46428                 return urlroot + '/history#map=' +
46429                     Math.floor(zoom) + '/' +
46430                     center[1].toFixed(precision) + '/' +
46431                     center[0].toFixed(precision);
46432             },
46433
46434
46435             entityURL: function(entity) {
46436                 return urlroot + '/' + entity.type + '/' + entity.osmId();
46437             },
46438
46439
46440             historyURL: function(entity) {
46441                 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
46442             },
46443
46444
46445             userURL: function(username) {
46446                 return urlroot + '/user/' + username;
46447             },
46448
46449
46450             noteURL: function(note) {
46451                 return urlroot + '/note/' + note.id;
46452             },
46453
46454
46455             noteReportURL: function(note) {
46456                 return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
46457             },
46458
46459
46460             // Generic method to load data from the OSM API
46461             // Can handle either auth or unauth calls.
46462             loadFromAPI: function(path, callback, options) {
46463                 options = Object.assign({ skipSeen: true }, options);
46464                 var that = this;
46465                 var cid = _connectionID;
46466
46467                 function done(err, xml) {
46468                     if (that.getConnectionId() !== cid) {
46469                         if (callback) callback({ message: 'Connection Switched', status: -1 });
46470                         return;
46471                     }
46472
46473                     var isAuthenticated = that.authenticated();
46474
46475                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden
46476                     // Logout and retry the request..
46477                     if (isAuthenticated && err && err.status &&
46478                             (err.status === 400 || err.status === 401 || err.status === 403)) {
46479                         that.logout();
46480                         that.loadFromAPI(path, callback, options);
46481
46482                     // else, no retry..
46483                     } else {
46484                         // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
46485                         // Set the rateLimitError flag and trigger a warning..
46486                         if (!isAuthenticated && !_rateLimitError && err && err.status &&
46487                                 (err.status === 509 || err.status === 429)) {
46488                             _rateLimitError = err;
46489                             dispatch$5.call('change');
46490                         }
46491
46492                         if (callback) {
46493                             if (err) {
46494                                 return callback(err);
46495                             } else {
46496                                 return parseXML(xml, callback, options);
46497                             }
46498                         }
46499                     }
46500                 }
46501
46502                 if (this.authenticated()) {
46503                     return oauth.xhr({ method: 'GET', path: path }, done);
46504                 } else {
46505                     var url = urlroot + path;
46506                     var controller = new AbortController();
46507                     d3_xml(url, { signal: controller.signal })
46508                         .then(function(data) {
46509                             done(null, data);
46510                         })
46511                         .catch(function(err) {
46512                             if (err.name === 'AbortError') return;
46513                             // d3-fetch includes status in the error message,
46514                             // but we can't access the response itself
46515                             // https://github.com/d3/d3-fetch/issues/27
46516                             var match = err.message.match(/^\d{3}/);
46517                             if (match) {
46518                                 done({ status: +match[0], statusText: err.message });
46519                             } else {
46520                                 done(err.message);
46521                             }
46522                         });
46523                     return controller;
46524                 }
46525             },
46526
46527
46528             // Load a single entity by id (ways and relations use the `/full` call)
46529             // GET /api/0.6/node/#id
46530             // GET /api/0.6/[way|relation]/#id/full
46531             loadEntity: function(id, callback) {
46532                 var type = osmEntity.id.type(id);
46533                 var osmID = osmEntity.id.toOSM(id);
46534                 var options = { skipSeen: false };
46535
46536                 this.loadFromAPI(
46537                     '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
46538                     function(err, entities) {
46539                         if (callback) callback(err, { data: entities });
46540                     },
46541                     options
46542                 );
46543             },
46544
46545
46546             // Load a single entity with a specific version
46547             // GET /api/0.6/[node|way|relation]/#id/#version
46548             loadEntityVersion: function(id, version, callback) {
46549                 var type = osmEntity.id.type(id);
46550                 var osmID = osmEntity.id.toOSM(id);
46551                 var options = { skipSeen: false };
46552
46553                 this.loadFromAPI(
46554                     '/api/0.6/' + type + '/' + osmID + '/' + version,
46555                     function(err, entities) {
46556                         if (callback) callback(err, { data: entities });
46557                     },
46558                     options
46559                 );
46560             },
46561
46562
46563             // Load multiple entities in chunks
46564             // (note: callback may be called multiple times)
46565             // GET /api/0.6/[nodes|ways|relations]?#parameters
46566             loadMultiple: function(ids, callback) {
46567                 var that = this;
46568                 var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
46569
46570                 Object.keys(groups).forEach(function(k) {
46571                     var type = k + 's';   // nodes, ways, relations
46572                     var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); });
46573                     var options = { skipSeen: false };
46574
46575                     utilArrayChunk(osmIDs, 150).forEach(function(arr) {
46576                         that.loadFromAPI(
46577                             '/api/0.6/' + type + '?' + type + '=' + arr.join(),
46578                             function(err, entities) {
46579                                 if (callback) callback(err, { data: entities });
46580                             },
46581                             options
46582                         );
46583                     });
46584                 });
46585             },
46586
46587
46588             // Create, upload, and close a changeset
46589             // PUT /api/0.6/changeset/create
46590             // POST /api/0.6/changeset/#id/upload
46591             // PUT /api/0.6/changeset/#id/close
46592             putChangeset: function(changeset, changes, callback) {
46593                 var cid = _connectionID;
46594
46595                 if (_changeset.inflight) {
46596                     return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
46597
46598                 } else if (_changeset.open) {   // reuse existing open changeset..
46599                     return createdChangeset.call(this, null, _changeset.open);
46600
46601                 } else {   // Open a new changeset..
46602                     var options = {
46603                         method: 'PUT',
46604                         path: '/api/0.6/changeset/create',
46605                         options: { header: { 'Content-Type': 'text/xml' } },
46606                         content: JXON.stringify(changeset.asJXON())
46607                     };
46608                     _changeset.inflight = oauth.xhr(
46609                         options,
46610                         wrapcb(this, createdChangeset, cid)
46611                     );
46612                 }
46613
46614
46615                 function createdChangeset(err, changesetID) {
46616                     _changeset.inflight = null;
46617                     if (err) { return callback(err, changeset); }
46618
46619                     _changeset.open = changesetID;
46620                     changeset = changeset.update({ id: changesetID });
46621
46622                     // Upload the changeset..
46623                     var options = {
46624                         method: 'POST',
46625                         path: '/api/0.6/changeset/' + changesetID + '/upload',
46626                         options: { header: { 'Content-Type': 'text/xml' } },
46627                         content: JXON.stringify(changeset.osmChangeJXON(changes))
46628                     };
46629                     _changeset.inflight = oauth.xhr(
46630                         options,
46631                         wrapcb(this, uploadedChangeset, cid)
46632                     );
46633                 }
46634
46635
46636                 function uploadedChangeset(err) {
46637                     _changeset.inflight = null;
46638                     if (err) return callback(err, changeset);
46639
46640                     // Upload was successful, safe to call the callback.
46641                     // Add delay to allow for postgres replication #1646 #2678
46642                     window.setTimeout(function() { callback(null, changeset); }, 2500);
46643                     _changeset.open = null;
46644
46645                     // At this point, we don't really care if the connection was switched..
46646                     // Only try to close the changeset if we're still talking to the same server.
46647                     if (this.getConnectionId() === cid) {
46648                         // Still attempt to close changeset, but ignore response because #2667
46649                         oauth.xhr({
46650                             method: 'PUT',
46651                             path: '/api/0.6/changeset/' + changeset.id + '/close',
46652                             options: { header: { 'Content-Type': 'text/xml' } }
46653                         }, function() { return true; });
46654                     }
46655                 }
46656             },
46657
46658
46659             // Load multiple users in chunks
46660             // (note: callback may be called multiple times)
46661             // GET /api/0.6/users?users=#id1,#id2,...,#idn
46662             loadUsers: function(uids, callback) {
46663                 var toLoad = [];
46664                 var cached = [];
46665
46666                 utilArrayUniq(uids).forEach(function(uid) {
46667                     if (_userCache.user[uid]) {
46668                         delete _userCache.toLoad[uid];
46669                         cached.push(_userCache.user[uid]);
46670                     } else {
46671                         toLoad.push(uid);
46672                     }
46673                 });
46674
46675                 if (cached.length || !this.authenticated()) {
46676                     callback(undefined, cached);
46677                     if (!this.authenticated()) return;  // require auth
46678                 }
46679
46680                 utilArrayChunk(toLoad, 150).forEach(function(arr) {
46681                     oauth.xhr(
46682                         { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
46683                         wrapcb(this, done, _connectionID)
46684                     );
46685                 }.bind(this));
46686
46687                 function done(err, xml) {
46688                     if (err) { return callback(err); }
46689
46690                     var options = { skipSeen: true };
46691                     return parseXML(xml, function(err, results) {
46692                         if (err) {
46693                             return callback(err);
46694                         } else {
46695                             return callback(undefined, results);
46696                         }
46697                     }, options);
46698                 }
46699             },
46700
46701
46702             // Load a given user by id
46703             // GET /api/0.6/user/#id
46704             loadUser: function(uid, callback) {
46705                 if (_userCache.user[uid] || !this.authenticated()) {   // require auth
46706                     delete _userCache.toLoad[uid];
46707                     return callback(undefined, _userCache.user[uid]);
46708                 }
46709
46710                 oauth.xhr(
46711                     { method: 'GET', path: '/api/0.6/user/' + uid },
46712                     wrapcb(this, done, _connectionID)
46713                 );
46714
46715                 function done(err, xml) {
46716                     if (err) { return callback(err); }
46717
46718                     var options = { skipSeen: true };
46719                     return parseXML(xml, function(err, results) {
46720                         if (err) {
46721                             return callback(err);
46722                         } else {
46723                             return callback(undefined, results[0]);
46724                         }
46725                     }, options);
46726                 }
46727             },
46728
46729
46730             // Load the details of the logged-in user
46731             // GET /api/0.6/user/details
46732             userDetails: function(callback) {
46733                 if (_userDetails) {    // retrieve cached
46734                     return callback(undefined, _userDetails);
46735                 }
46736
46737                 oauth.xhr(
46738                     { method: 'GET', path: '/api/0.6/user/details' },
46739                     wrapcb(this, done, _connectionID)
46740                 );
46741
46742                 function done(err, xml) {
46743                     if (err) { return callback(err); }
46744
46745                     var options = { skipSeen: false };
46746                     return parseXML(xml, function(err, results) {
46747                         if (err) {
46748                             return callback(err);
46749                         } else {
46750                             _userDetails = results[0];
46751                             return callback(undefined, _userDetails);
46752                         }
46753                     }, options);
46754                 }
46755             },
46756
46757
46758             // Load previous changesets for the logged in user
46759             // GET /api/0.6/changesets?user=#id
46760             userChangesets: function(callback) {
46761                 if (_userChangesets) {    // retrieve cached
46762                     return callback(undefined, _userChangesets);
46763                 }
46764
46765                 this.userDetails(
46766                     wrapcb(this, gotDetails, _connectionID)
46767                 );
46768
46769
46770                 function gotDetails(err, user) {
46771                     if (err) { return callback(err); }
46772
46773                     oauth.xhr(
46774                         { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
46775                         wrapcb(this, done, _connectionID)
46776                     );
46777                 }
46778
46779                 function done(err, xml) {
46780                     if (err) { return callback(err); }
46781
46782                     _userChangesets = Array.prototype.map.call(
46783                         xml.getElementsByTagName('changeset'),
46784                         function (changeset) { return { tags: getTags(changeset) }; }
46785                     ).filter(function (changeset) {
46786                         var comment = changeset.tags.comment;
46787                         return comment && comment !== '';
46788                     });
46789
46790                     return callback(undefined, _userChangesets);
46791                 }
46792             },
46793
46794
46795             // Fetch the status of the OSM API
46796             // GET /api/capabilities
46797             status: function(callback) {
46798                 var url = urlroot + '/api/capabilities';
46799                 var errback = wrapcb(this, done, _connectionID);
46800                 d3_xml(url)
46801                     .then(function(data) { errback(null, data); })
46802                     .catch(function(err) { errback(err.message); });
46803
46804                 function done(err, xml) {
46805                     if (err) { return callback(err); }
46806
46807                     // update blacklists
46808                     var elements = xml.getElementsByTagName('blacklist');
46809                     var regexes = [];
46810                     for (var i = 0; i < elements.length; i++) {
46811                         var regex = elements[i].getAttribute('regex');  // needs unencode?
46812                         if (regex) {
46813                             regexes.push(regex);
46814                         }
46815                     }
46816                     if (regexes.length) {
46817                         _blacklists = regexes;
46818                     }
46819
46820                     if (_rateLimitError) {
46821                         return callback(_rateLimitError, 'rateLimited');
46822                     } else {
46823                         var apiStatus = xml.getElementsByTagName('status');
46824                         var val = apiStatus[0].getAttribute('api');
46825                         return callback(undefined, val);
46826                     }
46827                 }
46828             },
46829
46830
46831             // Load data (entities) from the API in tiles
46832             // GET /api/0.6/map?bbox=
46833             loadTiles: function(projection, callback) {
46834                 if (_off) return;
46835
46836                 // determine the needed tiles to cover the view
46837                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46838
46839                 // abort inflight requests that are no longer needed
46840                 var hadRequests = hasInflightRequests(_tileCache);
46841                 abortUnwantedRequests$2(_tileCache, tiles);
46842                 if (hadRequests && !hasInflightRequests(_tileCache)) {
46843                     dispatch$5.call('loaded');    // stop the spinner
46844                 }
46845
46846                 // issue new requests..
46847                 tiles.forEach(function(tile) {
46848                     this.loadTile(tile, callback);
46849                 }, this);
46850             },
46851
46852
46853             // Load a single data tile
46854             // GET /api/0.6/map?bbox=
46855             loadTile: function(tile, callback) {
46856                 if (_off) return;
46857                 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46858
46859                 if (!hasInflightRequests(_tileCache)) {
46860                     dispatch$5.call('loading');   // start the spinner
46861                 }
46862
46863                 var path = '/api/0.6/map?bbox=';
46864                 var options = { skipSeen: true };
46865
46866                 _tileCache.inflight[tile.id] = this.loadFromAPI(
46867                     path + tile.extent.toParam(),
46868                     function(err, parsed) {
46869                         delete _tileCache.inflight[tile.id];
46870                         if (!err) {
46871                             delete _tileCache.toLoad[tile.id];
46872                             _tileCache.loaded[tile.id] = true;
46873                             var bbox = tile.extent.bbox();
46874                             bbox.id = tile.id;
46875                             _tileCache.rtree.insert(bbox);
46876                         }
46877                         if (callback) {
46878                             callback(err, Object.assign({ data: parsed }, tile));
46879                         }
46880                         if (!hasInflightRequests(_tileCache)) {
46881                             dispatch$5.call('loaded');     // stop the spinner
46882                         }
46883                     },
46884                     options
46885                 );
46886             },
46887
46888
46889             isDataLoaded: function(loc) {
46890                 var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
46891                 return _tileCache.rtree.collides(bbox);
46892             },
46893
46894
46895             // load the tile that covers the given `loc`
46896             loadTileAtLoc: function(loc, callback) {
46897                 // Back off if the toLoad queue is filling up.. re #6417
46898                 // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to
46899                 // let users safely edit geometries which extend to unloaded tiles.  We can drop some.)
46900                 if (Object.keys(_tileCache.toLoad).length > 50) return;
46901
46902                 var k = geoZoomToScale(_tileZoom + 1);
46903                 var offset = geoRawMercator().scale(k)(loc);
46904                 var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] });
46905                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46906
46907                 tiles.forEach(function(tile) {
46908                     if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46909
46910                     _tileCache.toLoad[tile.id] = true;
46911                     this.loadTile(tile, callback);
46912                 }, this);
46913             },
46914
46915
46916             // Load notes from the API in tiles
46917             // GET /api/0.6/notes?bbox=
46918             loadNotes: function(projection, noteOptions) {
46919                 noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
46920                 if (_off) return;
46921
46922                 var that = this;
46923                 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
46924                 var throttleLoadUsers = throttle(function() {
46925                     var uids = Object.keys(_userCache.toLoad);
46926                     if (!uids.length) return;
46927                     that.loadUsers(uids, function() {});  // eagerly load user details
46928                 }, 750);
46929
46930                 // determine the needed tiles to cover the view
46931                 var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
46932
46933                 // abort inflight requests that are no longer needed
46934                 abortUnwantedRequests$2(_noteCache, tiles);
46935
46936                 // issue new requests..
46937                 tiles.forEach(function(tile) {
46938                     if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
46939
46940                     var options = { skipSeen: false };
46941                     _noteCache.inflight[tile.id] = that.loadFromAPI(
46942                         path + tile.extent.toParam(),
46943                         function(err) {
46944                             delete _noteCache.inflight[tile.id];
46945                             if (!err) {
46946                                 _noteCache.loaded[tile.id] = true;
46947                             }
46948                             throttleLoadUsers();
46949                             dispatch$5.call('loadedNotes');
46950                         },
46951                         options
46952                     );
46953                 });
46954             },
46955
46956
46957             // Create a note
46958             // POST /api/0.6/notes?params
46959             postNoteCreate: function(note, callback) {
46960                 if (!this.authenticated()) {
46961                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46962                 }
46963                 if (_noteCache.inflightPost[note.id]) {
46964                     return callback({ message: 'Note update already inflight', status: -2 }, note);
46965                 }
46966
46967                 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
46968
46969                 var comment = note.newComment;
46970                 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
46971
46972                 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
46973
46974                 _noteCache.inflightPost[note.id] = oauth.xhr(
46975                     { method: 'POST', path: path },
46976                     wrapcb(this, done, _connectionID)
46977                 );
46978
46979
46980                 function done(err, xml) {
46981                     delete _noteCache.inflightPost[note.id];
46982                     if (err) { return callback(err); }
46983
46984                     // we get the updated note back, remove from caches and reparse..
46985                     this.removeNote(note);
46986
46987                     var options = { skipSeen: false };
46988                     return parseXML(xml, function(err, results) {
46989                         if (err) {
46990                             return callback(err);
46991                         } else {
46992                             return callback(undefined, results[0]);
46993                         }
46994                     }, options);
46995                 }
46996             },
46997
46998
46999             // Update a note
47000             // POST /api/0.6/notes/#id/comment?text=comment
47001             // POST /api/0.6/notes/#id/close?text=comment
47002             // POST /api/0.6/notes/#id/reopen?text=comment
47003             postNoteUpdate: function(note, newStatus, callback) {
47004                 if (!this.authenticated()) {
47005                     return callback({ message: 'Not Authenticated', status: -3 }, note);
47006                 }
47007                 if (_noteCache.inflightPost[note.id]) {
47008                     return callback({ message: 'Note update already inflight', status: -2 }, note);
47009                 }
47010
47011                 var action;
47012                 if (note.status !== 'closed' && newStatus === 'closed') {
47013                     action = 'close';
47014                 } else if (note.status !== 'open' && newStatus === 'open') {
47015                     action = 'reopen';
47016                 } else {
47017                     action = 'comment';
47018                     if (!note.newComment) return; // when commenting, comment required
47019                 }
47020
47021                 var path = '/api/0.6/notes/' + note.id + '/' + action;
47022                 if (note.newComment) {
47023                     path += '?' + utilQsString({ text: note.newComment });
47024                 }
47025
47026                 _noteCache.inflightPost[note.id] = oauth.xhr(
47027                     { method: 'POST', path: path },
47028                     wrapcb(this, done, _connectionID)
47029                 );
47030
47031
47032                 function done(err, xml) {
47033                     delete _noteCache.inflightPost[note.id];
47034                     if (err) { return callback(err); }
47035
47036                     // we get the updated note back, remove from caches and reparse..
47037                     this.removeNote(note);
47038
47039                     // update closed note cache - used to populate `closed:note` changeset tag
47040                     if (action === 'close') {
47041                         _noteCache.closed[note.id] = true;
47042                     } else if (action === 'reopen') {
47043                         delete _noteCache.closed[note.id];
47044                     }
47045
47046                     var options = { skipSeen: false };
47047                     return parseXML(xml, function(err, results) {
47048                         if (err) {
47049                             return callback(err);
47050                         } else {
47051                             return callback(undefined, results[0]);
47052                         }
47053                     }, options);
47054                 }
47055             },
47056
47057
47058             switch: function(options) {
47059                 urlroot = options.urlroot;
47060
47061                 oauth.options(Object.assign({
47062                     url: urlroot,
47063                     loading: authLoading,
47064                     done: authDone
47065                 }, options));
47066
47067                 this.reset();
47068                 this.userChangesets(function() {});  // eagerly load user details/changesets
47069                 dispatch$5.call('change');
47070                 return this;
47071             },
47072
47073
47074             toggle: function(val) {
47075                 _off = !val;
47076                 return this;
47077             },
47078
47079
47080             isChangesetInflight: function() {
47081                 return !!_changeset.inflight;
47082             },
47083
47084
47085             // get/set cached data
47086             // This is used to save/restore the state when entering/exiting the walkthrough
47087             // Also used for testing purposes.
47088             caches: function(obj) {
47089                 function cloneCache(source) {
47090                     var target = {};
47091                     Object.keys(source).forEach(function(k) {
47092                         if (k === 'rtree') {
47093                             target.rtree = rbush_1().fromJSON(source.rtree.toJSON());  // clone rbush
47094                         } else if (k === 'note') {
47095                             target.note = {};
47096                             Object.keys(source.note).forEach(function(id) {
47097                                 target.note[id] = osmNote(source.note[id]);   // copy notes
47098                             });
47099                         } else {
47100                             target[k] = JSON.parse(JSON.stringify(source[k]));   // clone deep
47101                         }
47102                     });
47103                     return target;
47104                 }
47105
47106                 if (!arguments.length) {
47107                     return {
47108                         tile: cloneCache(_tileCache),
47109                         note: cloneCache(_noteCache),
47110                         user: cloneCache(_userCache)
47111                     };
47112                 }
47113
47114                 // access caches directly for testing (e.g., loading notes rtree)
47115                 if (obj === 'get') {
47116                     return {
47117                         tile: _tileCache,
47118                         note: _noteCache,
47119                         user: _userCache
47120                     };
47121                 }
47122
47123                 if (obj.tile) {
47124                     _tileCache = obj.tile;
47125                     _tileCache.inflight = {};
47126                 }
47127                 if (obj.note) {
47128                     _noteCache = obj.note;
47129                     _noteCache.inflight = {};
47130                     _noteCache.inflightPost = {};
47131                 }
47132                 if (obj.user) {
47133                     _userCache = obj.user;
47134                 }
47135
47136                 return this;
47137             },
47138
47139
47140             logout: function() {
47141                 _userChangesets = undefined;
47142                 _userDetails = undefined;
47143                 oauth.logout();
47144                 dispatch$5.call('change');
47145                 return this;
47146             },
47147
47148
47149             authenticated: function() {
47150                 return oauth.authenticated();
47151             },
47152
47153
47154             authenticate: function(callback) {
47155                 var that = this;
47156                 var cid = _connectionID;
47157                 _userChangesets = undefined;
47158                 _userDetails = undefined;
47159
47160                 function done(err, res) {
47161                     if (err) {
47162                         if (callback) callback(err);
47163                         return;
47164                     }
47165                     if (that.getConnectionId() !== cid) {
47166                         if (callback) callback({ message: 'Connection Switched', status: -1 });
47167                         return;
47168                     }
47169                     _rateLimitError = undefined;
47170                     dispatch$5.call('change');
47171                     if (callback) callback(err, res);
47172                     that.userChangesets(function() {});  // eagerly load user details/changesets
47173                 }
47174
47175                 return oauth.authenticate(done);
47176             },
47177
47178
47179             imageryBlacklists: function() {
47180                 return _blacklists;
47181             },
47182
47183
47184             tileZoom: function(val) {
47185                 if (!arguments.length) return _tileZoom;
47186                 _tileZoom = val;
47187                 return this;
47188             },
47189
47190
47191             // get all cached notes covering the viewport
47192             notes: function(projection) {
47193                 var viewport = projection.clipExtent();
47194                 var min = [viewport[0][0], viewport[1][1]];
47195                 var max = [viewport[1][0], viewport[0][1]];
47196                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
47197
47198                 return _noteCache.rtree.search(bbox)
47199                     .map(function(d) { return d.data; });
47200             },
47201
47202
47203             // get a single note from the cache
47204             getNote: function(id) {
47205                 return _noteCache.note[id];
47206             },
47207
47208
47209             // remove a single note from the cache
47210             removeNote: function(note) {
47211                 if (!(note instanceof osmNote) || !note.id) return;
47212
47213                 delete _noteCache.note[note.id];
47214                 updateRtree$2(encodeNoteRtree(note), false);  // false = remove
47215             },
47216
47217
47218             // replace a single note in the cache
47219             replaceNote: function(note) {
47220                 if (!(note instanceof osmNote) || !note.id) return;
47221
47222                 _noteCache.note[note.id] = note;
47223                 updateRtree$2(encodeNoteRtree(note), true);  // true = replace
47224                 return note;
47225             },
47226
47227
47228             // Get an array of note IDs closed during this session.
47229             // Used to populate `closed:note` changeset tag
47230             getClosedIDs: function() {
47231                 return Object.keys(_noteCache.closed).sort();
47232             }
47233
47234         };
47235
47236         var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
47237         var _inflight$1 = {};
47238         var _wikibaseCache = {};
47239         var _localeIDs = { en: false };
47240
47241
47242         var debouncedRequest = debounce(request, 500, { leading: false });
47243
47244         function request(url, callback) {
47245             if (_inflight$1[url]) return;
47246             var controller = new AbortController();
47247             _inflight$1[url] = controller;
47248
47249             d3_json(url, { signal: controller.signal })
47250                 .then(function(result) {
47251                     delete _inflight$1[url];
47252                     if (callback) callback(null, result);
47253                 })
47254                 .catch(function(err) {
47255                     delete _inflight$1[url];
47256                     if (err.name === 'AbortError') return;
47257                     if (callback) callback(err.message);
47258                 });
47259         }
47260
47261
47262         /**
47263          * Get the best string value from the descriptions/labels result
47264          * Note that if mediawiki doesn't recognize language code, it will return all values.
47265          * In that case, fallback to use English.
47266          * @param values object - either descriptions or labels
47267          * @param langCode String
47268          * @returns localized string
47269          */
47270         function localizedToString(values, langCode) {
47271             if (values) {
47272                 values = values[langCode] || values.en;
47273             }
47274             return values ? values.value : '';
47275         }
47276
47277
47278         var serviceOsmWikibase = {
47279
47280             init: function() {
47281                 _inflight$1 = {};
47282                 _wikibaseCache = {};
47283                 _localeIDs = {};
47284             },
47285
47286
47287             reset: function() {
47288                 Object.values(_inflight$1).forEach(function(controller) { controller.abort(); });
47289                 _inflight$1 = {};
47290             },
47291
47292
47293             /**
47294              * Get the best value for the property, or undefined if not found
47295              * @param entity object from wikibase
47296              * @param property string e.g. 'P4' for image
47297              * @param langCode string e.g. 'fr' for French
47298              */
47299             claimToValue: function(entity, property, langCode) {
47300                 if (!entity.claims[property]) return undefined;
47301                 var locale = _localeIDs[langCode];
47302                 var preferredPick, localePick;
47303
47304                 entity.claims[property].forEach(function(stmt) {
47305                     // If exists, use value limited to the needed language (has a qualifier P26 = locale)
47306                     // Or if not found, use the first value with the "preferred" rank
47307                     if (!preferredPick && stmt.rank === 'preferred') {
47308                         preferredPick = stmt;
47309                     }
47310                     if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
47311                         stmt.qualifiers.P26[0].datavalue.value.id === locale
47312                     ) {
47313                         localePick = stmt;
47314                     }
47315                 });
47316
47317                 var result = localePick || preferredPick;
47318                 if (result) {
47319                     var datavalue = result.mainsnak.datavalue;
47320                     return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
47321                 } else {
47322                     return undefined;
47323                 }
47324             },
47325
47326
47327             /**
47328              * Convert monolingual property into a key-value object (language -> value)
47329              * @param entity object from wikibase
47330              * @param property string e.g. 'P31' for monolingual wiki page title
47331              */
47332             monolingualClaimToValueObj: function(entity, property) {
47333                 if (!entity || !entity.claims[property]) return undefined;
47334
47335                 return entity.claims[property].reduce(function(acc, obj) {
47336                     var value = obj.mainsnak.datavalue.value;
47337                     acc[value.language] = value.text;
47338                     return acc;
47339                 }, {});
47340             },
47341
47342
47343             toSitelink: function(key, value) {
47344                 var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
47345                 return result.replace(/_/g, ' ').trim();
47346             },
47347
47348
47349             //
47350             // Pass params object of the form:
47351             // {
47352             //   key: 'string',
47353             //   value: 'string',
47354             //   rtype: 'string',
47355             //   langCode: 'string'
47356             // }
47357             //
47358             getEntity: function(params, callback) {
47359                 var doRequest = params.debounce ? debouncedRequest : request;
47360                 var that = this;
47361                 var titles = [];
47362                 var result = {};
47363                 var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
47364                 var keySitelink = params.key ? this.toSitelink(params.key) : false;
47365                 var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
47366                 var localeSitelink;
47367
47368                 if (params.langCode && _localeIDs[params.langCode] === undefined) {
47369                     // If this is the first time we are asking about this locale,
47370                     // fetch corresponding entity (if it exists), and cache it.
47371                     // If there is no such entry, cache `false` value to avoid re-requesting it.
47372                     localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
47373                     titles.push(localeSitelink);
47374                 }
47375
47376                 if (rtypeSitelink) {
47377                     if (_wikibaseCache[rtypeSitelink]) {
47378                         result.rtype = _wikibaseCache[rtypeSitelink];
47379                     } else {
47380                         titles.push(rtypeSitelink);
47381                     }
47382                 }
47383
47384                 if (keySitelink) {
47385                     if (_wikibaseCache[keySitelink]) {
47386                         result.key = _wikibaseCache[keySitelink];
47387                     } else {
47388                         titles.push(keySitelink);
47389                     }
47390                 }
47391
47392                 if (tagSitelink) {
47393                     if (_wikibaseCache[tagSitelink]) {
47394                         result.tag = _wikibaseCache[tagSitelink];
47395                     } else {
47396                         titles.push(tagSitelink);
47397                     }
47398                 }
47399
47400                 if (!titles.length) {
47401                     // Nothing to do, we already had everything in the cache
47402                     return callback(null, result);
47403                 }
47404
47405                 // Requesting just the user language code
47406                 // If backend recognizes the code, it will perform proper fallbacks,
47407                 // and the result will contain the requested code. If not, all values are returned:
47408                 // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
47409                 // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
47410                 var obj = {
47411                     action: 'wbgetentities',
47412                     sites: 'wiki',
47413                     titles: titles.join('|'),
47414                     languages: params.langCode,
47415                     languagefallback: 1,
47416                     origin: '*',
47417                     format: 'json',
47418                     // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
47419                     // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
47420                     // formatversion: 2,
47421                 };
47422
47423                 var url = apibase$3 + '?' + utilQsString(obj);
47424                 doRequest(url, function(err, d) {
47425                     if (err) {
47426                         callback(err);
47427                     } else if (!d.success || d.error) {
47428                         callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
47429                     } else {
47430                         var localeID = false;
47431                         Object.values(d.entities).forEach(function(res) {
47432                             if (res.missing !== '') {
47433                                 // Simplify access to the localized values
47434                                 res.description = localizedToString(res.descriptions, params.langCode);
47435                                 res.label = localizedToString(res.labels, params.langCode);
47436
47437                                 var title = res.sitelinks.wiki.title;
47438                                 if (title === rtypeSitelink) {
47439                                     _wikibaseCache[rtypeSitelink] = res;
47440                                     result.rtype = res;
47441                                 } else if (title === keySitelink) {
47442                                     _wikibaseCache[keySitelink] = res;
47443                                     result.key = res;
47444                                 } else if (title === tagSitelink) {
47445                                     _wikibaseCache[tagSitelink] = res;
47446                                     result.tag = res;
47447                                 } else if (title === localeSitelink) {
47448                                     localeID = res.id;
47449                                 } else {
47450                                     console.log('Unexpected title ' + title);  // eslint-disable-line no-console
47451                                 }
47452                             }
47453                         });
47454
47455                         if (localeSitelink) {
47456                             // If locale ID is not found, store false to prevent repeated queries
47457                             that.addLocale(params.langCode, localeID);
47458                         }
47459
47460                         callback(null, result);
47461                     }
47462                 });
47463             },
47464
47465
47466             //
47467             // Pass params object of the form:
47468             // {
47469             //   key: 'string',     // required
47470             //   value: 'string'    // optional
47471             // }
47472             //   -or-
47473             // {
47474             //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
47475             // }
47476             //
47477             // Get an result object used to display tag documentation
47478             // {
47479             //   title:        'string',
47480             //   description:  'string',
47481             //   editURL:      'string',
47482             //   imageURL:     'string',
47483             //   wiki:         { title: 'string', text: 'string', url: 'string' }
47484             // }
47485             //
47486             getDocs: function(params, callback) {
47487                 var that = this;
47488                 var langCode = utilDetect().locale.toLowerCase();
47489                 params.langCode = langCode;
47490
47491                 this.getEntity(params, function(err, data) {
47492                     if (err) {
47493                         callback(err);
47494                         return;
47495                     }
47496
47497                     var entity = data.rtype || data.tag || data.key;
47498                     if (!entity) {
47499                         callback('No entity');
47500                         return;
47501                     }
47502
47503                     // prepare result
47504                     var result = {
47505                         title: entity.title,
47506                         description: entity.description,
47507                         editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
47508                     };
47509
47510                     // add image
47511                     if (entity.claims) {
47512                         var imageroot;
47513                         var image = that.claimToValue(entity, 'P4', langCode);
47514                         if (image) {
47515                             imageroot = 'https://commons.wikimedia.org/w/index.php';
47516                         } else {
47517                             image = that.claimToValue(entity, 'P28', langCode);
47518                             if (image) {
47519                                 imageroot = 'https://wiki.openstreetmap.org/w/index.php';
47520                             }
47521                         }
47522                         if (imageroot && image) {
47523                             result.imageURL = imageroot + '?' + utilQsString({
47524                                 title: 'Special:Redirect/file/' + image,
47525                                 width: 400
47526                             });
47527                         }
47528                     }
47529
47530                     // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
47531                     // If neither tag nor key data item contain a wiki page in the needed language nor English,
47532                     // get the first found wiki page from either the tag or the key item.
47533                     var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
47534                     var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
47535                     var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
47536
47537                     // If exact language code does not exist, try to find the first part before the '-'
47538                     // BUG: in some cases, a more elaborate fallback logic might be needed
47539                     var langPrefix = langCode.split('-', 2)[0];
47540
47541                     // use the first acceptable wiki page
47542                     result.wiki =
47543                         getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
47544                         getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
47545                         getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
47546                         getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
47547                         getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
47548                         getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
47549                         getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
47550                         getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
47551                         getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
47552
47553                     callback(null, result);
47554
47555
47556                     // Helper method to get wiki info if a given language exists
47557                     function getWikiInfo(wiki, langCode, tKey) {
47558                         if (wiki && wiki[langCode]) {
47559                             return {
47560                                 title: wiki[langCode],
47561                                 text: tKey,
47562                                 url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
47563                             };
47564                         }
47565                     }
47566                 });
47567             },
47568
47569
47570             addLocale: function(langCode, qid) {
47571                 // Makes it easier to unit test
47572                 _localeIDs[langCode] = qid;
47573             },
47574
47575
47576             apibase: function(val) {
47577                 if (!arguments.length) return apibase$3;
47578                 apibase$3 = val;
47579                 return this;
47580             }
47581
47582         };
47583
47584         var jsonpCache = {};
47585         window.jsonpCache = jsonpCache;
47586
47587         function jsonpRequest(url, callback) {
47588             var request = {
47589                 abort: function() {}
47590             };
47591
47592             if (window.JSONP_FIX) {
47593                 if (window.JSONP_DELAY === 0) {
47594                     callback(window.JSONP_FIX);
47595                 } else {
47596                     var t = window.setTimeout(function() {
47597                         callback(window.JSONP_FIX);
47598                     }, window.JSONP_DELAY || 0);
47599
47600                     request.abort = function() { window.clearTimeout(t); };
47601                 }
47602
47603                 return request;
47604             }
47605
47606             function rand() {
47607                 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
47608                 var c = '';
47609                 var i = -1;
47610                 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
47611                 return c;
47612             }
47613
47614             function create(url) {
47615                 var e = url.match(/callback=(\w+)/);
47616                 var c = e ? e[1] : rand();
47617
47618                 jsonpCache[c] = function(data) {
47619                     if (jsonpCache[c]) {
47620                         callback(data);
47621                     }
47622                     finalize();
47623                 };
47624
47625                 function finalize() {
47626                     delete jsonpCache[c];
47627                     script.remove();
47628                 }
47629
47630                 request.abort = finalize;
47631                 return 'jsonpCache.' + c;
47632             }
47633
47634             var cb = create(url);
47635
47636             var script = d3_select('head')
47637                 .append('script')
47638                 .attr('type', 'text/javascript')
47639                 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
47640
47641             return request;
47642         }
47643
47644         var q = createCommonjsModule(function (module, exports) {
47645         // vim:ts=4:sts=4:sw=4:
47646         /*!
47647          *
47648          * Copyright 2009-2017 Kris Kowal under the terms of the MIT
47649          * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
47650          *
47651          * With parts by Tyler Close
47652          * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
47653          * at http://www.opensource.org/licenses/mit-license.html
47654          * Forked at ref_send.js version: 2009-05-11
47655          *
47656          * With parts by Mark Miller
47657          * Copyright (C) 2011 Google Inc.
47658          *
47659          * Licensed under the Apache License, Version 2.0 (the "License");
47660          * you may not use this file except in compliance with the License.
47661          * You may obtain a copy of the License at
47662          *
47663          * http://www.apache.org/licenses/LICENSE-2.0
47664          *
47665          * Unless required by applicable law or agreed to in writing, software
47666          * distributed under the License is distributed on an "AS IS" BASIS,
47667          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47668          * See the License for the specific language governing permissions and
47669          * limitations under the License.
47670          *
47671          */
47672
47673         (function (definition) {
47674
47675             // This file will function properly as a <script> tag, or a module
47676             // using CommonJS and NodeJS or RequireJS module formats.  In
47677             // Common/Node/RequireJS, the module exports the Q API and when
47678             // executed as a simple <script>, it creates a Q global instead.
47679
47680             // Montage Require
47681             if (typeof bootstrap === "function") {
47682                 bootstrap("promise", definition);
47683
47684             // CommonJS
47685             } else {
47686                 module.exports = definition();
47687
47688             // RequireJS
47689             }
47690
47691         })(function () {
47692
47693         var hasStacks = false;
47694         try {
47695             throw new Error();
47696         } catch (e) {
47697             hasStacks = !!e.stack;
47698         }
47699
47700         // All code after this point will be filtered from stack traces reported
47701         // by Q.
47702         var qStartingLine = captureLine();
47703         var qFileName;
47704
47705         // shims
47706
47707         // used for fallback in "allResolved"
47708         var noop = function () {};
47709
47710         // Use the fastest possible means to execute a task in a future turn
47711         // of the event loop.
47712         var nextTick =(function () {
47713             // linked list of tasks (single, with head node)
47714             var head = {task: void 0, next: null};
47715             var tail = head;
47716             var flushing = false;
47717             var requestTick = void 0;
47718             var isNodeJS = false;
47719             // queue for late tasks, used by unhandled rejection tracking
47720             var laterQueue = [];
47721
47722             function flush() {
47723                 /* jshint loopfunc: true */
47724                 var task, domain;
47725
47726                 while (head.next) {
47727                     head = head.next;
47728                     task = head.task;
47729                     head.task = void 0;
47730                     domain = head.domain;
47731
47732                     if (domain) {
47733                         head.domain = void 0;
47734                         domain.enter();
47735                     }
47736                     runSingle(task, domain);
47737
47738                 }
47739                 while (laterQueue.length) {
47740                     task = laterQueue.pop();
47741                     runSingle(task);
47742                 }
47743                 flushing = false;
47744             }
47745             // runs a single function in the async queue
47746             function runSingle(task, domain) {
47747                 try {
47748                     task();
47749
47750                 } catch (e) {
47751                     if (isNodeJS) {
47752                         // In node, uncaught exceptions are considered fatal errors.
47753                         // Re-throw them synchronously to interrupt flushing!
47754
47755                         // Ensure continuation if the uncaught exception is suppressed
47756                         // listening "uncaughtException" events (as domains does).
47757                         // Continue in next event to avoid tick recursion.
47758                         if (domain) {
47759                             domain.exit();
47760                         }
47761                         setTimeout(flush, 0);
47762                         if (domain) {
47763                             domain.enter();
47764                         }
47765
47766                         throw e;
47767
47768                     } else {
47769                         // In browsers, uncaught exceptions are not fatal.
47770                         // Re-throw them asynchronously to avoid slow-downs.
47771                         setTimeout(function () {
47772                             throw e;
47773                         }, 0);
47774                     }
47775                 }
47776
47777                 if (domain) {
47778                     domain.exit();
47779                 }
47780             }
47781
47782             nextTick = function (task) {
47783                 tail = tail.next = {
47784                     task: task,
47785                     domain: isNodeJS && process.domain,
47786                     next: null
47787                 };
47788
47789                 if (!flushing) {
47790                     flushing = true;
47791                     requestTick();
47792                 }
47793             };
47794
47795             if (typeof process === "object" &&
47796                 process.toString() === "[object process]" && process.nextTick) {
47797                 // Ensure Q is in a real Node environment, with a `process.nextTick`.
47798                 // To see through fake Node environments:
47799                 // * Mocha test runner - exposes a `process` global without a `nextTick`
47800                 // * Browserify - exposes a `process.nexTick` function that uses
47801                 //   `setTimeout`. In this case `setImmediate` is preferred because
47802                 //    it is faster. Browserify's `process.toString()` yields
47803                 //   "[object Object]", while in a real Node environment
47804                 //   `process.toString()` yields "[object process]".
47805                 isNodeJS = true;
47806
47807                 requestTick = function () {
47808                     process.nextTick(flush);
47809                 };
47810
47811             } else if (typeof setImmediate === "function") {
47812                 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
47813                 if (typeof window !== "undefined") {
47814                     requestTick = setImmediate.bind(window, flush);
47815                 } else {
47816                     requestTick = function () {
47817                         setImmediate(flush);
47818                     };
47819                 }
47820
47821             } else if (typeof MessageChannel !== "undefined") {
47822                 // modern browsers
47823                 // http://www.nonblocking.io/2011/06/windownexttick.html
47824                 var channel = new MessageChannel();
47825                 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
47826                 // working message ports the first time a page loads.
47827                 channel.port1.onmessage = function () {
47828                     requestTick = requestPortTick;
47829                     channel.port1.onmessage = flush;
47830                     flush();
47831                 };
47832                 var requestPortTick = function () {
47833                     // Opera requires us to provide a message payload, regardless of
47834                     // whether we use it.
47835                     channel.port2.postMessage(0);
47836                 };
47837                 requestTick = function () {
47838                     setTimeout(flush, 0);
47839                     requestPortTick();
47840                 };
47841
47842             } else {
47843                 // old browsers
47844                 requestTick = function () {
47845                     setTimeout(flush, 0);
47846                 };
47847             }
47848             // runs a task after all other tasks have been run
47849             // this is useful for unhandled rejection tracking that needs to happen
47850             // after all `then`d tasks have been run.
47851             nextTick.runAfter = function (task) {
47852                 laterQueue.push(task);
47853                 if (!flushing) {
47854                     flushing = true;
47855                     requestTick();
47856                 }
47857             };
47858             return nextTick;
47859         })();
47860
47861         // Attempt to make generics safe in the face of downstream
47862         // modifications.
47863         // There is no situation where this is necessary.
47864         // If you need a security guarantee, these primordials need to be
47865         // deeply frozen anyway, and if you don’t need a security guarantee,
47866         // this is just plain paranoid.
47867         // However, this **might** have the nice side-effect of reducing the size of
47868         // the minified code by reducing x.call() to merely x()
47869         // See Mark Miller’s explanation of what this does.
47870         // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
47871         var call = Function.call;
47872         function uncurryThis(f) {
47873             return function () {
47874                 return call.apply(f, arguments);
47875             };
47876         }
47877         // This is equivalent, but slower:
47878         // uncurryThis = Function_bind.bind(Function_bind.call);
47879         // http://jsperf.com/uncurrythis
47880
47881         var array_slice = uncurryThis(Array.prototype.slice);
47882
47883         var array_reduce = uncurryThis(
47884             Array.prototype.reduce || function (callback, basis) {
47885                 var index = 0,
47886                     length = this.length;
47887                 // concerning the initial value, if one is not provided
47888                 if (arguments.length === 1) {
47889                     // seek to the first value in the array, accounting
47890                     // for the possibility that is is a sparse array
47891                     do {
47892                         if (index in this) {
47893                             basis = this[index++];
47894                             break;
47895                         }
47896                         if (++index >= length) {
47897                             throw new TypeError();
47898                         }
47899                     } while (1);
47900                 }
47901                 // reduce
47902                 for (; index < length; index++) {
47903                     // account for the possibility that the array is sparse
47904                     if (index in this) {
47905                         basis = callback(basis, this[index], index);
47906                     }
47907                 }
47908                 return basis;
47909             }
47910         );
47911
47912         var array_indexOf = uncurryThis(
47913             Array.prototype.indexOf || function (value) {
47914                 // not a very good shim, but good enough for our one use of it
47915                 for (var i = 0; i < this.length; i++) {
47916                     if (this[i] === value) {
47917                         return i;
47918                     }
47919                 }
47920                 return -1;
47921             }
47922         );
47923
47924         var array_map = uncurryThis(
47925             Array.prototype.map || function (callback, thisp) {
47926                 var self = this;
47927                 var collect = [];
47928                 array_reduce(self, function (undefined, value, index) {
47929                     collect.push(callback.call(thisp, value, index, self));
47930                 }, void 0);
47931                 return collect;
47932             }
47933         );
47934
47935         var object_create = Object.create || function (prototype) {
47936             function Type() { }
47937             Type.prototype = prototype;
47938             return new Type();
47939         };
47940
47941         var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
47942             obj[prop] = descriptor.value;
47943             return obj;
47944         };
47945
47946         var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
47947
47948         var object_keys = Object.keys || function (object) {
47949             var keys = [];
47950             for (var key in object) {
47951                 if (object_hasOwnProperty(object, key)) {
47952                     keys.push(key);
47953                 }
47954             }
47955             return keys;
47956         };
47957
47958         var object_toString = uncurryThis(Object.prototype.toString);
47959
47960         function isObject(value) {
47961             return value === Object(value);
47962         }
47963
47964         // generator related shims
47965
47966         // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
47967         function isStopIteration(exception) {
47968             return (
47969                 object_toString(exception) === "[object StopIteration]" ||
47970                 exception instanceof QReturnValue
47971             );
47972         }
47973
47974         // FIXME: Remove this helper and Q.return once ES6 generators are in
47975         // SpiderMonkey.
47976         var QReturnValue;
47977         if (typeof ReturnValue !== "undefined") {
47978             QReturnValue = ReturnValue;
47979         } else {
47980             QReturnValue = function (value) {
47981                 this.value = value;
47982             };
47983         }
47984
47985         // long stack traces
47986
47987         var STACK_JUMP_SEPARATOR = "From previous event:";
47988
47989         function makeStackTraceLong(error, promise) {
47990             // If possible, transform the error stack trace by removing Node and Q
47991             // cruft, then concatenating with the stack trace of `promise`. See #57.
47992             if (hasStacks &&
47993                 promise.stack &&
47994                 typeof error === "object" &&
47995                 error !== null &&
47996                 error.stack
47997             ) {
47998                 var stacks = [];
47999                 for (var p = promise; !!p; p = p.source) {
48000                     if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
48001                         object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
48002                         stacks.unshift(p.stack);
48003                     }
48004                 }
48005                 stacks.unshift(error.stack);
48006
48007                 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
48008                 var stack = filterStackString(concatedStacks);
48009                 object_defineProperty(error, "stack", {value: stack, configurable: true});
48010             }
48011         }
48012
48013         function filterStackString(stackString) {
48014             var lines = stackString.split("\n");
48015             var desiredLines = [];
48016             for (var i = 0; i < lines.length; ++i) {
48017                 var line = lines[i];
48018
48019                 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
48020                     desiredLines.push(line);
48021                 }
48022             }
48023             return desiredLines.join("\n");
48024         }
48025
48026         function isNodeFrame(stackLine) {
48027             return stackLine.indexOf("(module.js:") !== -1 ||
48028                    stackLine.indexOf("(node.js:") !== -1;
48029         }
48030
48031         function getFileNameAndLineNumber(stackLine) {
48032             // Named functions: "at functionName (filename:lineNumber:columnNumber)"
48033             // In IE10 function name can have spaces ("Anonymous function") O_o
48034             var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
48035             if (attempt1) {
48036                 return [attempt1[1], Number(attempt1[2])];
48037             }
48038
48039             // Anonymous functions: "at filename:lineNumber:columnNumber"
48040             var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
48041             if (attempt2) {
48042                 return [attempt2[1], Number(attempt2[2])];
48043             }
48044
48045             // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
48046             var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
48047             if (attempt3) {
48048                 return [attempt3[1], Number(attempt3[2])];
48049             }
48050         }
48051
48052         function isInternalFrame(stackLine) {
48053             var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
48054
48055             if (!fileNameAndLineNumber) {
48056                 return false;
48057             }
48058
48059             var fileName = fileNameAndLineNumber[0];
48060             var lineNumber = fileNameAndLineNumber[1];
48061
48062             return fileName === qFileName &&
48063                 lineNumber >= qStartingLine &&
48064                 lineNumber <= qEndingLine;
48065         }
48066
48067         // discover own file name and line number range for filtering stack
48068         // traces
48069         function captureLine() {
48070             if (!hasStacks) {
48071                 return;
48072             }
48073
48074             try {
48075                 throw new Error();
48076             } catch (e) {
48077                 var lines = e.stack.split("\n");
48078                 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
48079                 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
48080                 if (!fileNameAndLineNumber) {
48081                     return;
48082                 }
48083
48084                 qFileName = fileNameAndLineNumber[0];
48085                 return fileNameAndLineNumber[1];
48086             }
48087         }
48088
48089         function deprecate(callback, name, alternative) {
48090             return function () {
48091                 if (typeof console !== "undefined" &&
48092                     typeof console.warn === "function") {
48093                     console.warn(name + " is deprecated, use " + alternative +
48094                                  " instead.", new Error("").stack);
48095                 }
48096                 return callback.apply(callback, arguments);
48097             };
48098         }
48099
48100         // end of shims
48101         // beginning of real work
48102
48103         /**
48104          * Constructs a promise for an immediate reference, passes promises through, or
48105          * coerces promises from different systems.
48106          * @param value immediate reference or promise
48107          */
48108         function Q(value) {
48109             // If the object is already a Promise, return it directly.  This enables
48110             // the resolve function to both be used to created references from objects,
48111             // but to tolerably coerce non-promises to promises.
48112             if (value instanceof Promise) {
48113                 return value;
48114             }
48115
48116             // assimilate thenables
48117             if (isPromiseAlike(value)) {
48118                 return coerce(value);
48119             } else {
48120                 return fulfill(value);
48121             }
48122         }
48123         Q.resolve = Q;
48124
48125         /**
48126          * Performs a task in a future turn of the event loop.
48127          * @param {Function} task
48128          */
48129         Q.nextTick = nextTick;
48130
48131         /**
48132          * Controls whether or not long stack traces will be on
48133          */
48134         Q.longStackSupport = false;
48135
48136         /**
48137          * The counter is used to determine the stopping point for building
48138          * long stack traces. In makeStackTraceLong we walk backwards through
48139          * the linked list of promises, only stacks which were created before
48140          * the rejection are concatenated.
48141          */
48142         var longStackCounter = 1;
48143
48144         // enable long stacks if Q_DEBUG is set
48145         if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
48146             Q.longStackSupport = true;
48147         }
48148
48149         /**
48150          * Constructs a {promise, resolve, reject} object.
48151          *
48152          * `resolve` is a callback to invoke with a more resolved value for the
48153          * promise. To fulfill the promise, invoke `resolve` with any value that is
48154          * not a thenable. To reject the promise, invoke `resolve` with a rejected
48155          * thenable, or invoke `reject` with the reason directly. To resolve the
48156          * promise to another thenable, thus putting it in the same state, invoke
48157          * `resolve` with that other thenable.
48158          */
48159         Q.defer = defer;
48160         function defer() {
48161             // if "messages" is an "Array", that indicates that the promise has not yet
48162             // been resolved.  If it is "undefined", it has been resolved.  Each
48163             // element of the messages array is itself an array of complete arguments to
48164             // forward to the resolved promise.  We coerce the resolution value to a
48165             // promise using the `resolve` function because it handles both fully
48166             // non-thenable values and other thenables gracefully.
48167             var messages = [], progressListeners = [], resolvedPromise;
48168
48169             var deferred = object_create(defer.prototype);
48170             var promise = object_create(Promise.prototype);
48171
48172             promise.promiseDispatch = function (resolve, op, operands) {
48173                 var args = array_slice(arguments);
48174                 if (messages) {
48175                     messages.push(args);
48176                     if (op === "when" && operands[1]) { // progress operand
48177                         progressListeners.push(operands[1]);
48178                     }
48179                 } else {
48180                     Q.nextTick(function () {
48181                         resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
48182                     });
48183                 }
48184             };
48185
48186             // XXX deprecated
48187             promise.valueOf = function () {
48188                 if (messages) {
48189                     return promise;
48190                 }
48191                 var nearerValue = nearer(resolvedPromise);
48192                 if (isPromise(nearerValue)) {
48193                     resolvedPromise = nearerValue; // shorten chain
48194                 }
48195                 return nearerValue;
48196             };
48197
48198             promise.inspect = function () {
48199                 if (!resolvedPromise) {
48200                     return { state: "pending" };
48201                 }
48202                 return resolvedPromise.inspect();
48203             };
48204
48205             if (Q.longStackSupport && hasStacks) {
48206                 try {
48207                     throw new Error();
48208                 } catch (e) {
48209                     // NOTE: don't try to use `Error.captureStackTrace` or transfer the
48210                     // accessor around; that causes memory leaks as per GH-111. Just
48211                     // reify the stack trace as a string ASAP.
48212                     //
48213                     // At the same time, cut off the first line; it's always just
48214                     // "[object Promise]\n", as per the `toString`.
48215                     promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
48216                     promise.stackCounter = longStackCounter++;
48217                 }
48218             }
48219
48220             // NOTE: we do the checks for `resolvedPromise` in each method, instead of
48221             // consolidating them into `become`, since otherwise we'd create new
48222             // promises with the lines `become(whatever(value))`. See e.g. GH-252.
48223
48224             function become(newPromise) {
48225                 resolvedPromise = newPromise;
48226
48227                 if (Q.longStackSupport && hasStacks) {
48228                     // Only hold a reference to the new promise if long stacks
48229                     // are enabled to reduce memory usage
48230                     promise.source = newPromise;
48231                 }
48232
48233                 array_reduce(messages, function (undefined, message) {
48234                     Q.nextTick(function () {
48235                         newPromise.promiseDispatch.apply(newPromise, message);
48236                     });
48237                 }, void 0);
48238
48239                 messages = void 0;
48240                 progressListeners = void 0;
48241             }
48242
48243             deferred.promise = promise;
48244             deferred.resolve = function (value) {
48245                 if (resolvedPromise) {
48246                     return;
48247                 }
48248
48249                 become(Q(value));
48250             };
48251
48252             deferred.fulfill = function (value) {
48253                 if (resolvedPromise) {
48254                     return;
48255                 }
48256
48257                 become(fulfill(value));
48258             };
48259             deferred.reject = function (reason) {
48260                 if (resolvedPromise) {
48261                     return;
48262                 }
48263
48264                 become(reject(reason));
48265             };
48266             deferred.notify = function (progress) {
48267                 if (resolvedPromise) {
48268                     return;
48269                 }
48270
48271                 array_reduce(progressListeners, function (undefined, progressListener) {
48272                     Q.nextTick(function () {
48273                         progressListener(progress);
48274                     });
48275                 }, void 0);
48276             };
48277
48278             return deferred;
48279         }
48280
48281         /**
48282          * Creates a Node-style callback that will resolve or reject the deferred
48283          * promise.
48284          * @returns a nodeback
48285          */
48286         defer.prototype.makeNodeResolver = function () {
48287             var self = this;
48288             return function (error, value) {
48289                 if (error) {
48290                     self.reject(error);
48291                 } else if (arguments.length > 2) {
48292                     self.resolve(array_slice(arguments, 1));
48293                 } else {
48294                     self.resolve(value);
48295                 }
48296             };
48297         };
48298
48299         /**
48300          * @param resolver {Function} a function that returns nothing and accepts
48301          * the resolve, reject, and notify functions for a deferred.
48302          * @returns a promise that may be resolved with the given resolve and reject
48303          * functions, or rejected by a thrown exception in resolver
48304          */
48305         Q.Promise = promise; // ES6
48306         Q.promise = promise;
48307         function promise(resolver) {
48308             if (typeof resolver !== "function") {
48309                 throw new TypeError("resolver must be a function.");
48310             }
48311             var deferred = defer();
48312             try {
48313                 resolver(deferred.resolve, deferred.reject, deferred.notify);
48314             } catch (reason) {
48315                 deferred.reject(reason);
48316             }
48317             return deferred.promise;
48318         }
48319
48320         promise.race = race; // ES6
48321         promise.all = all; // ES6
48322         promise.reject = reject; // ES6
48323         promise.resolve = Q; // ES6
48324
48325         // XXX experimental.  This method is a way to denote that a local value is
48326         // serializable and should be immediately dispatched to a remote upon request,
48327         // instead of passing a reference.
48328         Q.passByCopy = function (object) {
48329             //freeze(object);
48330             //passByCopies.set(object, true);
48331             return object;
48332         };
48333
48334         Promise.prototype.passByCopy = function () {
48335             //freeze(object);
48336             //passByCopies.set(object, true);
48337             return this;
48338         };
48339
48340         /**
48341          * If two promises eventually fulfill to the same value, promises that value,
48342          * but otherwise rejects.
48343          * @param x {Any*}
48344          * @param y {Any*}
48345          * @returns {Any*} a promise for x and y if they are the same, but a rejection
48346          * otherwise.
48347          *
48348          */
48349         Q.join = function (x, y) {
48350             return Q(x).join(y);
48351         };
48352
48353         Promise.prototype.join = function (that) {
48354             return Q([this, that]).spread(function (x, y) {
48355                 if (x === y) {
48356                     // TODO: "===" should be Object.is or equiv
48357                     return x;
48358                 } else {
48359                     throw new Error("Q can't join: not the same: " + x + " " + y);
48360                 }
48361             });
48362         };
48363
48364         /**
48365          * Returns a promise for the first of an array of promises to become settled.
48366          * @param answers {Array[Any*]} promises to race
48367          * @returns {Any*} the first promise to be settled
48368          */
48369         Q.race = race;
48370         function race(answerPs) {
48371             return promise(function (resolve, reject) {
48372                 // Switch to this once we can assume at least ES5
48373                 // answerPs.forEach(function (answerP) {
48374                 //     Q(answerP).then(resolve, reject);
48375                 // });
48376                 // Use this in the meantime
48377                 for (var i = 0, len = answerPs.length; i < len; i++) {
48378                     Q(answerPs[i]).then(resolve, reject);
48379                 }
48380             });
48381         }
48382
48383         Promise.prototype.race = function () {
48384             return this.then(Q.race);
48385         };
48386
48387         /**
48388          * Constructs a Promise with a promise descriptor object and optional fallback
48389          * function.  The descriptor contains methods like when(rejected), get(name),
48390          * set(name, value), post(name, args), and delete(name), which all
48391          * return either a value, a promise for a value, or a rejection.  The fallback
48392          * accepts the operation name, a resolver, and any further arguments that would
48393          * have been forwarded to the appropriate method above had a method been
48394          * provided with the proper name.  The API makes no guarantees about the nature
48395          * of the returned object, apart from that it is usable whereever promises are
48396          * bought and sold.
48397          */
48398         Q.makePromise = Promise;
48399         function Promise(descriptor, fallback, inspect) {
48400             if (fallback === void 0) {
48401                 fallback = function (op) {
48402                     return reject(new Error(
48403                         "Promise does not support operation: " + op
48404                     ));
48405                 };
48406             }
48407             if (inspect === void 0) {
48408                 inspect = function () {
48409                     return {state: "unknown"};
48410                 };
48411             }
48412
48413             var promise = object_create(Promise.prototype);
48414
48415             promise.promiseDispatch = function (resolve, op, args) {
48416                 var result;
48417                 try {
48418                     if (descriptor[op]) {
48419                         result = descriptor[op].apply(promise, args);
48420                     } else {
48421                         result = fallback.call(promise, op, args);
48422                     }
48423                 } catch (exception) {
48424                     result = reject(exception);
48425                 }
48426                 if (resolve) {
48427                     resolve(result);
48428                 }
48429             };
48430
48431             promise.inspect = inspect;
48432
48433             // XXX deprecated `valueOf` and `exception` support
48434             if (inspect) {
48435                 var inspected = inspect();
48436                 if (inspected.state === "rejected") {
48437                     promise.exception = inspected.reason;
48438                 }
48439
48440                 promise.valueOf = function () {
48441                     var inspected = inspect();
48442                     if (inspected.state === "pending" ||
48443                         inspected.state === "rejected") {
48444                         return promise;
48445                     }
48446                     return inspected.value;
48447                 };
48448             }
48449
48450             return promise;
48451         }
48452
48453         Promise.prototype.toString = function () {
48454             return "[object Promise]";
48455         };
48456
48457         Promise.prototype.then = function (fulfilled, rejected, progressed) {
48458             var self = this;
48459             var deferred = defer();
48460             var done = false;   // ensure the untrusted promise makes at most a
48461                                 // single call to one of the callbacks
48462
48463             function _fulfilled(value) {
48464                 try {
48465                     return typeof fulfilled === "function" ? fulfilled(value) : value;
48466                 } catch (exception) {
48467                     return reject(exception);
48468                 }
48469             }
48470
48471             function _rejected(exception) {
48472                 if (typeof rejected === "function") {
48473                     makeStackTraceLong(exception, self);
48474                     try {
48475                         return rejected(exception);
48476                     } catch (newException) {
48477                         return reject(newException);
48478                     }
48479                 }
48480                 return reject(exception);
48481             }
48482
48483             function _progressed(value) {
48484                 return typeof progressed === "function" ? progressed(value) : value;
48485             }
48486
48487             Q.nextTick(function () {
48488                 self.promiseDispatch(function (value) {
48489                     if (done) {
48490                         return;
48491                     }
48492                     done = true;
48493
48494                     deferred.resolve(_fulfilled(value));
48495                 }, "when", [function (exception) {
48496                     if (done) {
48497                         return;
48498                     }
48499                     done = true;
48500
48501                     deferred.resolve(_rejected(exception));
48502                 }]);
48503             });
48504
48505             // Progress propagator need to be attached in the current tick.
48506             self.promiseDispatch(void 0, "when", [void 0, function (value) {
48507                 var newValue;
48508                 var threw = false;
48509                 try {
48510                     newValue = _progressed(value);
48511                 } catch (e) {
48512                     threw = true;
48513                     if (Q.onerror) {
48514                         Q.onerror(e);
48515                     } else {
48516                         throw e;
48517                     }
48518                 }
48519
48520                 if (!threw) {
48521                     deferred.notify(newValue);
48522                 }
48523             }]);
48524
48525             return deferred.promise;
48526         };
48527
48528         Q.tap = function (promise, callback) {
48529             return Q(promise).tap(callback);
48530         };
48531
48532         /**
48533          * Works almost like "finally", but not called for rejections.
48534          * Original resolution value is passed through callback unaffected.
48535          * Callback may return a promise that will be awaited for.
48536          * @param {Function} callback
48537          * @returns {Q.Promise}
48538          * @example
48539          * doSomething()
48540          *   .then(...)
48541          *   .tap(console.log)
48542          *   .then(...);
48543          */
48544         Promise.prototype.tap = function (callback) {
48545             callback = Q(callback);
48546
48547             return this.then(function (value) {
48548                 return callback.fcall(value).thenResolve(value);
48549             });
48550         };
48551
48552         /**
48553          * Registers an observer on a promise.
48554          *
48555          * Guarantees:
48556          *
48557          * 1. that fulfilled and rejected will be called only once.
48558          * 2. that either the fulfilled callback or the rejected callback will be
48559          *    called, but not both.
48560          * 3. that fulfilled and rejected will not be called in this turn.
48561          *
48562          * @param value      promise or immediate reference to observe
48563          * @param fulfilled  function to be called with the fulfilled value
48564          * @param rejected   function to be called with the rejection exception
48565          * @param progressed function to be called on any progress notifications
48566          * @return promise for the return value from the invoked callback
48567          */
48568         Q.when = when;
48569         function when(value, fulfilled, rejected, progressed) {
48570             return Q(value).then(fulfilled, rejected, progressed);
48571         }
48572
48573         Promise.prototype.thenResolve = function (value) {
48574             return this.then(function () { return value; });
48575         };
48576
48577         Q.thenResolve = function (promise, value) {
48578             return Q(promise).thenResolve(value);
48579         };
48580
48581         Promise.prototype.thenReject = function (reason) {
48582             return this.then(function () { throw reason; });
48583         };
48584
48585         Q.thenReject = function (promise, reason) {
48586             return Q(promise).thenReject(reason);
48587         };
48588
48589         /**
48590          * If an object is not a promise, it is as "near" as possible.
48591          * If a promise is rejected, it is as "near" as possible too.
48592          * If it’s a fulfilled promise, the fulfillment value is nearer.
48593          * If it’s a deferred promise and the deferred has been resolved, the
48594          * resolution is "nearer".
48595          * @param object
48596          * @returns most resolved (nearest) form of the object
48597          */
48598
48599         // XXX should we re-do this?
48600         Q.nearer = nearer;
48601         function nearer(value) {
48602             if (isPromise(value)) {
48603                 var inspected = value.inspect();
48604                 if (inspected.state === "fulfilled") {
48605                     return inspected.value;
48606                 }
48607             }
48608             return value;
48609         }
48610
48611         /**
48612          * @returns whether the given object is a promise.
48613          * Otherwise it is a fulfilled value.
48614          */
48615         Q.isPromise = isPromise;
48616         function isPromise(object) {
48617             return object instanceof Promise;
48618         }
48619
48620         Q.isPromiseAlike = isPromiseAlike;
48621         function isPromiseAlike(object) {
48622             return isObject(object) && typeof object.then === "function";
48623         }
48624
48625         /**
48626          * @returns whether the given object is a pending promise, meaning not
48627          * fulfilled or rejected.
48628          */
48629         Q.isPending = isPending;
48630         function isPending(object) {
48631             return isPromise(object) && object.inspect().state === "pending";
48632         }
48633
48634         Promise.prototype.isPending = function () {
48635             return this.inspect().state === "pending";
48636         };
48637
48638         /**
48639          * @returns whether the given object is a value or fulfilled
48640          * promise.
48641          */
48642         Q.isFulfilled = isFulfilled;
48643         function isFulfilled(object) {
48644             return !isPromise(object) || object.inspect().state === "fulfilled";
48645         }
48646
48647         Promise.prototype.isFulfilled = function () {
48648             return this.inspect().state === "fulfilled";
48649         };
48650
48651         /**
48652          * @returns whether the given object is a rejected promise.
48653          */
48654         Q.isRejected = isRejected;
48655         function isRejected(object) {
48656             return isPromise(object) && object.inspect().state === "rejected";
48657         }
48658
48659         Promise.prototype.isRejected = function () {
48660             return this.inspect().state === "rejected";
48661         };
48662
48663         //// BEGIN UNHANDLED REJECTION TRACKING
48664
48665         // This promise library consumes exceptions thrown in handlers so they can be
48666         // handled by a subsequent promise.  The exceptions get added to this array when
48667         // they are created, and removed when they are handled.  Note that in ES6 or
48668         // shimmed environments, this would naturally be a `Set`.
48669         var unhandledReasons = [];
48670         var unhandledRejections = [];
48671         var reportedUnhandledRejections = [];
48672         var trackUnhandledRejections = true;
48673
48674         function resetUnhandledRejections() {
48675             unhandledReasons.length = 0;
48676             unhandledRejections.length = 0;
48677
48678             if (!trackUnhandledRejections) {
48679                 trackUnhandledRejections = true;
48680             }
48681         }
48682
48683         function trackRejection(promise, reason) {
48684             if (!trackUnhandledRejections) {
48685                 return;
48686             }
48687             if (typeof process === "object" && typeof process.emit === "function") {
48688                 Q.nextTick.runAfter(function () {
48689                     if (array_indexOf(unhandledRejections, promise) !== -1) {
48690                         process.emit("unhandledRejection", reason, promise);
48691                         reportedUnhandledRejections.push(promise);
48692                     }
48693                 });
48694             }
48695
48696             unhandledRejections.push(promise);
48697             if (reason && typeof reason.stack !== "undefined") {
48698                 unhandledReasons.push(reason.stack);
48699             } else {
48700                 unhandledReasons.push("(no stack) " + reason);
48701             }
48702         }
48703
48704         function untrackRejection(promise) {
48705             if (!trackUnhandledRejections) {
48706                 return;
48707             }
48708
48709             var at = array_indexOf(unhandledRejections, promise);
48710             if (at !== -1) {
48711                 if (typeof process === "object" && typeof process.emit === "function") {
48712                     Q.nextTick.runAfter(function () {
48713                         var atReport = array_indexOf(reportedUnhandledRejections, promise);
48714                         if (atReport !== -1) {
48715                             process.emit("rejectionHandled", unhandledReasons[at], promise);
48716                             reportedUnhandledRejections.splice(atReport, 1);
48717                         }
48718                     });
48719                 }
48720                 unhandledRejections.splice(at, 1);
48721                 unhandledReasons.splice(at, 1);
48722             }
48723         }
48724
48725         Q.resetUnhandledRejections = resetUnhandledRejections;
48726
48727         Q.getUnhandledReasons = function () {
48728             // Make a copy so that consumers can't interfere with our internal state.
48729             return unhandledReasons.slice();
48730         };
48731
48732         Q.stopUnhandledRejectionTracking = function () {
48733             resetUnhandledRejections();
48734             trackUnhandledRejections = false;
48735         };
48736
48737         resetUnhandledRejections();
48738
48739         //// END UNHANDLED REJECTION TRACKING
48740
48741         /**
48742          * Constructs a rejected promise.
48743          * @param reason value describing the failure
48744          */
48745         Q.reject = reject;
48746         function reject(reason) {
48747             var rejection = Promise({
48748                 "when": function (rejected) {
48749                     // note that the error has been handled
48750                     if (rejected) {
48751                         untrackRejection(this);
48752                     }
48753                     return rejected ? rejected(reason) : this;
48754                 }
48755             }, function fallback() {
48756                 return this;
48757             }, function inspect() {
48758                 return { state: "rejected", reason: reason };
48759             });
48760
48761             // Note that the reason has not been handled.
48762             trackRejection(rejection, reason);
48763
48764             return rejection;
48765         }
48766
48767         /**
48768          * Constructs a fulfilled promise for an immediate reference.
48769          * @param value immediate reference
48770          */
48771         Q.fulfill = fulfill;
48772         function fulfill(value) {
48773             return Promise({
48774                 "when": function () {
48775                     return value;
48776                 },
48777                 "get": function (name) {
48778                     return value[name];
48779                 },
48780                 "set": function (name, rhs) {
48781                     value[name] = rhs;
48782                 },
48783                 "delete": function (name) {
48784                     delete value[name];
48785                 },
48786                 "post": function (name, args) {
48787                     // Mark Miller proposes that post with no name should apply a
48788                     // promised function.
48789                     if (name === null || name === void 0) {
48790                         return value.apply(void 0, args);
48791                     } else {
48792                         return value[name].apply(value, args);
48793                     }
48794                 },
48795                 "apply": function (thisp, args) {
48796                     return value.apply(thisp, args);
48797                 },
48798                 "keys": function () {
48799                     return object_keys(value);
48800                 }
48801             }, void 0, function inspect() {
48802                 return { state: "fulfilled", value: value };
48803             });
48804         }
48805
48806         /**
48807          * Converts thenables to Q promises.
48808          * @param promise thenable promise
48809          * @returns a Q promise
48810          */
48811         function coerce(promise) {
48812             var deferred = defer();
48813             Q.nextTick(function () {
48814                 try {
48815                     promise.then(deferred.resolve, deferred.reject, deferred.notify);
48816                 } catch (exception) {
48817                     deferred.reject(exception);
48818                 }
48819             });
48820             return deferred.promise;
48821         }
48822
48823         /**
48824          * Annotates an object such that it will never be
48825          * transferred away from this process over any promise
48826          * communication channel.
48827          * @param object
48828          * @returns promise a wrapping of that object that
48829          * additionally responds to the "isDef" message
48830          * without a rejection.
48831          */
48832         Q.master = master;
48833         function master(object) {
48834             return Promise({
48835                 "isDef": function () {}
48836             }, function fallback(op, args) {
48837                 return dispatch(object, op, args);
48838             }, function () {
48839                 return Q(object).inspect();
48840             });
48841         }
48842
48843         /**
48844          * Spreads the values of a promised array of arguments into the
48845          * fulfillment callback.
48846          * @param fulfilled callback that receives variadic arguments from the
48847          * promised array
48848          * @param rejected callback that receives the exception if the promise
48849          * is rejected.
48850          * @returns a promise for the return value or thrown exception of
48851          * either callback.
48852          */
48853         Q.spread = spread;
48854         function spread(value, fulfilled, rejected) {
48855             return Q(value).spread(fulfilled, rejected);
48856         }
48857
48858         Promise.prototype.spread = function (fulfilled, rejected) {
48859             return this.all().then(function (array) {
48860                 return fulfilled.apply(void 0, array);
48861             }, rejected);
48862         };
48863
48864         /**
48865          * The async function is a decorator for generator functions, turning
48866          * them into asynchronous generators.  Although generators are only part
48867          * of the newest ECMAScript 6 drafts, this code does not cause syntax
48868          * errors in older engines.  This code should continue to work and will
48869          * in fact improve over time as the language improves.
48870          *
48871          * ES6 generators are currently part of V8 version 3.19 with the
48872          * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
48873          * for longer, but under an older Python-inspired form.  This function
48874          * works on both kinds of generators.
48875          *
48876          * Decorates a generator function such that:
48877          *  - it may yield promises
48878          *  - execution will continue when that promise is fulfilled
48879          *  - the value of the yield expression will be the fulfilled value
48880          *  - it returns a promise for the return value (when the generator
48881          *    stops iterating)
48882          *  - the decorated function returns a promise for the return value
48883          *    of the generator or the first rejected promise among those
48884          *    yielded.
48885          *  - if an error is thrown in the generator, it propagates through
48886          *    every following yield until it is caught, or until it escapes
48887          *    the generator function altogether, and is translated into a
48888          *    rejection for the promise returned by the decorated generator.
48889          */
48890         Q.async = async;
48891         function async(makeGenerator) {
48892             return function () {
48893                 // when verb is "send", arg is a value
48894                 // when verb is "throw", arg is an exception
48895                 function continuer(verb, arg) {
48896                     var result;
48897
48898                     // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
48899                     // engine that has a deployed base of browsers that support generators.
48900                     // However, SM's generators use the Python-inspired semantics of
48901                     // outdated ES6 drafts.  We would like to support ES6, but we'd also
48902                     // like to make it possible to use generators in deployed browsers, so
48903                     // we also support Python-style generators.  At some point we can remove
48904                     // this block.
48905
48906                     if (typeof StopIteration === "undefined") {
48907                         // ES6 Generators
48908                         try {
48909                             result = generator[verb](arg);
48910                         } catch (exception) {
48911                             return reject(exception);
48912                         }
48913                         if (result.done) {
48914                             return Q(result.value);
48915                         } else {
48916                             return when(result.value, callback, errback);
48917                         }
48918                     } else {
48919                         // SpiderMonkey Generators
48920                         // FIXME: Remove this case when SM does ES6 generators.
48921                         try {
48922                             result = generator[verb](arg);
48923                         } catch (exception) {
48924                             if (isStopIteration(exception)) {
48925                                 return Q(exception.value);
48926                             } else {
48927                                 return reject(exception);
48928                             }
48929                         }
48930                         return when(result, callback, errback);
48931                     }
48932                 }
48933                 var generator = makeGenerator.apply(this, arguments);
48934                 var callback = continuer.bind(continuer, "next");
48935                 var errback = continuer.bind(continuer, "throw");
48936                 return callback();
48937             };
48938         }
48939
48940         /**
48941          * The spawn function is a small wrapper around async that immediately
48942          * calls the generator and also ends the promise chain, so that any
48943          * unhandled errors are thrown instead of forwarded to the error
48944          * handler. This is useful because it's extremely common to run
48945          * generators at the top-level to work with libraries.
48946          */
48947         Q.spawn = spawn;
48948         function spawn(makeGenerator) {
48949             Q.done(Q.async(makeGenerator)());
48950         }
48951
48952         // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
48953         /**
48954          * Throws a ReturnValue exception to stop an asynchronous generator.
48955          *
48956          * This interface is a stop-gap measure to support generator return
48957          * values in older Firefox/SpiderMonkey.  In browsers that support ES6
48958          * generators like Chromium 29, just use "return" in your generator
48959          * functions.
48960          *
48961          * @param value the return value for the surrounding generator
48962          * @throws ReturnValue exception with the value.
48963          * @example
48964          * // ES6 style
48965          * Q.async(function* () {
48966          *      var foo = yield getFooPromise();
48967          *      var bar = yield getBarPromise();
48968          *      return foo + bar;
48969          * })
48970          * // Older SpiderMonkey style
48971          * Q.async(function () {
48972          *      var foo = yield getFooPromise();
48973          *      var bar = yield getBarPromise();
48974          *      Q.return(foo + bar);
48975          * })
48976          */
48977         Q["return"] = _return;
48978         function _return(value) {
48979             throw new QReturnValue(value);
48980         }
48981
48982         /**
48983          * The promised function decorator ensures that any promise arguments
48984          * are settled and passed as values (`this` is also settled and passed
48985          * as a value).  It will also ensure that the result of a function is
48986          * always a promise.
48987          *
48988          * @example
48989          * var add = Q.promised(function (a, b) {
48990          *     return a + b;
48991          * });
48992          * add(Q(a), Q(B));
48993          *
48994          * @param {function} callback The function to decorate
48995          * @returns {function} a function that has been decorated.
48996          */
48997         Q.promised = promised;
48998         function promised(callback) {
48999             return function () {
49000                 return spread([this, all(arguments)], function (self, args) {
49001                     return callback.apply(self, args);
49002                 });
49003             };
49004         }
49005
49006         /**
49007          * sends a message to a value in a future turn
49008          * @param object* the recipient
49009          * @param op the name of the message operation, e.g., "when",
49010          * @param args further arguments to be forwarded to the operation
49011          * @returns result {Promise} a promise for the result of the operation
49012          */
49013         Q.dispatch = dispatch;
49014         function dispatch(object, op, args) {
49015             return Q(object).dispatch(op, args);
49016         }
49017
49018         Promise.prototype.dispatch = function (op, args) {
49019             var self = this;
49020             var deferred = defer();
49021             Q.nextTick(function () {
49022                 self.promiseDispatch(deferred.resolve, op, args);
49023             });
49024             return deferred.promise;
49025         };
49026
49027         /**
49028          * Gets the value of a property in a future turn.
49029          * @param object    promise or immediate reference for target object
49030          * @param name      name of property to get
49031          * @return promise for the property value
49032          */
49033         Q.get = function (object, key) {
49034             return Q(object).dispatch("get", [key]);
49035         };
49036
49037         Promise.prototype.get = function (key) {
49038             return this.dispatch("get", [key]);
49039         };
49040
49041         /**
49042          * Sets the value of a property in a future turn.
49043          * @param object    promise or immediate reference for object object
49044          * @param name      name of property to set
49045          * @param value     new value of property
49046          * @return promise for the return value
49047          */
49048         Q.set = function (object, key, value) {
49049             return Q(object).dispatch("set", [key, value]);
49050         };
49051
49052         Promise.prototype.set = function (key, value) {
49053             return this.dispatch("set", [key, value]);
49054         };
49055
49056         /**
49057          * Deletes a property in a future turn.
49058          * @param object    promise or immediate reference for target object
49059          * @param name      name of property to delete
49060          * @return promise for the return value
49061          */
49062         Q.del = // XXX legacy
49063         Q["delete"] = function (object, key) {
49064             return Q(object).dispatch("delete", [key]);
49065         };
49066
49067         Promise.prototype.del = // XXX legacy
49068         Promise.prototype["delete"] = function (key) {
49069             return this.dispatch("delete", [key]);
49070         };
49071
49072         /**
49073          * Invokes a method in a future turn.
49074          * @param object    promise or immediate reference for target object
49075          * @param name      name of method to invoke
49076          * @param value     a value to post, typically an array of
49077          *                  invocation arguments for promises that
49078          *                  are ultimately backed with `resolve` values,
49079          *                  as opposed to those backed with URLs
49080          *                  wherein the posted value can be any
49081          *                  JSON serializable object.
49082          * @return promise for the return value
49083          */
49084         // bound locally because it is used by other methods
49085         Q.mapply = // XXX As proposed by "Redsandro"
49086         Q.post = function (object, name, args) {
49087             return Q(object).dispatch("post", [name, args]);
49088         };
49089
49090         Promise.prototype.mapply = // XXX As proposed by "Redsandro"
49091         Promise.prototype.post = function (name, args) {
49092             return this.dispatch("post", [name, args]);
49093         };
49094
49095         /**
49096          * Invokes a method in a future turn.
49097          * @param object    promise or immediate reference for target object
49098          * @param name      name of method to invoke
49099          * @param ...args   array of invocation arguments
49100          * @return promise for the return value
49101          */
49102         Q.send = // XXX Mark Miller's proposed parlance
49103         Q.mcall = // XXX As proposed by "Redsandro"
49104         Q.invoke = function (object, name /*...args*/) {
49105             return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
49106         };
49107
49108         Promise.prototype.send = // XXX Mark Miller's proposed parlance
49109         Promise.prototype.mcall = // XXX As proposed by "Redsandro"
49110         Promise.prototype.invoke = function (name /*...args*/) {
49111             return this.dispatch("post", [name, array_slice(arguments, 1)]);
49112         };
49113
49114         /**
49115          * Applies the promised function in a future turn.
49116          * @param object    promise or immediate reference for target function
49117          * @param args      array of application arguments
49118          */
49119         Q.fapply = function (object, args) {
49120             return Q(object).dispatch("apply", [void 0, args]);
49121         };
49122
49123         Promise.prototype.fapply = function (args) {
49124             return this.dispatch("apply", [void 0, args]);
49125         };
49126
49127         /**
49128          * Calls the promised function in a future turn.
49129          * @param object    promise or immediate reference for target function
49130          * @param ...args   array of application arguments
49131          */
49132         Q["try"] =
49133         Q.fcall = function (object /* ...args*/) {
49134             return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
49135         };
49136
49137         Promise.prototype.fcall = function (/*...args*/) {
49138             return this.dispatch("apply", [void 0, array_slice(arguments)]);
49139         };
49140
49141         /**
49142          * Binds the promised function, transforming return values into a fulfilled
49143          * promise and thrown errors into a rejected one.
49144          * @param object    promise or immediate reference for target function
49145          * @param ...args   array of application arguments
49146          */
49147         Q.fbind = function (object /*...args*/) {
49148             var promise = Q(object);
49149             var args = array_slice(arguments, 1);
49150             return function fbound() {
49151                 return promise.dispatch("apply", [
49152                     this,
49153                     args.concat(array_slice(arguments))
49154                 ]);
49155             };
49156         };
49157         Promise.prototype.fbind = function (/*...args*/) {
49158             var promise = this;
49159             var args = array_slice(arguments);
49160             return function fbound() {
49161                 return promise.dispatch("apply", [
49162                     this,
49163                     args.concat(array_slice(arguments))
49164                 ]);
49165             };
49166         };
49167
49168         /**
49169          * Requests the names of the owned properties of a promised
49170          * object in a future turn.
49171          * @param object    promise or immediate reference for target object
49172          * @return promise for the keys of the eventually settled object
49173          */
49174         Q.keys = function (object) {
49175             return Q(object).dispatch("keys", []);
49176         };
49177
49178         Promise.prototype.keys = function () {
49179             return this.dispatch("keys", []);
49180         };
49181
49182         /**
49183          * Turns an array of promises into a promise for an array.  If any of
49184          * the promises gets rejected, the whole array is rejected immediately.
49185          * @param {Array*} an array (or promise for an array) of values (or
49186          * promises for values)
49187          * @returns a promise for an array of the corresponding values
49188          */
49189         // By Mark Miller
49190         // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
49191         Q.all = all;
49192         function all(promises) {
49193             return when(promises, function (promises) {
49194                 var pendingCount = 0;
49195                 var deferred = defer();
49196                 array_reduce(promises, function (undefined, promise, index) {
49197                     var snapshot;
49198                     if (
49199                         isPromise(promise) &&
49200                         (snapshot = promise.inspect()).state === "fulfilled"
49201                     ) {
49202                         promises[index] = snapshot.value;
49203                     } else {
49204                         ++pendingCount;
49205                         when(
49206                             promise,
49207                             function (value) {
49208                                 promises[index] = value;
49209                                 if (--pendingCount === 0) {
49210                                     deferred.resolve(promises);
49211                                 }
49212                             },
49213                             deferred.reject,
49214                             function (progress) {
49215                                 deferred.notify({ index: index, value: progress });
49216                             }
49217                         );
49218                     }
49219                 }, void 0);
49220                 if (pendingCount === 0) {
49221                     deferred.resolve(promises);
49222                 }
49223                 return deferred.promise;
49224             });
49225         }
49226
49227         Promise.prototype.all = function () {
49228             return all(this);
49229         };
49230
49231         /**
49232          * Returns the first resolved promise of an array. Prior rejected promises are
49233          * ignored.  Rejects only if all promises are rejected.
49234          * @param {Array*} an array containing values or promises for values
49235          * @returns a promise fulfilled with the value of the first resolved promise,
49236          * or a rejected promise if all promises are rejected.
49237          */
49238         Q.any = any;
49239
49240         function any(promises) {
49241             if (promises.length === 0) {
49242                 return Q.resolve();
49243             }
49244
49245             var deferred = Q.defer();
49246             var pendingCount = 0;
49247             array_reduce(promises, function (prev, current, index) {
49248                 var promise = promises[index];
49249
49250                 pendingCount++;
49251
49252                 when(promise, onFulfilled, onRejected, onProgress);
49253                 function onFulfilled(result) {
49254                     deferred.resolve(result);
49255                 }
49256                 function onRejected(err) {
49257                     pendingCount--;
49258                     if (pendingCount === 0) {
49259                         var rejection = err || new Error("" + err);
49260
49261                         rejection.message = ("Q can't get fulfillment value from any promise, all " +
49262                             "promises were rejected. Last error message: " + rejection.message);
49263
49264                         deferred.reject(rejection);
49265                     }
49266                 }
49267                 function onProgress(progress) {
49268                     deferred.notify({
49269                         index: index,
49270                         value: progress
49271                     });
49272                 }
49273             }, undefined);
49274
49275             return deferred.promise;
49276         }
49277
49278         Promise.prototype.any = function () {
49279             return any(this);
49280         };
49281
49282         /**
49283          * Waits for all promises to be settled, either fulfilled or
49284          * rejected.  This is distinct from `all` since that would stop
49285          * waiting at the first rejection.  The promise returned by
49286          * `allResolved` will never be rejected.
49287          * @param promises a promise for an array (or an array) of promises
49288          * (or values)
49289          * @return a promise for an array of promises
49290          */
49291         Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
49292         function allResolved(promises) {
49293             return when(promises, function (promises) {
49294                 promises = array_map(promises, Q);
49295                 return when(all(array_map(promises, function (promise) {
49296                     return when(promise, noop, noop);
49297                 })), function () {
49298                     return promises;
49299                 });
49300             });
49301         }
49302
49303         Promise.prototype.allResolved = function () {
49304             return allResolved(this);
49305         };
49306
49307         /**
49308          * @see Promise#allSettled
49309          */
49310         Q.allSettled = allSettled;
49311         function allSettled(promises) {
49312             return Q(promises).allSettled();
49313         }
49314
49315         /**
49316          * Turns an array of promises into a promise for an array of their states (as
49317          * returned by `inspect`) when they have all settled.
49318          * @param {Array[Any*]} values an array (or promise for an array) of values (or
49319          * promises for values)
49320          * @returns {Array[State]} an array of states for the respective values.
49321          */
49322         Promise.prototype.allSettled = function () {
49323             return this.then(function (promises) {
49324                 return all(array_map(promises, function (promise) {
49325                     promise = Q(promise);
49326                     function regardless() {
49327                         return promise.inspect();
49328                     }
49329                     return promise.then(regardless, regardless);
49330                 }));
49331             });
49332         };
49333
49334         /**
49335          * Captures the failure of a promise, giving an oportunity to recover
49336          * with a callback.  If the given promise is fulfilled, the returned
49337          * promise is fulfilled.
49338          * @param {Any*} promise for something
49339          * @param {Function} callback to fulfill the returned promise if the
49340          * given promise is rejected
49341          * @returns a promise for the return value of the callback
49342          */
49343         Q.fail = // XXX legacy
49344         Q["catch"] = function (object, rejected) {
49345             return Q(object).then(void 0, rejected);
49346         };
49347
49348         Promise.prototype.fail = // XXX legacy
49349         Promise.prototype["catch"] = function (rejected) {
49350             return this.then(void 0, rejected);
49351         };
49352
49353         /**
49354          * Attaches a listener that can respond to progress notifications from a
49355          * promise's originating deferred. This listener receives the exact arguments
49356          * passed to ``deferred.notify``.
49357          * @param {Any*} promise for something
49358          * @param {Function} callback to receive any progress notifications
49359          * @returns the given promise, unchanged
49360          */
49361         Q.progress = progress;
49362         function progress(object, progressed) {
49363             return Q(object).then(void 0, void 0, progressed);
49364         }
49365
49366         Promise.prototype.progress = function (progressed) {
49367             return this.then(void 0, void 0, progressed);
49368         };
49369
49370         /**
49371          * Provides an opportunity to observe the settling of a promise,
49372          * regardless of whether the promise is fulfilled or rejected.  Forwards
49373          * the resolution to the returned promise when the callback is done.
49374          * The callback can return a promise to defer completion.
49375          * @param {Any*} promise
49376          * @param {Function} callback to observe the resolution of the given
49377          * promise, takes no arguments.
49378          * @returns a promise for the resolution of the given promise when
49379          * ``fin`` is done.
49380          */
49381         Q.fin = // XXX legacy
49382         Q["finally"] = function (object, callback) {
49383             return Q(object)["finally"](callback);
49384         };
49385
49386         Promise.prototype.fin = // XXX legacy
49387         Promise.prototype["finally"] = function (callback) {
49388             if (!callback || typeof callback.apply !== "function") {
49389                 throw new Error("Q can't apply finally callback");
49390             }
49391             callback = Q(callback);
49392             return this.then(function (value) {
49393                 return callback.fcall().then(function () {
49394                     return value;
49395                 });
49396             }, function (reason) {
49397                 // TODO attempt to recycle the rejection with "this".
49398                 return callback.fcall().then(function () {
49399                     throw reason;
49400                 });
49401             });
49402         };
49403
49404         /**
49405          * Terminates a chain of promises, forcing rejections to be
49406          * thrown as exceptions.
49407          * @param {Any*} promise at the end of a chain of promises
49408          * @returns nothing
49409          */
49410         Q.done = function (object, fulfilled, rejected, progress) {
49411             return Q(object).done(fulfilled, rejected, progress);
49412         };
49413
49414         Promise.prototype.done = function (fulfilled, rejected, progress) {
49415             var onUnhandledError = function (error) {
49416                 // forward to a future turn so that ``when``
49417                 // does not catch it and turn it into a rejection.
49418                 Q.nextTick(function () {
49419                     makeStackTraceLong(error, promise);
49420                     if (Q.onerror) {
49421                         Q.onerror(error);
49422                     } else {
49423                         throw error;
49424                     }
49425                 });
49426             };
49427
49428             // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
49429             var promise = fulfilled || rejected || progress ?
49430                 this.then(fulfilled, rejected, progress) :
49431                 this;
49432
49433             if (typeof process === "object" && process && process.domain) {
49434                 onUnhandledError = process.domain.bind(onUnhandledError);
49435             }
49436
49437             promise.then(void 0, onUnhandledError);
49438         };
49439
49440         /**
49441          * Causes a promise to be rejected if it does not get fulfilled before
49442          * some milliseconds time out.
49443          * @param {Any*} promise
49444          * @param {Number} milliseconds timeout
49445          * @param {Any*} custom error message or Error object (optional)
49446          * @returns a promise for the resolution of the given promise if it is
49447          * fulfilled before the timeout, otherwise rejected.
49448          */
49449         Q.timeout = function (object, ms, error) {
49450             return Q(object).timeout(ms, error);
49451         };
49452
49453         Promise.prototype.timeout = function (ms, error) {
49454             var deferred = defer();
49455             var timeoutId = setTimeout(function () {
49456                 if (!error || "string" === typeof error) {
49457                     error = new Error(error || "Timed out after " + ms + " ms");
49458                     error.code = "ETIMEDOUT";
49459                 }
49460                 deferred.reject(error);
49461             }, ms);
49462
49463             this.then(function (value) {
49464                 clearTimeout(timeoutId);
49465                 deferred.resolve(value);
49466             }, function (exception) {
49467                 clearTimeout(timeoutId);
49468                 deferred.reject(exception);
49469             }, deferred.notify);
49470
49471             return deferred.promise;
49472         };
49473
49474         /**
49475          * Returns a promise for the given value (or promised value), some
49476          * milliseconds after it resolved. Passes rejections immediately.
49477          * @param {Any*} promise
49478          * @param {Number} milliseconds
49479          * @returns a promise for the resolution of the given promise after milliseconds
49480          * time has elapsed since the resolution of the given promise.
49481          * If the given promise rejects, that is passed immediately.
49482          */
49483         Q.delay = function (object, timeout) {
49484             if (timeout === void 0) {
49485                 timeout = object;
49486                 object = void 0;
49487             }
49488             return Q(object).delay(timeout);
49489         };
49490
49491         Promise.prototype.delay = function (timeout) {
49492             return this.then(function (value) {
49493                 var deferred = defer();
49494                 setTimeout(function () {
49495                     deferred.resolve(value);
49496                 }, timeout);
49497                 return deferred.promise;
49498             });
49499         };
49500
49501         /**
49502          * Passes a continuation to a Node function, which is called with the given
49503          * arguments provided as an array, and returns a promise.
49504          *
49505          *      Q.nfapply(FS.readFile, [__filename])
49506          *      .then(function (content) {
49507          *      })
49508          *
49509          */
49510         Q.nfapply = function (callback, args) {
49511             return Q(callback).nfapply(args);
49512         };
49513
49514         Promise.prototype.nfapply = function (args) {
49515             var deferred = defer();
49516             var nodeArgs = array_slice(args);
49517             nodeArgs.push(deferred.makeNodeResolver());
49518             this.fapply(nodeArgs).fail(deferred.reject);
49519             return deferred.promise;
49520         };
49521
49522         /**
49523          * Passes a continuation to a Node function, which is called with the given
49524          * arguments provided individually, and returns a promise.
49525          * @example
49526          * Q.nfcall(FS.readFile, __filename)
49527          * .then(function (content) {
49528          * })
49529          *
49530          */
49531         Q.nfcall = function (callback /*...args*/) {
49532             var args = array_slice(arguments, 1);
49533             return Q(callback).nfapply(args);
49534         };
49535
49536         Promise.prototype.nfcall = function (/*...args*/) {
49537             var nodeArgs = array_slice(arguments);
49538             var deferred = defer();
49539             nodeArgs.push(deferred.makeNodeResolver());
49540             this.fapply(nodeArgs).fail(deferred.reject);
49541             return deferred.promise;
49542         };
49543
49544         /**
49545          * Wraps a NodeJS continuation passing function and returns an equivalent
49546          * version that returns a promise.
49547          * @example
49548          * Q.nfbind(FS.readFile, __filename)("utf-8")
49549          * .then(console.log)
49550          * .done()
49551          */
49552         Q.nfbind =
49553         Q.denodeify = function (callback /*...args*/) {
49554             if (callback === undefined) {
49555                 throw new Error("Q can't wrap an undefined function");
49556             }
49557             var baseArgs = array_slice(arguments, 1);
49558             return function () {
49559                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49560                 var deferred = defer();
49561                 nodeArgs.push(deferred.makeNodeResolver());
49562                 Q(callback).fapply(nodeArgs).fail(deferred.reject);
49563                 return deferred.promise;
49564             };
49565         };
49566
49567         Promise.prototype.nfbind =
49568         Promise.prototype.denodeify = function (/*...args*/) {
49569             var args = array_slice(arguments);
49570             args.unshift(this);
49571             return Q.denodeify.apply(void 0, args);
49572         };
49573
49574         Q.nbind = function (callback, thisp /*...args*/) {
49575             var baseArgs = array_slice(arguments, 2);
49576             return function () {
49577                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49578                 var deferred = defer();
49579                 nodeArgs.push(deferred.makeNodeResolver());
49580                 function bound() {
49581                     return callback.apply(thisp, arguments);
49582                 }
49583                 Q(bound).fapply(nodeArgs).fail(deferred.reject);
49584                 return deferred.promise;
49585             };
49586         };
49587
49588         Promise.prototype.nbind = function (/*thisp, ...args*/) {
49589             var args = array_slice(arguments, 0);
49590             args.unshift(this);
49591             return Q.nbind.apply(void 0, args);
49592         };
49593
49594         /**
49595          * Calls a method of a Node-style object that accepts a Node-style
49596          * callback with a given array of arguments, plus a provided callback.
49597          * @param object an object that has the named method
49598          * @param {String} name name of the method of object
49599          * @param {Array} args arguments to pass to the method; the callback
49600          * will be provided by Q and appended to these arguments.
49601          * @returns a promise for the value or error
49602          */
49603         Q.nmapply = // XXX As proposed by "Redsandro"
49604         Q.npost = function (object, name, args) {
49605             return Q(object).npost(name, args);
49606         };
49607
49608         Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
49609         Promise.prototype.npost = function (name, args) {
49610             var nodeArgs = array_slice(args || []);
49611             var deferred = defer();
49612             nodeArgs.push(deferred.makeNodeResolver());
49613             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49614             return deferred.promise;
49615         };
49616
49617         /**
49618          * Calls a method of a Node-style object that accepts a Node-style
49619          * callback, forwarding the given variadic arguments, plus a provided
49620          * callback argument.
49621          * @param object an object that has the named method
49622          * @param {String} name name of the method of object
49623          * @param ...args arguments to pass to the method; the callback will
49624          * be provided by Q and appended to these arguments.
49625          * @returns a promise for the value or error
49626          */
49627         Q.nsend = // XXX Based on Mark Miller's proposed "send"
49628         Q.nmcall = // XXX Based on "Redsandro's" proposal
49629         Q.ninvoke = function (object, name /*...args*/) {
49630             var nodeArgs = array_slice(arguments, 2);
49631             var deferred = defer();
49632             nodeArgs.push(deferred.makeNodeResolver());
49633             Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49634             return deferred.promise;
49635         };
49636
49637         Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
49638         Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
49639         Promise.prototype.ninvoke = function (name /*...args*/) {
49640             var nodeArgs = array_slice(arguments, 1);
49641             var deferred = defer();
49642             nodeArgs.push(deferred.makeNodeResolver());
49643             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49644             return deferred.promise;
49645         };
49646
49647         /**
49648          * If a function would like to support both Node continuation-passing-style and
49649          * promise-returning-style, it can end its internal promise chain with
49650          * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
49651          * elects to use a nodeback, the result will be sent there.  If they do not
49652          * pass a nodeback, they will receive the result promise.
49653          * @param object a result (or a promise for a result)
49654          * @param {Function} nodeback a Node.js-style callback
49655          * @returns either the promise or nothing
49656          */
49657         Q.nodeify = nodeify;
49658         function nodeify(object, nodeback) {
49659             return Q(object).nodeify(nodeback);
49660         }
49661
49662         Promise.prototype.nodeify = function (nodeback) {
49663             if (nodeback) {
49664                 this.then(function (value) {
49665                     Q.nextTick(function () {
49666                         nodeback(null, value);
49667                     });
49668                 }, function (error) {
49669                     Q.nextTick(function () {
49670                         nodeback(error);
49671                     });
49672                 });
49673             } else {
49674                 return this;
49675             }
49676         };
49677
49678         Q.noConflict = function() {
49679             throw new Error("Q.noConflict only works when Q is used as a global");
49680         };
49681
49682         // All code before this point will be filtered from stack traces.
49683         var qEndingLine = captureLine();
49684
49685         return Q;
49686
49687         });
49688         });
49689
49690         var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
49691         var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
49692         var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
49693         var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
49694         var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
49695         var maxResults$2 = 2000;
49696         var tileZoom$2 = 16.5;
49697         var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
49698         var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
49699         var minHfov = 10;         // zoom in degrees:  20, 10, 5
49700         var maxHfov = 90;         // zoom out degrees
49701         var defaultHfov = 45;
49702
49703         var _hires = false;
49704         var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
49705         var _currScene = 0;
49706         var _ssCache;
49707         var _pannellumViewer;
49708         var _sceneOptions;
49709         var _dataUrlArray = [];
49710
49711
49712         /**
49713          * abortRequest().
49714          */
49715         function abortRequest$5(i) {
49716             i.abort();
49717         }
49718
49719
49720         /**
49721          * localeTimeStamp().
49722          */
49723         function localeTimestamp(s) {
49724             if (!s) return null;
49725             var detected = utilDetect();
49726             var options = { day: 'numeric', month: 'short', year: 'numeric' };
49727             var d = new Date(s);
49728             if (isNaN(d.getTime())) return null;
49729             return d.toLocaleString(detected.locale, options);
49730         }
49731
49732
49733         /**
49734          * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
49735          */
49736         function loadTiles$2(which, url, projection, margin) {
49737             var tiles = tiler$5.margin(margin).getTiles(projection);
49738
49739             // abort inflight requests that are no longer needed
49740             var cache = _ssCache[which];
49741             Object.keys(cache.inflight).forEach(function(k) {
49742                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
49743                 if (!wanted) {
49744                     abortRequest$5(cache.inflight[k]);
49745                     delete cache.inflight[k];
49746                 }
49747             });
49748
49749             tiles.forEach(function (tile) {
49750                loadNextTilePage$2(which, url, tile);
49751             });
49752         }
49753
49754         /**
49755          * loadNextTilePage() load data for the next tile page in line.
49756          */
49757         function loadNextTilePage$2(which, url, tile) {
49758             var cache = _ssCache[which];
49759             var nextPage = cache.nextPage[tile.id] || 0;
49760             var id = tile.id + ',' + String(nextPage);
49761             if (cache.loaded[id] || cache.inflight[id]) return;
49762
49763             cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
49764                 cache.loaded[id] = true;
49765                 delete cache.inflight[id];
49766                 if (!bubbles) return;
49767
49768                 // [].shift() removes the first element, some statistics info, not a bubble point
49769                 bubbles.shift();
49770
49771                 var features = bubbles.map(function(bubble) {
49772                     if (cache.points[bubble.id]) return null;  // skip duplicates
49773
49774                     var loc = [bubble.lo, bubble.la];
49775                     var d = {
49776                         loc: loc,
49777                         key: bubble.id,
49778                         ca: bubble.he,
49779                         captured_at: bubble.cd,
49780                         captured_by: 'microsoft',
49781                         // nbn: bubble.nbn,
49782                         // pbn: bubble.pbn,
49783                         // ad: bubble.ad,
49784                         // rn: bubble.rn,
49785                         pr: bubble.pr,  // previous
49786                         ne: bubble.ne,  // next
49787                         pano: true,
49788                         sequenceKey: null
49789                     };
49790
49791                     cache.points[bubble.id] = d;
49792
49793                     // a sequence starts here
49794                     if (bubble.pr === undefined) {
49795                         cache.leaders.push(bubble.id);
49796                     }
49797
49798                     return {
49799                         minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
49800                     };
49801
49802                 }).filter(Boolean);
49803
49804                 cache.rtree.load(features);
49805
49806                 connectSequences();
49807
49808                 if (which === 'bubbles') {
49809                     dispatch$6.call('loadedBubbles');
49810                 }
49811             });
49812         }
49813
49814
49815         // call this sometimes to connect the bubbles into sequences
49816         function connectSequences() {
49817             var cache = _ssCache.bubbles;
49818             var keepLeaders = [];
49819
49820             for (var i = 0; i < cache.leaders.length; i++) {
49821                 var bubble = cache.points[cache.leaders[i]];
49822                 var seen = {};
49823
49824                 // try to make a sequence.. use the key of the leader bubble.
49825                 var sequence = { key: bubble.key, bubbles: [] };
49826                 var complete = false;
49827
49828                 do {
49829                     sequence.bubbles.push(bubble);
49830                     seen[bubble.key] = true;
49831
49832                     if (bubble.ne === undefined) {
49833                         complete = true;
49834                     } else {
49835                         bubble = cache.points[bubble.ne];  // advance to next
49836                     }
49837                 } while (bubble && !seen[bubble.key] && !complete);
49838
49839
49840                 if (complete) {
49841                     _ssCache.sequences[sequence.key] = sequence;
49842
49843                     // assign bubbles to the sequence
49844                     for (var j = 0; j < sequence.bubbles.length; j++) {
49845                         sequence.bubbles[j].sequenceKey = sequence.key;
49846                     }
49847
49848                     // create a GeoJSON LineString
49849                     sequence.geojson = {
49850                         type: 'LineString',
49851                         properties: { key: sequence.key },
49852                         coordinates: sequence.bubbles.map(function (d) { return d.loc; })
49853                     };
49854
49855                 } else {
49856                     keepLeaders.push(cache.leaders[i]);
49857                 }
49858             }
49859
49860             // couldn't complete these, save for later
49861             cache.leaders = keepLeaders;
49862         }
49863
49864         /**
49865          * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
49866          */
49867         function getBubbles(url, tile, callback) {
49868             var rect = tile.extent.rectangle();
49869             var urlForRequest = url + utilQsString({
49870                 n: rect[3],
49871                 s: rect[1],
49872                 e: rect[2],
49873                 w: rect[0],
49874                 c: maxResults$2,
49875                 appkey: bubbleAppKey,
49876                 jsCallback: '{callback}'
49877             });
49878
49879             return jsonpRequest(urlForRequest, function (data) {
49880                 if (!data || data.error) {
49881                     callback(null);
49882                 } else {
49883                     callback(data);
49884                 }
49885             });
49886         }
49887
49888
49889         // partition viewport into higher zoom tiles
49890         function partitionViewport$2(projection) {
49891             var z = geoScaleToZoom(projection.scale());
49892             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
49893             var tiler = utilTiler().zoomExtent([z2, z2]);
49894
49895             return tiler.getTiles(projection)
49896                 .map(function(tile) { return tile.extent; });
49897         }
49898
49899
49900         // no more than `limit` results per partition.
49901         function searchLimited$2(limit, projection, rtree) {
49902             limit = limit || 5;
49903
49904             return partitionViewport$2(projection)
49905                 .reduce(function(result, extent) {
49906                     var found = rtree.search(extent.bbox())
49907                         .slice(0, limit)
49908                         .map(function(d) { return d.data; });
49909
49910                     return (found.length ? result.concat(found) : result);
49911                 }, []);
49912         }
49913
49914
49915         /**
49916          * getImage()
49917          */
49918         function getImage(imgInfo) {
49919             var response = q.defer();
49920             var img = new Image();
49921
49922             img.onload = function() {
49923                 var canvas = document.getElementById('canvas' + imgInfo.face);
49924                 var ctx = canvas.getContext('2d');
49925                 ctx.drawImage(img, imgInfo.x, imgInfo.y);
49926                 response.resolve({imgInfo:imgInfo, status: 'ok'});
49927             };
49928             img.onerror = function() {
49929                 response.resolve({data: imgInfo, status: 'error'});
49930             };
49931             img.setAttribute('crossorigin', '');
49932             img.src = imgInfo.url;
49933
49934             return response.promise;
49935         }
49936
49937
49938         /**
49939          * loadCanvas()
49940          */
49941         function loadCanvas(imgInfoGroup) {
49942             var response = q.defer();
49943             var getImagePromises = imgInfoGroup.map(function(imgInfo) {
49944                 return getImage(imgInfo);
49945             });
49946
49947             q.all(getImagePromises).then(function(data) {
49948                 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
49949                 switch (data[0].imgInfo.face) {
49950                     case '01':
49951                         _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
49952                         break;
49953                     case '02':
49954                         _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
49955                         break;
49956                     case '03':
49957                         _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
49958                         break;
49959                     case '10':
49960                         _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
49961                         break;
49962                     case '11':
49963                         _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
49964                         break;
49965                     case '12':
49966                         _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
49967                         break;
49968                 }
49969                 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
49970             });
49971
49972             return response.promise;
49973         }
49974
49975
49976         function setupCanvas(selection, reset) {
49977             if (reset) {
49978                 selection.selectAll('#divForCanvasWork')
49979                     .remove();
49980             }
49981
49982             // Add the Streetside working canvases. These are used for 'stitching', or combining,
49983             // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
49984             selection.selectAll('#divForCanvasWork')
49985                 .data([0])
49986                 .enter()
49987                 .append('div')
49988                 .attr('id', 'divForCanvasWork')
49989                 .attr('display', 'none')
49990                 .selectAll('canvas')
49991                 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
49992                 .enter()
49993                 .append('canvas')
49994                 .attr('id', function(d) { return d; })
49995                 .attr('width', _resolution)
49996                 .attr('height', _resolution);
49997         }
49998
49999
50000         /**
50001          * processFaces()
50002          */
50003         function processFaces(imgFaceInfoGroups) {
50004             var response = q.defer();
50005             var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
50006                 return loadCanvas(faceImgGroup);
50007             });
50008
50009             q.all(loadCanvasPromises).then(function() {
50010                 response.resolve({status: 'processFaces done'});
50011             });
50012
50013             return response.promise;
50014         }
50015
50016
50017
50018         function qkToXY(qk) {
50019             var x = 0;
50020             var y = 0;
50021             var scale = 256;
50022             for (var i = qk.length; i > 0; i--) {
50023                 var key = qk[i-1];
50024                 x += (+(key === '1' || key === '3')) * scale;
50025                 y += (+(key === '2' || key === '3')) * scale;
50026                 scale *= 2;
50027             }
50028             return [x, y];
50029         }
50030
50031
50032         function getQuadKeys() {
50033             var dim = _resolution / 256;
50034             var quadKeys;
50035
50036             if (dim === 16) {
50037                 quadKeys = [
50038                     '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
50039                     '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
50040                     '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
50041                     '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
50042                     '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
50043                     '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
50044                     '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
50045                     '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
50046
50047                     '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
50048                     '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
50049                     '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
50050                     '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
50051                     '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
50052                     '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
50053                     '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
50054                     '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
50055                 ];
50056
50057             } else if (dim === 8) {
50058                 quadKeys = [
50059                     '000','001','010','011',  '100','101','110','111',
50060                     '002','003','012','013',  '102','103','112','113',
50061                     '020','021','030','031',  '120','121','130','131',
50062                     '022','023','032','033',  '122','123','132','133',
50063
50064                     '200','201','210','211',  '300','301','310','311',
50065                     '202','203','212','213',  '302','303','312','313',
50066                     '220','221','230','231',  '320','321','330','331',
50067                     '222','223','232','233',  '322','323','332','333'
50068                 ];
50069
50070             } else if (dim === 4) {
50071                 quadKeys = [
50072                     '00','01',  '10','11',
50073                     '02','03',  '12','13',
50074
50075                     '20','21',  '30','31',
50076                     '22','23',  '32','33'
50077                 ];
50078
50079             } else {  // dim === 2
50080                 quadKeys = [
50081                     '0', '1',
50082                     '2', '3'
50083                 ];
50084             }
50085
50086             return quadKeys;
50087         }
50088
50089
50090
50091         var serviceStreetside = {
50092             /**
50093              * init() initialize streetside.
50094              */
50095             init: function () {
50096                 if (!_ssCache) {
50097                     this.reset();
50098                 }
50099
50100                 this.event = utilRebind(this, dispatch$6, 'on');
50101             },
50102
50103             /**
50104              * reset() reset the cache.
50105              */
50106             reset: function () {
50107                 if (_ssCache) {
50108                     Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$5);
50109                 }
50110
50111                 _ssCache = {
50112                     bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
50113                     sequences: {}
50114                 };
50115             },
50116
50117             /**
50118              * bubbles()
50119              */
50120             bubbles: function (projection) {
50121                 var limit = 5;
50122                 return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
50123             },
50124
50125
50126             sequences: function(projection) {
50127                 var viewport = projection.clipExtent();
50128                 var min = [viewport[0][0], viewport[1][1]];
50129                 var max = [viewport[1][0], viewport[0][1]];
50130                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50131                 var seen = {};
50132                 var results = [];
50133
50134                 // all sequences for bubbles in viewport
50135                 _ssCache.bubbles.rtree.search(bbox)
50136                     .forEach(function(d) {
50137                         var key = d.data.sequenceKey;
50138                         if (key && !seen[key]) {
50139                             seen[key] = true;
50140                             results.push(_ssCache.sequences[key].geojson);
50141                         }
50142                     });
50143
50144                 return results;
50145             },
50146
50147
50148             /**
50149              * loadBubbles()
50150              */
50151             loadBubbles: function (projection, margin) {
50152                 // by default: request 2 nearby tiles so we can connect sequences.
50153                 if (margin === undefined) margin = 2;
50154
50155                 loadTiles$2('bubbles', bubbleApi, projection, margin);
50156             },
50157
50158
50159             viewer: function() {
50160                 return _pannellumViewer;
50161             },
50162
50163
50164             initViewer: function () {
50165                 if (!window.pannellum) return;
50166                 if (_pannellumViewer) return;
50167
50168                 var sceneID = ++_currScene + '';
50169                 var options = {
50170                     'default': { firstScene: sceneID },
50171                     scenes: {}
50172                 };
50173                 options.scenes[sceneID] = _sceneOptions;
50174
50175                 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
50176
50177                 _pannellumViewer
50178                     .on('mousedown', function() {
50179                         d3_select(window).on('mousemove.pannellum', function() {
50180                             dispatch$6.call('viewerChanged');
50181                         });
50182                     })
50183                     .on('mouseup', function() {
50184                         d3_select(window).on('mousemove.pannellum', null);
50185                         // continue dispatching events for a few seconds, in case viewer has inertia.
50186                         var t = timer(function(elapsed) {
50187                             dispatch$6.call('viewerChanged');
50188                             if (elapsed > 2000) {
50189                                 t.stop();
50190                             }
50191                         });
50192                     });
50193             },
50194
50195
50196             /**
50197              * loadViewer() create the streeside viewer.
50198              */
50199             loadViewer: function (context) {
50200                 var that = this;
50201
50202                 // create ms-wrapper, a photo wrapper class
50203                 var wrap = d3_select('#photoviewer').selectAll('.ms-wrapper')
50204                     .data([0]);
50205
50206                 // inject ms-wrapper into the photoviewer div
50207                 // (used by all to house each custom photo viewer)
50208                 var wrapEnter = wrap.enter()
50209                     .append('div')
50210                     .attr('id', 'ms')
50211                     .attr('class', 'photo-wrapper ms-wrapper')
50212                     .classed('hide', true);
50213
50214                 // inject div to support streetside viewer (pannellum) and attribution line
50215                 wrapEnter
50216                     .append('div')
50217                     .attr('id', 'viewer-streetside')
50218                     .append('div')
50219                     .attr('class', 'photo-attribution fillD');
50220
50221                 var controlsEnter = wrapEnter
50222                     .append('div')
50223                     .attr('class', 'photo-controls-wrap')
50224                     .append('div')
50225                     .attr('class', 'photo-controls');
50226
50227                 controlsEnter
50228                     .append('button')
50229                     .on('click.back', step(-1))
50230                     .text('◄');
50231
50232                 controlsEnter
50233                     .append('button')
50234                     .on('click.forward', step(1))
50235                     .text('►');
50236
50237
50238                 // create working canvas for stitching together images
50239                 wrap = wrap
50240                     .merge(wrapEnter)
50241                     .call(setupCanvas, true);
50242
50243                 // load streetside pannellum viewer css
50244                 d3_select('head').selectAll('#streetside-viewercss')
50245                     .data([0])
50246                     .enter()
50247                     .append('link')
50248                     .attr('id', 'streetside-viewercss')
50249                     .attr('rel', 'stylesheet')
50250                     .attr('href', context.asset(pannellumViewerCSS));
50251
50252                 // load streetside pannellum viewer js
50253                 d3_select('head').selectAll('#streetside-viewerjs')
50254                     .data([0])
50255                     .enter()
50256                     .append('script')
50257                     .attr('id', 'streetside-viewerjs')
50258                     .attr('src', context.asset(pannellumViewerJS));
50259
50260
50261                 // Register viewer resize handler
50262                 context.ui().photoviewer.on('resize', function() {
50263                     if (_pannellumViewer) {
50264                         _pannellumViewer.resize();
50265                     }
50266                 });
50267
50268
50269                 function step(stepBy) {
50270                     return function() {
50271                         var viewer = d3_select('#photoviewer');
50272                         var selected = viewer.empty() ? undefined : viewer.datum();
50273                         if (!selected) return;
50274
50275                         var nextID = (stepBy === 1 ? selected.ne : selected.pr);
50276                         var yaw = _pannellumViewer.getYaw();
50277                         var ca = selected.ca + yaw;
50278                         var origin = selected.loc;
50279
50280                         // construct a search trapezoid pointing out from current bubble
50281                         var meters = 35;
50282                         var p1 = [
50283                             origin[0] + geoMetersToLon(meters / 5, origin[1]),
50284                             origin[1]
50285                         ];
50286                         var p2 = [
50287                             origin[0] + geoMetersToLon(meters / 2, origin[1]),
50288                             origin[1] + geoMetersToLat(meters)
50289                         ];
50290                         var p3 = [
50291                             origin[0] - geoMetersToLon(meters / 2, origin[1]),
50292                             origin[1] + geoMetersToLat(meters)
50293                         ];
50294                         var p4 = [
50295                             origin[0] - geoMetersToLon(meters / 5, origin[1]),
50296                             origin[1]
50297                         ];
50298
50299                         var poly = [p1, p2, p3, p4, p1];
50300
50301                         // rotate it to face forward/backward
50302                         var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
50303                         poly = geoRotate(poly, -angle, origin);
50304
50305                         var extent = poly.reduce(function(extent, point) {
50306                             return extent.extend(geoExtent(point));
50307                         }, geoExtent());
50308
50309                         // find nearest other bubble in the search polygon
50310                         var minDist = Infinity;
50311                         _ssCache.bubbles.rtree.search(extent.bbox())
50312                             .forEach(function(d) {
50313                                 if (d.data.key === selected.key) return;
50314                                 if (!geoPointInPolygon(d.data.loc, poly)) return;
50315
50316                                 var dist = geoVecLength(d.data.loc, selected.loc);
50317                                 var theta = selected.ca - d.data.ca;
50318                                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
50319                                 if (minTheta > 20) {
50320                                     dist += 5;  // penalize distance if camera angles don't match
50321                                 }
50322
50323                                 if (dist < minDist) {
50324                                     nextID = d.data.key;
50325                                     minDist = dist;
50326                                 }
50327                             });
50328
50329                         var nextBubble = nextID && _ssCache.bubbles.points[nextID];
50330                         if (!nextBubble) return;
50331
50332                         context.map().centerEase(nextBubble.loc);
50333
50334                         that.selectImage(nextBubble)
50335                             .then(function(r) {
50336                                 if (r.status === 'ok') {
50337                                     _sceneOptions.yaw = yaw;
50338                                     that.showViewer();
50339                                 }
50340                             });
50341                     };
50342                 }
50343             },
50344
50345             /**
50346              * showViewer()
50347              */
50348             showViewer: function (yaw) {
50349                 if (!_sceneOptions) return;
50350
50351                 if (yaw !== undefined) {
50352                     _sceneOptions.yaw = yaw;
50353                 }
50354
50355                 if (!_pannellumViewer) {
50356                     this.initViewer();
50357                 } else {
50358                     // make a new scene
50359                     var sceneID = ++_currScene + '';
50360                     _pannellumViewer
50361                         .addScene(sceneID, _sceneOptions)
50362                         .loadScene(sceneID);
50363
50364                     // remove previous scene
50365                     if (_currScene > 2) {
50366                         sceneID = (_currScene - 1) + '';
50367                         _pannellumViewer
50368                             .removeScene(sceneID);
50369                     }
50370                 }
50371
50372                 var wrap = d3_select('#photoviewer')
50373                     .classed('hide', false);
50374
50375                 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
50376
50377                 if (isHidden) {
50378                     wrap
50379                         .selectAll('.photo-wrapper:not(.ms-wrapper)')
50380                         .classed('hide', true);
50381
50382                     wrap
50383                         .selectAll('.photo-wrapper.ms-wrapper')
50384                         .classed('hide', false);
50385                 }
50386
50387                 return this;
50388             },
50389
50390             /**
50391              * hideViewer()
50392              */
50393             hideViewer: function () {
50394                 var viewer = d3_select('#photoviewer');
50395                 if (!viewer.empty()) viewer.datum(null);
50396
50397                 viewer
50398                     .classed('hide', true)
50399                     .selectAll('.photo-wrapper')
50400                     .classed('hide', true);
50401
50402                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
50403                     .classed('currentView', false);
50404
50405                 return this.setStyles(null, true);
50406             },
50407
50408             /**
50409              * selectImage().
50410              */
50411             selectImage: function (d) {
50412                 var response = q.defer();
50413                 var that = this;
50414
50415                 var viewer = d3_select('#photoviewer');
50416                 if (!viewer.empty()) viewer.datum(d);
50417
50418                 this.setStyles(null, true);
50419
50420                 var wrap = d3_select('#photoviewer .ms-wrapper');
50421                 var attribution = wrap.selectAll('.photo-attribution').html('');
50422
50423                 wrap.selectAll('.pnlm-load-box')   // display "loading.."
50424                     .style('display', 'block');
50425
50426                 if (!d) {
50427                     response.resolve({status: 'ok'});
50428                     return response.promise;
50429                 }
50430
50431                 var line1 = attribution
50432                     .append('div')
50433                     .attr('class', 'attribution-row');
50434
50435                 // Add hires checkbox
50436                 var label = line1
50437                     .append('label')
50438                     .attr('class', 'streetside-hires');
50439
50440                 label
50441                     .append('input')
50442                     .attr('type', 'checkbox')
50443                     .attr('id', 'streetside-hires-input')
50444                     .property('checked', _hires)
50445                     .on('click', function() {
50446                         event.stopPropagation();
50447
50448                         _hires = !_hires;
50449                         _resolution = _hires ? 1024 : 512;
50450                         wrap.call(setupCanvas, true);
50451
50452                         var viewstate = {
50453                             yaw: _pannellumViewer.getYaw(),
50454                             pitch: _pannellumViewer.getPitch(),
50455                             hfov: _pannellumViewer.getHfov()
50456                         };
50457
50458                         that.selectImage(d)
50459                             .then(function(r) {
50460                                 if (r.status === 'ok') {
50461                                     _sceneOptions = Object.assign(_sceneOptions, viewstate);
50462                                     that.showViewer();
50463                                 }
50464                             });
50465                     });
50466
50467                 label
50468                     .append('span')
50469                     .text(t('streetside.hires'));
50470
50471
50472                 var captureInfo = line1
50473                     .append('div')
50474                     .attr('class', 'attribution-capture-info');
50475
50476                 // Add capture date
50477                 if (d.captured_by) {
50478                     var yyyy = (new Date()).getFullYear();
50479
50480                     captureInfo
50481                         .append('a')
50482                         .attr('class', 'captured_by')
50483                         .attr('target', '_blank')
50484                         .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
50485                         .text('©' + yyyy + ' Microsoft');
50486
50487                     captureInfo
50488                         .append('span')
50489                         .text('|');
50490                 }
50491
50492                 if (d.captured_at) {
50493                     captureInfo
50494                         .append('span')
50495                         .attr('class', 'captured_at')
50496                         .text(localeTimestamp(d.captured_at));
50497                 }
50498
50499                 // Add image links
50500                 var line2 = attribution
50501                     .append('div')
50502                     .attr('class', 'attribution-row');
50503
50504                 line2
50505                     .append('a')
50506                     .attr('class', 'image-view-link')
50507                     .attr('target', '_blank')
50508                     .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
50509                         '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
50510                     .text(t('streetside.view_on_bing'));
50511
50512                 line2
50513                     .append('a')
50514                     .attr('class', 'image-report-link')
50515                     .attr('target', '_blank')
50516                     .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
50517                         '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
50518                     .text(t('streetside.report'));
50519
50520
50521                 var bubbleIdQuadKey = d.key.toString(4);
50522                 var paddingNeeded = 16 - bubbleIdQuadKey.length;
50523                 for (var i = 0; i < paddingNeeded; i++) {
50524                     bubbleIdQuadKey = '0' + bubbleIdQuadKey;
50525                 }
50526                 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
50527                 var imgUrlSuffix = '.jpg?g=6338&n=z';
50528
50529                 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
50530                 var faceKeys = ['01','02','03','10','11','12'];
50531
50532                 // Map images to cube faces
50533                 var quadKeys = getQuadKeys();
50534                 var faces = faceKeys.map(function(faceKey) {
50535                     return quadKeys.map(function(quadKey) {
50536                         var xy = qkToXY(quadKey);
50537                         return {
50538                             face: faceKey,
50539                             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
50540                             x: xy[0],
50541                             y: xy[1]
50542                         };
50543                     });
50544                 });
50545
50546                 processFaces(faces).then(function() {
50547                     _sceneOptions = {
50548                         showFullscreenCtrl: false,
50549                         autoLoad: true,
50550                         compass: true,
50551                         northOffset: d.ca,
50552                         yaw: 0,
50553                         minHfov: minHfov,
50554                         maxHfov: maxHfov,
50555                         hfov: defaultHfov,
50556                         type: 'cubemap',
50557                         cubeMap: [
50558                             _dataUrlArray[0],
50559                             _dataUrlArray[1],
50560                             _dataUrlArray[2],
50561                             _dataUrlArray[3],
50562                             _dataUrlArray[4],
50563                             _dataUrlArray[5]
50564                         ]
50565                     };
50566                     response.resolve({status: 'ok'});
50567                 });
50568
50569                 return response.promise;
50570             },
50571
50572
50573             getSequenceKeyForBubble: function(d) {
50574                 return d && d.sequenceKey;
50575             },
50576
50577
50578             // Updates the currently highlighted sequence and selected bubble.
50579             // Reset is only necessary when interacting with the viewport because
50580             // this implicitly changes the currently selected bubble/sequence
50581             setStyles: function (hovered, reset) {
50582                 if (reset) {  // reset all layers
50583                     d3_selectAll('.viewfield-group')
50584                         .classed('highlighted', false)
50585                         .classed('hovered', false)
50586                         .classed('currentView', false);
50587
50588                     d3_selectAll('.sequence')
50589                         .classed('highlighted', false)
50590                         .classed('currentView', false);
50591                 }
50592
50593                 var hoveredBubbleKey = hovered && hovered.key;
50594                 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
50595                 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
50596                 var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
50597
50598                 var viewer = d3_select('#photoviewer');
50599                 var selected = viewer.empty() ? undefined : viewer.datum();
50600                 var selectedBubbleKey = selected && selected.key;
50601                 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
50602                 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
50603                 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
50604
50605                 // highlight sibling viewfields on either the selected or the hovered sequences
50606                 var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
50607
50608                 d3_selectAll('.layer-streetside-images .viewfield-group')
50609                     .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
50610                     .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
50611                     .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
50612
50613                 d3_selectAll('.layer-streetside-images .sequence')
50614                     .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
50615                     .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
50616
50617                 // update viewfields if needed
50618                 d3_selectAll('.viewfield-group .viewfield')
50619                     .attr('d', viewfieldPath);
50620
50621                 function viewfieldPath() {
50622                     var d = this.parentNode.__data__;
50623                     if (d.pano && d.key !== selectedBubbleKey) {
50624                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
50625                     } else {
50626                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
50627                     }
50628                 }
50629
50630                 return this;
50631             },
50632
50633             /**
50634              * cache().
50635              */
50636             cache: function () {
50637                 return _ssCache;
50638             }
50639         };
50640
50641         var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
50642         var _inflight$2 = {};
50643         var _popularKeys = {};
50644         var _taginfoCache = {};
50645
50646         var tag_sorts = {
50647             point: 'count_nodes',
50648             vertex: 'count_nodes',
50649             area: 'count_ways',
50650             line: 'count_ways'
50651         };
50652         var tag_sort_members = {
50653             point: 'count_node_members',
50654             vertex: 'count_node_members',
50655             area: 'count_way_members',
50656             line: 'count_way_members',
50657             relation: 'count_relation_members'
50658         };
50659         var tag_filters = {
50660             point: 'nodes',
50661             vertex: 'nodes',
50662             area: 'ways',
50663             line: 'ways'
50664         };
50665         var tag_members_fractions = {
50666             point: 'count_node_members_fraction',
50667             vertex: 'count_node_members_fraction',
50668             area: 'count_way_members_fraction',
50669             line: 'count_way_members_fraction',
50670             relation: 'count_relation_members_fraction'
50671         };
50672
50673
50674         function sets(params, n, o) {
50675             if (params.geometry && o[params.geometry]) {
50676                 params[n] = o[params.geometry];
50677             }
50678             return params;
50679         }
50680
50681
50682         function setFilter(params) {
50683             return sets(params, 'filter', tag_filters);
50684         }
50685
50686
50687         function setSort(params) {
50688             return sets(params, 'sortname', tag_sorts);
50689         }
50690
50691
50692         function setSortMembers(params) {
50693             return sets(params, 'sortname', tag_sort_members);
50694         }
50695
50696
50697         function clean(params) {
50698             return utilObjectOmit(params, ['geometry', 'debounce']);
50699         }
50700
50701
50702         function filterKeys(type) {
50703             var count_type = type ? 'count_' + type : 'count_all';
50704             return function(d) {
50705                 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
50706             };
50707         }
50708
50709
50710         function filterMultikeys(prefix) {
50711             return function(d) {
50712                 // d.key begins with prefix, and d.key contains no additional ':'s
50713                 var re = new RegExp('^' + prefix + '(.*)$');
50714                 var matches = d.key.match(re) || [];
50715                 return (matches.length === 2 && matches[1].indexOf(':') === -1);
50716             };
50717         }
50718
50719
50720         function filterValues(allowUpperCase) {
50721             return function(d) {
50722                 if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
50723                 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
50724                 return parseFloat(d.fraction) > 0.0;
50725             };
50726         }
50727
50728
50729         function filterRoles(geometry) {
50730             return function(d) {
50731                 if (d.role === '') return false; // exclude empty role
50732                 if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
50733                 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
50734             };
50735         }
50736
50737
50738         function valKey(d) {
50739             return {
50740                 value: d.key,
50741                 title: d.key
50742             };
50743         }
50744
50745
50746         function valKeyDescription(d) {
50747             return {
50748                 value: d.value,
50749                 title: d.description || d.value
50750             };
50751         }
50752
50753
50754         function roleKey(d) {
50755             return {
50756                 value: d.role,
50757                 title: d.role
50758             };
50759         }
50760
50761
50762         // sort keys with ':' lower than keys without ':'
50763         function sortKeys(a, b) {
50764             return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
50765                 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
50766                 : 0;
50767         }
50768
50769
50770         var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
50771
50772         function request$1(url, params, exactMatch, callback, loaded) {
50773             if (_inflight$2[url]) return;
50774
50775             if (checkCache(url, params, exactMatch, callback)) return;
50776
50777             var controller = new AbortController();
50778             _inflight$2[url] = controller;
50779
50780             d3_json(url, { signal: controller.signal })
50781                 .then(function(result) {
50782                     delete _inflight$2[url];
50783                     if (loaded) loaded(null, result);
50784                 })
50785                 .catch(function(err) {
50786                     delete _inflight$2[url];
50787                     if (err.name === 'AbortError') return;
50788                     if (loaded) loaded(err.message);
50789                 });
50790         }
50791
50792
50793         function checkCache(url, params, exactMatch, callback) {
50794             var rp = params.rp || 25;
50795             var testQuery = params.query || '';
50796             var testUrl = url;
50797
50798             do {
50799                 var hit = _taginfoCache[testUrl];
50800
50801                 // exact match, or shorter match yielding fewer than max results (rp)
50802                 if (hit && (url === testUrl || hit.length < rp)) {
50803                     callback(null, hit);
50804                     return true;
50805                 }
50806
50807                 // don't try to shorten the query
50808                 if (exactMatch || !testQuery.length) return false;
50809
50810                 // do shorten the query to see if we already have a cached result
50811                 // that has returned fewer than max results (rp)
50812                 testQuery = testQuery.slice(0, -1);
50813                 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
50814             } while (testQuery.length >= 0);
50815
50816             return false;
50817         }
50818
50819
50820         var serviceTaginfo = {
50821
50822             init: function() {
50823                 _inflight$2 = {};
50824                 _taginfoCache = {};
50825                 _popularKeys = {
50826                     postal_code: true   // #5377
50827                 };
50828
50829                 // Fetch popular keys.  We'll exclude these from `values`
50830                 // lookups because they stress taginfo, and they aren't likely
50831                 // to yield meaningful autocomplete results.. see #3955
50832                 var params = {
50833                     rp: 100,
50834                     sortname: 'values_all',
50835                     sortorder: 'desc',
50836                     page: 1,
50837                     debounce: false,
50838                     lang: currentLocale
50839                 };
50840                 this.keys(params, function(err, data) {
50841                     if (err) return;
50842                     data.forEach(function(d) {
50843                         if (d.value === 'opening_hours') return;  // exception
50844                         _popularKeys[d.value] = true;
50845                     });
50846                 });
50847             },
50848
50849
50850             reset: function() {
50851                 Object.values(_inflight$2).forEach(function(controller) { controller.abort(); });
50852                 _inflight$2 = {};
50853             },
50854
50855
50856             keys: function(params, callback) {
50857                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50858                 params = clean(setSort(params));
50859                 params = Object.assign({
50860                     rp: 10,
50861                     sortname: 'count_all',
50862                     sortorder: 'desc',
50863                     page: 1,
50864                     lang: currentLocale
50865                 }, params);
50866
50867                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50868                 doRequest(url, params, false, callback, function(err, d) {
50869                     if (err) {
50870                         callback(err);
50871                     } else {
50872                         var f = filterKeys(params.filter);
50873                         var result = d.data.filter(f).sort(sortKeys).map(valKey);
50874                         _taginfoCache[url] = result;
50875                         callback(null, result);
50876                     }
50877                 });
50878             },
50879
50880
50881             multikeys: function(params, callback) {
50882                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50883                 params = clean(setSort(params));
50884                 params = Object.assign({
50885                     rp: 25,
50886                     sortname: 'count_all',
50887                     sortorder: 'desc',
50888                     page: 1,
50889                     lang: currentLocale
50890                 }, params);
50891
50892                 var prefix = params.query;
50893                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50894                 doRequest(url, params, true, callback, function(err, d) {
50895                     if (err) {
50896                         callback(err);
50897                     } else {
50898                         var f = filterMultikeys(prefix);
50899                         var result = d.data.filter(f).map(valKey);
50900                         _taginfoCache[url] = result;
50901                         callback(null, result);
50902                     }
50903                 });
50904             },
50905
50906
50907             values: function(params, callback) {
50908                 // Exclude popular keys from values lookups.. see #3955
50909                 var key = params.key;
50910                 if (key && _popularKeys[key]) {
50911                     callback(null, []);
50912                     return;
50913                 }
50914
50915                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50916                 params = clean(setSort(setFilter(params)));
50917                 params = Object.assign({
50918                     rp: 25,
50919                     sortname: 'count_all',
50920                     sortorder: 'desc',
50921                     page: 1,
50922                     lang: currentLocale
50923                 }, params);
50924
50925                 var url = apibase$4 + 'key/values?' + utilQsString(params);
50926                 doRequest(url, params, false, callback, function(err, d) {
50927                     if (err) {
50928                         callback(err);
50929                     } else {
50930                         // In most cases we prefer taginfo value results with lowercase letters.
50931                         // A few OSM keys expect values to contain uppercase values (see #3377).
50932                         // This is not an exhaustive list (e.g. `name` also has uppercase values)
50933                         // but these are the fields where taginfo value lookup is most useful.
50934                         var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer/;
50935                         var allowUpperCase = re.test(params.key);
50936                         var f = filterValues(allowUpperCase);
50937
50938                         var result = d.data.filter(f).map(valKeyDescription);
50939                         _taginfoCache[url] = result;
50940                         callback(null, result);
50941                     }
50942                 });
50943             },
50944
50945
50946             roles: function(params, callback) {
50947                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50948                 var geometry = params.geometry;
50949                 params = clean(setSortMembers(params));
50950                 params = Object.assign({
50951                     rp: 25,
50952                     sortname: 'count_all_members',
50953                     sortorder: 'desc',
50954                     page: 1,
50955                     lang: currentLocale
50956                 }, params);
50957
50958                 var url = apibase$4 + 'relation/roles?' + utilQsString(params);
50959                 doRequest(url, params, true, callback, function(err, d) {
50960                     if (err) {
50961                         callback(err);
50962                     } else {
50963                         var f = filterRoles(geometry);
50964                         var result = d.data.filter(f).map(roleKey);
50965                         _taginfoCache[url] = result;
50966                         callback(null, result);
50967                     }
50968                 });
50969             },
50970
50971
50972             docs: function(params, callback) {
50973                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50974                 params = clean(setSort(params));
50975
50976                 var path = 'key/wiki_pages?';
50977                 if (params.value) {
50978                     path = 'tag/wiki_pages?';
50979                 } else if (params.rtype) {
50980                     path = 'relation/wiki_pages?';
50981                 }
50982
50983                 var url = apibase$4 + path + utilQsString(params);
50984                 doRequest(url, params, true, callback, function(err, d) {
50985                     if (err) {
50986                         callback(err);
50987                     } else {
50988                         _taginfoCache[url] = d.data;
50989                         callback(null, d.data);
50990                     }
50991                 });
50992             },
50993
50994
50995             apibase: function(_) {
50996                 if (!arguments.length) return apibase$4;
50997                 apibase$4 = _;
50998                 return this;
50999             }
51000
51001         };
51002
51003         var helpers = createCommonjsModule(function (module, exports) {
51004         Object.defineProperty(exports, "__esModule", { value: true });
51005         /**
51006          * @module helpers
51007          */
51008         /**
51009          * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
51010          *
51011          * @memberof helpers
51012          * @type {number}
51013          */
51014         exports.earthRadius = 6371008.8;
51015         /**
51016          * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
51017          *
51018          * @memberof helpers
51019          * @type {Object}
51020          */
51021         exports.factors = {
51022             centimeters: exports.earthRadius * 100,
51023             centimetres: exports.earthRadius * 100,
51024             degrees: exports.earthRadius / 111325,
51025             feet: exports.earthRadius * 3.28084,
51026             inches: exports.earthRadius * 39.370,
51027             kilometers: exports.earthRadius / 1000,
51028             kilometres: exports.earthRadius / 1000,
51029             meters: exports.earthRadius,
51030             metres: exports.earthRadius,
51031             miles: exports.earthRadius / 1609.344,
51032             millimeters: exports.earthRadius * 1000,
51033             millimetres: exports.earthRadius * 1000,
51034             nauticalmiles: exports.earthRadius / 1852,
51035             radians: 1,
51036             yards: exports.earthRadius / 1.0936,
51037         };
51038         /**
51039          * Units of measurement factors based on 1 meter.
51040          *
51041          * @memberof helpers
51042          * @type {Object}
51043          */
51044         exports.unitsFactors = {
51045             centimeters: 100,
51046             centimetres: 100,
51047             degrees: 1 / 111325,
51048             feet: 3.28084,
51049             inches: 39.370,
51050             kilometers: 1 / 1000,
51051             kilometres: 1 / 1000,
51052             meters: 1,
51053             metres: 1,
51054             miles: 1 / 1609.344,
51055             millimeters: 1000,
51056             millimetres: 1000,
51057             nauticalmiles: 1 / 1852,
51058             radians: 1 / exports.earthRadius,
51059             yards: 1 / 1.0936,
51060         };
51061         /**
51062          * Area of measurement factors based on 1 square meter.
51063          *
51064          * @memberof helpers
51065          * @type {Object}
51066          */
51067         exports.areaFactors = {
51068             acres: 0.000247105,
51069             centimeters: 10000,
51070             centimetres: 10000,
51071             feet: 10.763910417,
51072             inches: 1550.003100006,
51073             kilometers: 0.000001,
51074             kilometres: 0.000001,
51075             meters: 1,
51076             metres: 1,
51077             miles: 3.86e-7,
51078             millimeters: 1000000,
51079             millimetres: 1000000,
51080             yards: 1.195990046,
51081         };
51082         /**
51083          * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
51084          *
51085          * @name feature
51086          * @param {Geometry} geometry input geometry
51087          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51088          * @param {Object} [options={}] Optional Parameters
51089          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51090          * @param {string|number} [options.id] Identifier associated with the Feature
51091          * @returns {Feature} a GeoJSON Feature
51092          * @example
51093          * var geometry = {
51094          *   "type": "Point",
51095          *   "coordinates": [110, 50]
51096          * };
51097          *
51098          * var feature = turf.feature(geometry);
51099          *
51100          * //=feature
51101          */
51102         function feature(geom, properties, options) {
51103             if (options === void 0) { options = {}; }
51104             var feat = { type: "Feature" };
51105             if (options.id === 0 || options.id) {
51106                 feat.id = options.id;
51107             }
51108             if (options.bbox) {
51109                 feat.bbox = options.bbox;
51110             }
51111             feat.properties = properties || {};
51112             feat.geometry = geom;
51113             return feat;
51114         }
51115         exports.feature = feature;
51116         /**
51117          * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
51118          * For GeometryCollection type use `helpers.geometryCollection`
51119          *
51120          * @name geometry
51121          * @param {string} type Geometry Type
51122          * @param {Array<any>} coordinates Coordinates
51123          * @param {Object} [options={}] Optional Parameters
51124          * @returns {Geometry} a GeoJSON Geometry
51125          * @example
51126          * var type = "Point";
51127          * var coordinates = [110, 50];
51128          * var geometry = turf.geometry(type, coordinates);
51129          * // => geometry
51130          */
51131         function geometry(type, coordinates, options) {
51132             switch (type) {
51133                 case "Point": return point(coordinates).geometry;
51134                 case "LineString": return lineString(coordinates).geometry;
51135                 case "Polygon": return polygon(coordinates).geometry;
51136                 case "MultiPoint": return multiPoint(coordinates).geometry;
51137                 case "MultiLineString": return multiLineString(coordinates).geometry;
51138                 case "MultiPolygon": return multiPolygon(coordinates).geometry;
51139                 default: throw new Error(type + " is invalid");
51140             }
51141         }
51142         exports.geometry = geometry;
51143         /**
51144          * Creates a {@link Point} {@link Feature} from a Position.
51145          *
51146          * @name point
51147          * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
51148          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51149          * @param {Object} [options={}] Optional Parameters
51150          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51151          * @param {string|number} [options.id] Identifier associated with the Feature
51152          * @returns {Feature<Point>} a Point feature
51153          * @example
51154          * var point = turf.point([-75.343, 39.984]);
51155          *
51156          * //=point
51157          */
51158         function point(coordinates, properties, options) {
51159             if (options === void 0) { options = {}; }
51160             var geom = {
51161                 type: "Point",
51162                 coordinates: coordinates,
51163             };
51164             return feature(geom, properties, options);
51165         }
51166         exports.point = point;
51167         /**
51168          * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
51169          *
51170          * @name points
51171          * @param {Array<Array<number>>} coordinates an array of Points
51172          * @param {Object} [properties={}] Translate these properties to each Feature
51173          * @param {Object} [options={}] Optional Parameters
51174          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51175          * associated with the FeatureCollection
51176          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51177          * @returns {FeatureCollection<Point>} Point Feature
51178          * @example
51179          * var points = turf.points([
51180          *   [-75, 39],
51181          *   [-80, 45],
51182          *   [-78, 50]
51183          * ]);
51184          *
51185          * //=points
51186          */
51187         function points(coordinates, properties, options) {
51188             if (options === void 0) { options = {}; }
51189             return featureCollection(coordinates.map(function (coords) {
51190                 return point(coords, properties);
51191             }), options);
51192         }
51193         exports.points = points;
51194         /**
51195          * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
51196          *
51197          * @name polygon
51198          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51199          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51200          * @param {Object} [options={}] Optional Parameters
51201          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51202          * @param {string|number} [options.id] Identifier associated with the Feature
51203          * @returns {Feature<Polygon>} Polygon Feature
51204          * @example
51205          * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
51206          *
51207          * //=polygon
51208          */
51209         function polygon(coordinates, properties, options) {
51210             if (options === void 0) { options = {}; }
51211             for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
51212                 var ring = coordinates_1[_i];
51213                 if (ring.length < 4) {
51214                     throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
51215                 }
51216                 for (var j = 0; j < ring[ring.length - 1].length; j++) {
51217                     // Check if first point of Polygon contains two numbers
51218                     if (ring[ring.length - 1][j] !== ring[0][j]) {
51219                         throw new Error("First and last Position are not equivalent.");
51220                     }
51221                 }
51222             }
51223             var geom = {
51224                 type: "Polygon",
51225                 coordinates: coordinates,
51226             };
51227             return feature(geom, properties, options);
51228         }
51229         exports.polygon = polygon;
51230         /**
51231          * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
51232          *
51233          * @name polygons
51234          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
51235          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51236          * @param {Object} [options={}] Optional Parameters
51237          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51238          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51239          * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
51240          * @example
51241          * var polygons = turf.polygons([
51242          *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
51243          *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
51244          * ]);
51245          *
51246          * //=polygons
51247          */
51248         function polygons(coordinates, properties, options) {
51249             if (options === void 0) { options = {}; }
51250             return featureCollection(coordinates.map(function (coords) {
51251                 return polygon(coords, properties);
51252             }), options);
51253         }
51254         exports.polygons = polygons;
51255         /**
51256          * Creates a {@link LineString} {@link Feature} from an Array of Positions.
51257          *
51258          * @name lineString
51259          * @param {Array<Array<number>>} coordinates an array of Positions
51260          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51261          * @param {Object} [options={}] Optional Parameters
51262          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51263          * @param {string|number} [options.id] Identifier associated with the Feature
51264          * @returns {Feature<LineString>} LineString Feature
51265          * @example
51266          * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
51267          * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
51268          *
51269          * //=linestring1
51270          * //=linestring2
51271          */
51272         function lineString(coordinates, properties, options) {
51273             if (options === void 0) { options = {}; }
51274             if (coordinates.length < 2) {
51275                 throw new Error("coordinates must be an array of two or more positions");
51276             }
51277             var geom = {
51278                 type: "LineString",
51279                 coordinates: coordinates,
51280             };
51281             return feature(geom, properties, options);
51282         }
51283         exports.lineString = lineString;
51284         /**
51285          * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
51286          *
51287          * @name lineStrings
51288          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51289          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51290          * @param {Object} [options={}] Optional Parameters
51291          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51292          * associated with the FeatureCollection
51293          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51294          * @returns {FeatureCollection<LineString>} LineString FeatureCollection
51295          * @example
51296          * var linestrings = turf.lineStrings([
51297          *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
51298          *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
51299          * ]);
51300          *
51301          * //=linestrings
51302          */
51303         function lineStrings(coordinates, properties, options) {
51304             if (options === void 0) { options = {}; }
51305             return featureCollection(coordinates.map(function (coords) {
51306                 return lineString(coords, properties);
51307             }), options);
51308         }
51309         exports.lineStrings = lineStrings;
51310         /**
51311          * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
51312          *
51313          * @name featureCollection
51314          * @param {Feature[]} features input features
51315          * @param {Object} [options={}] Optional Parameters
51316          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51317          * @param {string|number} [options.id] Identifier associated with the Feature
51318          * @returns {FeatureCollection} FeatureCollection of Features
51319          * @example
51320          * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
51321          * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
51322          * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
51323          *
51324          * var collection = turf.featureCollection([
51325          *   locationA,
51326          *   locationB,
51327          *   locationC
51328          * ]);
51329          *
51330          * //=collection
51331          */
51332         function featureCollection(features, options) {
51333             if (options === void 0) { options = {}; }
51334             var fc = { type: "FeatureCollection" };
51335             if (options.id) {
51336                 fc.id = options.id;
51337             }
51338             if (options.bbox) {
51339                 fc.bbox = options.bbox;
51340             }
51341             fc.features = features;
51342             return fc;
51343         }
51344         exports.featureCollection = featureCollection;
51345         /**
51346          * Creates a {@link Feature<MultiLineString>} based on a
51347          * coordinate array. Properties can be added optionally.
51348          *
51349          * @name multiLineString
51350          * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
51351          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51352          * @param {Object} [options={}] Optional Parameters
51353          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51354          * @param {string|number} [options.id] Identifier associated with the Feature
51355          * @returns {Feature<MultiLineString>} a MultiLineString feature
51356          * @throws {Error} if no coordinates are passed
51357          * @example
51358          * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
51359          *
51360          * //=multiLine
51361          */
51362         function multiLineString(coordinates, properties, options) {
51363             if (options === void 0) { options = {}; }
51364             var geom = {
51365                 type: "MultiLineString",
51366                 coordinates: coordinates,
51367             };
51368             return feature(geom, properties, options);
51369         }
51370         exports.multiLineString = multiLineString;
51371         /**
51372          * Creates a {@link Feature<MultiPoint>} based on a
51373          * coordinate array. Properties can be added optionally.
51374          *
51375          * @name multiPoint
51376          * @param {Array<Array<number>>} coordinates an array of Positions
51377          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51378          * @param {Object} [options={}] Optional Parameters
51379          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51380          * @param {string|number} [options.id] Identifier associated with the Feature
51381          * @returns {Feature<MultiPoint>} a MultiPoint feature
51382          * @throws {Error} if no coordinates are passed
51383          * @example
51384          * var multiPt = turf.multiPoint([[0,0],[10,10]]);
51385          *
51386          * //=multiPt
51387          */
51388         function multiPoint(coordinates, properties, options) {
51389             if (options === void 0) { options = {}; }
51390             var geom = {
51391                 type: "MultiPoint",
51392                 coordinates: coordinates,
51393             };
51394             return feature(geom, properties, options);
51395         }
51396         exports.multiPoint = multiPoint;
51397         /**
51398          * Creates a {@link Feature<MultiPolygon>} based on a
51399          * coordinate array. Properties can be added optionally.
51400          *
51401          * @name multiPolygon
51402          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
51403          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51404          * @param {Object} [options={}] Optional Parameters
51405          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51406          * @param {string|number} [options.id] Identifier associated with the Feature
51407          * @returns {Feature<MultiPolygon>} a multipolygon feature
51408          * @throws {Error} if no coordinates are passed
51409          * @example
51410          * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
51411          *
51412          * //=multiPoly
51413          *
51414          */
51415         function multiPolygon(coordinates, properties, options) {
51416             if (options === void 0) { options = {}; }
51417             var geom = {
51418                 type: "MultiPolygon",
51419                 coordinates: coordinates,
51420             };
51421             return feature(geom, properties, options);
51422         }
51423         exports.multiPolygon = multiPolygon;
51424         /**
51425          * Creates a {@link Feature<GeometryCollection>} based on a
51426          * coordinate array. Properties can be added optionally.
51427          *
51428          * @name geometryCollection
51429          * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
51430          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51431          * @param {Object} [options={}] Optional Parameters
51432          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51433          * @param {string|number} [options.id] Identifier associated with the Feature
51434          * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
51435          * @example
51436          * var pt = turf.geometry("Point", [100, 0]);
51437          * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
51438          * var collection = turf.geometryCollection([pt, line]);
51439          *
51440          * // => collection
51441          */
51442         function geometryCollection(geometries, properties, options) {
51443             if (options === void 0) { options = {}; }
51444             var geom = {
51445                 type: "GeometryCollection",
51446                 geometries: geometries,
51447             };
51448             return feature(geom, properties, options);
51449         }
51450         exports.geometryCollection = geometryCollection;
51451         /**
51452          * Round number to precision
51453          *
51454          * @param {number} num Number
51455          * @param {number} [precision=0] Precision
51456          * @returns {number} rounded number
51457          * @example
51458          * turf.round(120.4321)
51459          * //=120
51460          *
51461          * turf.round(120.4321, 2)
51462          * //=120.43
51463          */
51464         function round(num, precision) {
51465             if (precision === void 0) { precision = 0; }
51466             if (precision && !(precision >= 0)) {
51467                 throw new Error("precision must be a positive number");
51468             }
51469             var multiplier = Math.pow(10, precision || 0);
51470             return Math.round(num * multiplier) / multiplier;
51471         }
51472         exports.round = round;
51473         /**
51474          * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
51475          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51476          *
51477          * @name radiansToLength
51478          * @param {number} radians in radians across the sphere
51479          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51480          * meters, kilometres, kilometers.
51481          * @returns {number} distance
51482          */
51483         function radiansToLength(radians, units) {
51484             if (units === void 0) { units = "kilometers"; }
51485             var factor = exports.factors[units];
51486             if (!factor) {
51487                 throw new Error(units + " units is invalid");
51488             }
51489             return radians * factor;
51490         }
51491         exports.radiansToLength = radiansToLength;
51492         /**
51493          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
51494          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51495          *
51496          * @name lengthToRadians
51497          * @param {number} distance in real units
51498          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51499          * meters, kilometres, kilometers.
51500          * @returns {number} radians
51501          */
51502         function lengthToRadians(distance, units) {
51503             if (units === void 0) { units = "kilometers"; }
51504             var factor = exports.factors[units];
51505             if (!factor) {
51506                 throw new Error(units + " units is invalid");
51507             }
51508             return distance / factor;
51509         }
51510         exports.lengthToRadians = lengthToRadians;
51511         /**
51512          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
51513          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
51514          *
51515          * @name lengthToDegrees
51516          * @param {number} distance in real units
51517          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51518          * meters, kilometres, kilometers.
51519          * @returns {number} degrees
51520          */
51521         function lengthToDegrees(distance, units) {
51522             return radiansToDegrees(lengthToRadians(distance, units));
51523         }
51524         exports.lengthToDegrees = lengthToDegrees;
51525         /**
51526          * Converts any bearing angle from the north line direction (positive clockwise)
51527          * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
51528          *
51529          * @name bearingToAzimuth
51530          * @param {number} bearing angle, between -180 and +180 degrees
51531          * @returns {number} angle between 0 and 360 degrees
51532          */
51533         function bearingToAzimuth(bearing) {
51534             var angle = bearing % 360;
51535             if (angle < 0) {
51536                 angle += 360;
51537             }
51538             return angle;
51539         }
51540         exports.bearingToAzimuth = bearingToAzimuth;
51541         /**
51542          * Converts an angle in radians to degrees
51543          *
51544          * @name radiansToDegrees
51545          * @param {number} radians angle in radians
51546          * @returns {number} degrees between 0 and 360 degrees
51547          */
51548         function radiansToDegrees(radians) {
51549             var degrees = radians % (2 * Math.PI);
51550             return degrees * 180 / Math.PI;
51551         }
51552         exports.radiansToDegrees = radiansToDegrees;
51553         /**
51554          * Converts an angle in degrees to radians
51555          *
51556          * @name degreesToRadians
51557          * @param {number} degrees angle between 0 and 360 degrees
51558          * @returns {number} angle in radians
51559          */
51560         function degreesToRadians(degrees) {
51561             var radians = degrees % 360;
51562             return radians * Math.PI / 180;
51563         }
51564         exports.degreesToRadians = degreesToRadians;
51565         /**
51566          * Converts a length to the requested unit.
51567          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51568          *
51569          * @param {number} length to be converted
51570          * @param {Units} [originalUnit="kilometers"] of the length
51571          * @param {Units} [finalUnit="kilometers"] returned unit
51572          * @returns {number} the converted length
51573          */
51574         function convertLength(length, originalUnit, finalUnit) {
51575             if (originalUnit === void 0) { originalUnit = "kilometers"; }
51576             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51577             if (!(length >= 0)) {
51578                 throw new Error("length must be a positive number");
51579             }
51580             return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
51581         }
51582         exports.convertLength = convertLength;
51583         /**
51584          * Converts a area to the requested unit.
51585          * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
51586          * @param {number} area to be converted
51587          * @param {Units} [originalUnit="meters"] of the distance
51588          * @param {Units} [finalUnit="kilometers"] returned unit
51589          * @returns {number} the converted distance
51590          */
51591         function convertArea(area, originalUnit, finalUnit) {
51592             if (originalUnit === void 0) { originalUnit = "meters"; }
51593             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51594             if (!(area >= 0)) {
51595                 throw new Error("area must be a positive number");
51596             }
51597             var startFactor = exports.areaFactors[originalUnit];
51598             if (!startFactor) {
51599                 throw new Error("invalid original units");
51600             }
51601             var finalFactor = exports.areaFactors[finalUnit];
51602             if (!finalFactor) {
51603                 throw new Error("invalid final units");
51604             }
51605             return (area / startFactor) * finalFactor;
51606         }
51607         exports.convertArea = convertArea;
51608         /**
51609          * isNumber
51610          *
51611          * @param {*} num Number to validate
51612          * @returns {boolean} true/false
51613          * @example
51614          * turf.isNumber(123)
51615          * //=true
51616          * turf.isNumber('foo')
51617          * //=false
51618          */
51619         function isNumber(num) {
51620             return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
51621         }
51622         exports.isNumber = isNumber;
51623         /**
51624          * isObject
51625          *
51626          * @param {*} input variable to validate
51627          * @returns {boolean} true/false
51628          * @example
51629          * turf.isObject({elevation: 10})
51630          * //=true
51631          * turf.isObject('foo')
51632          * //=false
51633          */
51634         function isObject(input) {
51635             return (!!input) && (input.constructor === Object);
51636         }
51637         exports.isObject = isObject;
51638         /**
51639          * Validate BBox
51640          *
51641          * @private
51642          * @param {Array<number>} bbox BBox to validate
51643          * @returns {void}
51644          * @throws Error if BBox is not valid
51645          * @example
51646          * validateBBox([-180, -40, 110, 50])
51647          * //=OK
51648          * validateBBox([-180, -40])
51649          * //=Error
51650          * validateBBox('Foo')
51651          * //=Error
51652          * validateBBox(5)
51653          * //=Error
51654          * validateBBox(null)
51655          * //=Error
51656          * validateBBox(undefined)
51657          * //=Error
51658          */
51659         function validateBBox(bbox) {
51660             if (!bbox) {
51661                 throw new Error("bbox is required");
51662             }
51663             if (!Array.isArray(bbox)) {
51664                 throw new Error("bbox must be an Array");
51665             }
51666             if (bbox.length !== 4 && bbox.length !== 6) {
51667                 throw new Error("bbox must be an Array of 4 or 6 numbers");
51668             }
51669             bbox.forEach(function (num) {
51670                 if (!isNumber(num)) {
51671                     throw new Error("bbox must only contain numbers");
51672                 }
51673             });
51674         }
51675         exports.validateBBox = validateBBox;
51676         /**
51677          * Validate Id
51678          *
51679          * @private
51680          * @param {string|number} id Id to validate
51681          * @returns {void}
51682          * @throws Error if Id is not valid
51683          * @example
51684          * validateId([-180, -40, 110, 50])
51685          * //=Error
51686          * validateId([-180, -40])
51687          * //=Error
51688          * validateId('Foo')
51689          * //=OK
51690          * validateId(5)
51691          * //=OK
51692          * validateId(null)
51693          * //=Error
51694          * validateId(undefined)
51695          * //=Error
51696          */
51697         function validateId(id) {
51698             if (!id) {
51699                 throw new Error("id is required");
51700             }
51701             if (["string", "number"].indexOf(typeof id) === -1) {
51702                 throw new Error("id must be a number or a string");
51703             }
51704         }
51705         exports.validateId = validateId;
51706         // Deprecated methods
51707         function radians2degrees() {
51708             throw new Error("method has been renamed to `radiansToDegrees`");
51709         }
51710         exports.radians2degrees = radians2degrees;
51711         function degrees2radians() {
51712             throw new Error("method has been renamed to `degreesToRadians`");
51713         }
51714         exports.degrees2radians = degrees2radians;
51715         function distanceToDegrees() {
51716             throw new Error("method has been renamed to `lengthToDegrees`");
51717         }
51718         exports.distanceToDegrees = distanceToDegrees;
51719         function distanceToRadians() {
51720             throw new Error("method has been renamed to `lengthToRadians`");
51721         }
51722         exports.distanceToRadians = distanceToRadians;
51723         function radiansToDistance() {
51724             throw new Error("method has been renamed to `radiansToLength`");
51725         }
51726         exports.radiansToDistance = radiansToDistance;
51727         function bearingToAngle() {
51728             throw new Error("method has been renamed to `bearingToAzimuth`");
51729         }
51730         exports.bearingToAngle = bearingToAngle;
51731         function convertDistance() {
51732             throw new Error("method has been renamed to `convertLength`");
51733         }
51734         exports.convertDistance = convertDistance;
51735         });
51736
51737         unwrapExports(helpers);
51738         var helpers_1 = helpers.earthRadius;
51739         var helpers_2 = helpers.factors;
51740         var helpers_3 = helpers.unitsFactors;
51741         var helpers_4 = helpers.areaFactors;
51742         var helpers_5 = helpers.feature;
51743         var helpers_6 = helpers.geometry;
51744         var helpers_7 = helpers.point;
51745         var helpers_8 = helpers.points;
51746         var helpers_9 = helpers.polygon;
51747         var helpers_10 = helpers.polygons;
51748         var helpers_11 = helpers.lineString;
51749         var helpers_12 = helpers.lineStrings;
51750         var helpers_13 = helpers.featureCollection;
51751         var helpers_14 = helpers.multiLineString;
51752         var helpers_15 = helpers.multiPoint;
51753         var helpers_16 = helpers.multiPolygon;
51754         var helpers_17 = helpers.geometryCollection;
51755         var helpers_18 = helpers.round;
51756         var helpers_19 = helpers.radiansToLength;
51757         var helpers_20 = helpers.lengthToRadians;
51758         var helpers_21 = helpers.lengthToDegrees;
51759         var helpers_22 = helpers.bearingToAzimuth;
51760         var helpers_23 = helpers.radiansToDegrees;
51761         var helpers_24 = helpers.degreesToRadians;
51762         var helpers_25 = helpers.convertLength;
51763         var helpers_26 = helpers.convertArea;
51764         var helpers_27 = helpers.isNumber;
51765         var helpers_28 = helpers.isObject;
51766         var helpers_29 = helpers.validateBBox;
51767         var helpers_30 = helpers.validateId;
51768         var helpers_31 = helpers.radians2degrees;
51769         var helpers_32 = helpers.degrees2radians;
51770         var helpers_33 = helpers.distanceToDegrees;
51771         var helpers_34 = helpers.distanceToRadians;
51772         var helpers_35 = helpers.radiansToDistance;
51773         var helpers_36 = helpers.bearingToAngle;
51774         var helpers_37 = helpers.convertDistance;
51775
51776         var invariant = createCommonjsModule(function (module, exports) {
51777         Object.defineProperty(exports, "__esModule", { value: true });
51778
51779         /**
51780          * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
51781          *
51782          * @name getCoord
51783          * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
51784          * @returns {Array<number>} coordinates
51785          * @example
51786          * var pt = turf.point([10, 10]);
51787          *
51788          * var coord = turf.getCoord(pt);
51789          * //= [10, 10]
51790          */
51791         function getCoord(coord) {
51792             if (!coord) {
51793                 throw new Error("coord is required");
51794             }
51795             if (!Array.isArray(coord)) {
51796                 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
51797                     return coord.geometry.coordinates;
51798                 }
51799                 if (coord.type === "Point") {
51800                     return coord.coordinates;
51801                 }
51802             }
51803             if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
51804                 return coord;
51805             }
51806             throw new Error("coord must be GeoJSON Point or an Array of numbers");
51807         }
51808         exports.getCoord = getCoord;
51809         /**
51810          * Unwrap coordinates from a Feature, Geometry Object or an Array
51811          *
51812          * @name getCoords
51813          * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
51814          * @returns {Array<any>} coordinates
51815          * @example
51816          * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
51817          *
51818          * var coords = turf.getCoords(poly);
51819          * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
51820          */
51821         function getCoords(coords) {
51822             if (Array.isArray(coords)) {
51823                 return coords;
51824             }
51825             // Feature
51826             if (coords.type === "Feature") {
51827                 if (coords.geometry !== null) {
51828                     return coords.geometry.coordinates;
51829                 }
51830             }
51831             else {
51832                 // Geometry
51833                 if (coords.coordinates) {
51834                     return coords.coordinates;
51835                 }
51836             }
51837             throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
51838         }
51839         exports.getCoords = getCoords;
51840         /**
51841          * Checks if coordinates contains a number
51842          *
51843          * @name containsNumber
51844          * @param {Array<any>} coordinates GeoJSON Coordinates
51845          * @returns {boolean} true if Array contains a number
51846          */
51847         function containsNumber(coordinates) {
51848             if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
51849                 return true;
51850             }
51851             if (Array.isArray(coordinates[0]) && coordinates[0].length) {
51852                 return containsNumber(coordinates[0]);
51853             }
51854             throw new Error("coordinates must only contain numbers");
51855         }
51856         exports.containsNumber = containsNumber;
51857         /**
51858          * Enforce expectations about types of GeoJSON objects for Turf.
51859          *
51860          * @name geojsonType
51861          * @param {GeoJSON} value any GeoJSON object
51862          * @param {string} type expected GeoJSON type
51863          * @param {string} name name of calling function
51864          * @throws {Error} if value is not the expected type.
51865          */
51866         function geojsonType(value, type, name) {
51867             if (!type || !name) {
51868                 throw new Error("type and name required");
51869             }
51870             if (!value || value.type !== type) {
51871                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
51872             }
51873         }
51874         exports.geojsonType = geojsonType;
51875         /**
51876          * Enforce expectations about types of {@link Feature} inputs for Turf.
51877          * Internally this uses {@link geojsonType} to judge geometry types.
51878          *
51879          * @name featureOf
51880          * @param {Feature} feature a feature with an expected geometry type
51881          * @param {string} type expected GeoJSON type
51882          * @param {string} name name of calling function
51883          * @throws {Error} error if value is not the expected type.
51884          */
51885         function featureOf(feature, type, name) {
51886             if (!feature) {
51887                 throw new Error("No feature passed");
51888             }
51889             if (!name) {
51890                 throw new Error(".featureOf() requires a name");
51891             }
51892             if (!feature || feature.type !== "Feature" || !feature.geometry) {
51893                 throw new Error("Invalid input to " + name + ", Feature with geometry required");
51894             }
51895             if (!feature.geometry || feature.geometry.type !== type) {
51896                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51897             }
51898         }
51899         exports.featureOf = featureOf;
51900         /**
51901          * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
51902          * Internally this uses {@link geojsonType} to judge geometry types.
51903          *
51904          * @name collectionOf
51905          * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
51906          * @param {string} type expected GeoJSON type
51907          * @param {string} name name of calling function
51908          * @throws {Error} if value is not the expected type.
51909          */
51910         function collectionOf(featureCollection, type, name) {
51911             if (!featureCollection) {
51912                 throw new Error("No featureCollection passed");
51913             }
51914             if (!name) {
51915                 throw new Error(".collectionOf() requires a name");
51916             }
51917             if (!featureCollection || featureCollection.type !== "FeatureCollection") {
51918                 throw new Error("Invalid input to " + name + ", FeatureCollection required");
51919             }
51920             for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
51921                 var feature = _a[_i];
51922                 if (!feature || feature.type !== "Feature" || !feature.geometry) {
51923                     throw new Error("Invalid input to " + name + ", Feature with geometry required");
51924                 }
51925                 if (!feature.geometry || feature.geometry.type !== type) {
51926                     throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51927                 }
51928             }
51929         }
51930         exports.collectionOf = collectionOf;
51931         /**
51932          * Get Geometry from Feature or Geometry Object
51933          *
51934          * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
51935          * @returns {Geometry|null} GeoJSON Geometry Object
51936          * @throws {Error} if geojson is not a Feature or Geometry Object
51937          * @example
51938          * var point = {
51939          *   "type": "Feature",
51940          *   "properties": {},
51941          *   "geometry": {
51942          *     "type": "Point",
51943          *     "coordinates": [110, 40]
51944          *   }
51945          * }
51946          * var geom = turf.getGeom(point)
51947          * //={"type": "Point", "coordinates": [110, 40]}
51948          */
51949         function getGeom(geojson) {
51950             if (geojson.type === "Feature") {
51951                 return geojson.geometry;
51952             }
51953             return geojson;
51954         }
51955         exports.getGeom = getGeom;
51956         /**
51957          * Get GeoJSON object's type, Geometry type is prioritize.
51958          *
51959          * @param {GeoJSON} geojson GeoJSON object
51960          * @param {string} [name="geojson"] name of the variable to display in error message
51961          * @returns {string} GeoJSON type
51962          * @example
51963          * var point = {
51964          *   "type": "Feature",
51965          *   "properties": {},
51966          *   "geometry": {
51967          *     "type": "Point",
51968          *     "coordinates": [110, 40]
51969          *   }
51970          * }
51971          * var geom = turf.getType(point)
51972          * //="Point"
51973          */
51974         function getType(geojson, name) {
51975             if (geojson.type === "FeatureCollection") {
51976                 return "FeatureCollection";
51977             }
51978             if (geojson.type === "GeometryCollection") {
51979                 return "GeometryCollection";
51980             }
51981             if (geojson.type === "Feature" && geojson.geometry !== null) {
51982                 return geojson.geometry.type;
51983             }
51984             return geojson.type;
51985         }
51986         exports.getType = getType;
51987         });
51988
51989         unwrapExports(invariant);
51990         var invariant_1 = invariant.getCoord;
51991         var invariant_2 = invariant.getCoords;
51992         var invariant_3 = invariant.containsNumber;
51993         var invariant_4 = invariant.geojsonType;
51994         var invariant_5 = invariant.featureOf;
51995         var invariant_6 = invariant.collectionOf;
51996         var invariant_7 = invariant.getGeom;
51997         var invariant_8 = invariant.getType;
51998
51999         var lineclip_1$1 = lineclip$1;
52000         var default_1$1 = lineclip$1;
52001
52002         lineclip$1.polyline = lineclip$1;
52003         lineclip$1.polygon = polygonclip$1;
52004
52005
52006         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
52007         // handle polylines rather than just segments
52008
52009         function lineclip$1(points, bbox, result) {
52010
52011             var len = points.length,
52012                 codeA = bitCode$1(points[0], bbox),
52013                 part = [],
52014                 i, a, b, codeB, lastCode;
52015
52016             if (!result) result = [];
52017
52018             for (i = 1; i < len; i++) {
52019                 a = points[i - 1];
52020                 b = points[i];
52021                 codeB = lastCode = bitCode$1(b, bbox);
52022
52023                 while (true) {
52024
52025                     if (!(codeA | codeB)) { // accept
52026                         part.push(a);
52027
52028                         if (codeB !== lastCode) { // segment went outside
52029                             part.push(b);
52030
52031                             if (i < len - 1) { // start a new line
52032                                 result.push(part);
52033                                 part = [];
52034                             }
52035                         } else if (i === len - 1) {
52036                             part.push(b);
52037                         }
52038                         break;
52039
52040                     } else if (codeA & codeB) { // trivial reject
52041                         break;
52042
52043                     } else if (codeA) { // a outside, intersect with clip edge
52044                         a = intersect$2(a, b, codeA, bbox);
52045                         codeA = bitCode$1(a, bbox);
52046
52047                     } else { // b outside
52048                         b = intersect$2(a, b, codeB, bbox);
52049                         codeB = bitCode$1(b, bbox);
52050                     }
52051                 }
52052
52053                 codeA = lastCode;
52054             }
52055
52056             if (part.length) result.push(part);
52057
52058             return result;
52059         }
52060
52061         // Sutherland-Hodgeman polygon clipping algorithm
52062
52063         function polygonclip$1(points, bbox) {
52064
52065             var result, edge, prev, prevInside, i, p, inside;
52066
52067             // clip against each side of the clip rectangle
52068             for (edge = 1; edge <= 8; edge *= 2) {
52069                 result = [];
52070                 prev = points[points.length - 1];
52071                 prevInside = !(bitCode$1(prev, bbox) & edge);
52072
52073                 for (i = 0; i < points.length; i++) {
52074                     p = points[i];
52075                     inside = !(bitCode$1(p, bbox) & edge);
52076
52077                     // if segment goes through the clip window, add an intersection
52078                     if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
52079
52080                     if (inside) result.push(p); // add a point if it's inside
52081
52082                     prev = p;
52083                     prevInside = inside;
52084                 }
52085
52086                 points = result;
52087
52088                 if (!points.length) break;
52089             }
52090
52091             return result;
52092         }
52093
52094         // intersect a segment against one of the 4 lines that make up the bbox
52095
52096         function intersect$2(a, b, edge, bbox) {
52097             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
52098                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
52099                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
52100                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
52101                    null;
52102         }
52103
52104         // bit code reflects the point position relative to the bbox:
52105
52106         //         left  mid  right
52107         //    top  1001  1000  1010
52108         //    mid  0001  0000  0010
52109         // bottom  0101  0100  0110
52110
52111         function bitCode$1(p, bbox) {
52112             var code = 0;
52113
52114             if (p[0] < bbox[0]) code |= 1; // left
52115             else if (p[0] > bbox[2]) code |= 2; // right
52116
52117             if (p[1] < bbox[1]) code |= 4; // bottom
52118             else if (p[1] > bbox[3]) code |= 8; // top
52119
52120             return code;
52121         }
52122         lineclip_1$1.default = default_1$1;
52123
52124         var bboxClip_1 = createCommonjsModule(function (module, exports) {
52125         var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
52126             if (mod && mod.__esModule) return mod;
52127             var result = {};
52128             if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
52129             result["default"] = mod;
52130             return result;
52131         };
52132         Object.defineProperty(exports, "__esModule", { value: true });
52133
52134
52135         var lineclip = __importStar(lineclip_1$1);
52136         /**
52137          * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
52138          * [lineclip](https://github.com/mapbox/lineclip).
52139          * May result in degenerate edges when clipping Polygons.
52140          *
52141          * @name bboxClip
52142          * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
52143          * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
52144          * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
52145          * @example
52146          * var bbox = [0, 0, 10, 10];
52147          * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
52148          *
52149          * var clipped = turf.bboxClip(poly, bbox);
52150          *
52151          * //addToMap
52152          * var addToMap = [bbox, poly, clipped]
52153          */
52154         function bboxClip(feature, bbox) {
52155             var geom = invariant.getGeom(feature);
52156             var type = geom.type;
52157             var properties = feature.type === "Feature" ? feature.properties : {};
52158             var coords = geom.coordinates;
52159             switch (type) {
52160                 case "LineString":
52161                 case "MultiLineString":
52162                     var lines_1 = [];
52163                     if (type === "LineString") {
52164                         coords = [coords];
52165                     }
52166                     coords.forEach(function (line) {
52167                         lineclip.polyline(line, bbox, lines_1);
52168                     });
52169                     if (lines_1.length === 1) {
52170                         return helpers.lineString(lines_1[0], properties);
52171                     }
52172                     return helpers.multiLineString(lines_1, properties);
52173                 case "Polygon":
52174                     return helpers.polygon(clipPolygon(coords, bbox), properties);
52175                 case "MultiPolygon":
52176                     return helpers.multiPolygon(coords.map(function (poly) {
52177                         return clipPolygon(poly, bbox);
52178                     }), properties);
52179                 default:
52180                     throw new Error("geometry " + type + " not supported");
52181             }
52182         }
52183         exports.default = bboxClip;
52184         function clipPolygon(rings, bbox) {
52185             var outRings = [];
52186             for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
52187                 var ring = rings_1[_i];
52188                 var clipped = lineclip.polygon(ring, bbox);
52189                 if (clipped.length > 0) {
52190                     if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
52191                         clipped.push(clipped[0]);
52192                     }
52193                     if (clipped.length >= 4) {
52194                         outRings.push(clipped);
52195                     }
52196                 }
52197             }
52198             return outRings;
52199         }
52200         });
52201
52202         var turf_bboxClip = unwrapExports(bboxClip_1);
52203
52204         var fastJsonStableStringify = function (data, opts) {
52205             if (!opts) opts = {};
52206             if (typeof opts === 'function') opts = { cmp: opts };
52207             var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
52208
52209             var cmp = opts.cmp && (function (f) {
52210                 return function (node) {
52211                     return function (a, b) {
52212                         var aobj = { key: a, value: node[a] };
52213                         var bobj = { key: b, value: node[b] };
52214                         return f(aobj, bobj);
52215                     };
52216                 };
52217             })(opts.cmp);
52218
52219             var seen = [];
52220             return (function stringify (node) {
52221                 if (node && node.toJSON && typeof node.toJSON === 'function') {
52222                     node = node.toJSON();
52223                 }
52224
52225                 if (node === undefined) return;
52226                 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
52227                 if (typeof node !== 'object') return JSON.stringify(node);
52228
52229                 var i, out;
52230                 if (Array.isArray(node)) {
52231                     out = '[';
52232                     for (i = 0; i < node.length; i++) {
52233                         if (i) out += ',';
52234                         out += stringify(node[i]) || 'null';
52235                     }
52236                     return out + ']';
52237                 }
52238
52239                 if (node === null) return 'null';
52240
52241                 if (seen.indexOf(node) !== -1) {
52242                     if (cycles) return JSON.stringify('__cycle__');
52243                     throw new TypeError('Converting circular structure to JSON');
52244                 }
52245
52246                 var seenIndex = seen.push(node) - 1;
52247                 var keys = Object.keys(node).sort(cmp && cmp(node));
52248                 out = '';
52249                 for (i = 0; i < keys.length; i++) {
52250                     var key = keys[i];
52251                     var value = stringify(node[key]);
52252
52253                     if (!value) continue;
52254                     if (out) out += ',';
52255                     out += JSON.stringify(key) + ':' + value;
52256                 }
52257                 seen.splice(seenIndex, 1);
52258                 return '{' + out + '}';
52259             })(data);
52260         };
52261
52262         var martinez_umd = createCommonjsModule(function (module, exports) {
52263         /**
52264          * martinez v0.5.0
52265          * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
52266          *
52267          * @author Alex Milevski <info@w8r.name>
52268          * @license MIT
52269          * @preserve
52270          */
52271
52272         (function (global, factory) {
52273           factory(exports);
52274         }(commonjsGlobal, (function (exports) {
52275           function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
52276
52277           var SplayTree = function SplayTree(compare, noDuplicates) {
52278             if ( compare === void 0 ) compare = DEFAULT_COMPARE;
52279             if ( noDuplicates === void 0 ) noDuplicates = false;
52280
52281             this._compare = compare;
52282             this._root = null;
52283             this._size = 0;
52284             this._noDuplicates = !!noDuplicates;
52285           };
52286
52287           var prototypeAccessors = { size: { configurable: true } };
52288
52289
52290           SplayTree.prototype.rotateLeft = function rotateLeft (x) {
52291             var y = x.right;
52292             if (y) {
52293               x.right = y.left;
52294               if (y.left) { y.left.parent = x; }
52295               y.parent = x.parent;
52296             }
52297
52298             if (!x.parent)              { this._root = y; }
52299             else if (x === x.parent.left) { x.parent.left = y; }
52300             else                        { x.parent.right = y; }
52301             if (y) { y.left = x; }
52302             x.parent = y;
52303           };
52304
52305
52306           SplayTree.prototype.rotateRight = function rotateRight (x) {
52307             var y = x.left;
52308             if (y) {
52309               x.left = y.right;
52310               if (y.right) { y.right.parent = x; }
52311               y.parent = x.parent;
52312             }
52313
52314             if (!x.parent)             { this._root = y; }
52315             else if(x === x.parent.left) { x.parent.left = y; }
52316             else                       { x.parent.right = y; }
52317             if (y) { y.right = x; }
52318             x.parent = y;
52319           };
52320
52321
52322           SplayTree.prototype._splay = function _splay (x) {
52323               var this$1 = this;
52324
52325             while (x.parent) {
52326               var p = x.parent;
52327               if (!p.parent) {
52328                 if (p.left === x) { this$1.rotateRight(p); }
52329                 else            { this$1.rotateLeft(p); }
52330               } else if (p.left === x && p.parent.left === p) {
52331                 this$1.rotateRight(p.parent);
52332                 this$1.rotateRight(p);
52333               } else if (p.right === x && p.parent.right === p) {
52334                 this$1.rotateLeft(p.parent);
52335                 this$1.rotateLeft(p);
52336               } else if (p.left === x && p.parent.right === p) {
52337                 this$1.rotateRight(p);
52338                 this$1.rotateLeft(p);
52339               } else {
52340                 this$1.rotateLeft(p);
52341                 this$1.rotateRight(p);
52342               }
52343             }
52344           };
52345
52346
52347           SplayTree.prototype.splay = function splay (x) {
52348               var this$1 = this;
52349
52350             var p, gp, ggp, l, r;
52351
52352             while (x.parent) {
52353               p = x.parent;
52354               gp = p.parent;
52355
52356               if (gp && gp.parent) {
52357                 ggp = gp.parent;
52358                 if (ggp.left === gp) { ggp.left= x; }
52359                 else               { ggp.right = x; }
52360                 x.parent = ggp;
52361               } else {
52362                 x.parent = null;
52363                 this$1._root = x;
52364               }
52365
52366               l = x.left; r = x.right;
52367
52368               if (x === p.left) { // left
52369                 if (gp) {
52370                   if (gp.left === p) {
52371                     /* zig-zig */
52372                     if (p.right) {
52373                       gp.left = p.right;
52374                       gp.left.parent = gp;
52375                     } else { gp.left = null; }
52376
52377                     p.right = gp;
52378                     gp.parent = p;
52379                   } else {
52380                     /* zig-zag */
52381                     if (l) {
52382                       gp.right = l;
52383                       l.parent = gp;
52384                     } else { gp.right = null; }
52385
52386                     x.left  = gp;
52387                     gp.parent = x;
52388                   }
52389                 }
52390                 if (r) {
52391                   p.left = r;
52392                   r.parent = p;
52393                 } else { p.left = null; }
52394
52395                 x.right= p;
52396                 p.parent = x;
52397               } else { // right
52398                 if (gp) {
52399                   if (gp.right === p) {
52400                     /* zig-zig */
52401                     if (p.left) {
52402                       gp.right = p.left;
52403                       gp.right.parent = gp;
52404                     } else { gp.right = null; }
52405
52406                     p.left = gp;
52407                     gp.parent = p;
52408                   } else {
52409                     /* zig-zag */
52410                     if (r) {
52411                       gp.left = r;
52412                       r.parent = gp;
52413                     } else { gp.left = null; }
52414
52415                     x.right = gp;
52416                     gp.parent = x;
52417                   }
52418                 }
52419                 if (l) {
52420                   p.right = l;
52421                   l.parent = p;
52422                 } else { p.right = null; }
52423
52424                 x.left = p;
52425                 p.parent = x;
52426               }
52427             }
52428           };
52429
52430
52431           SplayTree.prototype.replace = function replace (u, v) {
52432             if (!u.parent) { this._root = v; }
52433             else if (u === u.parent.left) { u.parent.left = v; }
52434             else { u.parent.right = v; }
52435             if (v) { v.parent = u.parent; }
52436           };
52437
52438
52439           SplayTree.prototype.minNode = function minNode (u) {
52440               if ( u === void 0 ) u = this._root;
52441
52442             if (u) { while (u.left) { u = u.left; } }
52443             return u;
52444           };
52445
52446
52447           SplayTree.prototype.maxNode = function maxNode (u) {
52448               if ( u === void 0 ) u = this._root;
52449
52450             if (u) { while (u.right) { u = u.right; } }
52451             return u;
52452           };
52453
52454
52455           SplayTree.prototype.insert = function insert (key, data) {
52456             var z = this._root;
52457             var p = null;
52458             var comp = this._compare;
52459             var cmp;
52460
52461             if (this._noDuplicates) {
52462               while (z) {
52463                 p = z;
52464                 cmp = comp(z.key, key);
52465                 if (cmp === 0) { return; }
52466                 else if (comp(z.key, key) < 0) { z = z.right; }
52467                 else { z = z.left; }
52468               }
52469             } else {
52470               while (z) {
52471                 p = z;
52472                 if (comp(z.key, key) < 0) { z = z.right; }
52473                 else { z = z.left; }
52474               }
52475             }
52476
52477             z = { key: key, data: data, left: null, right: null, parent: p };
52478
52479             if (!p)                        { this._root = z; }
52480             else if (comp(p.key, z.key) < 0) { p.right = z; }
52481             else                           { p.left= z; }
52482
52483             this.splay(z);
52484             this._size++;
52485             return z;
52486           };
52487
52488
52489           SplayTree.prototype.find = function find (key) {
52490             var z  = this._root;
52491             var comp = this._compare;
52492             while (z) {
52493               var cmp = comp(z.key, key);
52494               if    (cmp < 0) { z = z.right; }
52495               else if (cmp > 0) { z = z.left; }
52496               else            { return z; }
52497             }
52498             return null;
52499           };
52500
52501           /**
52502            * Whether the tree contains a node with the given key
52503            * @param{Key} key
52504            * @return {boolean} true/false
52505            */
52506           SplayTree.prototype.contains = function contains (key) {
52507             var node     = this._root;
52508             var comparator = this._compare;
52509             while (node){
52510               var cmp = comparator(key, node.key);
52511               if    (cmp === 0) { return true; }
52512               else if (cmp < 0) { node = node.left; }
52513               else              { node = node.right; }
52514             }
52515
52516             return false;
52517           };
52518
52519
52520           SplayTree.prototype.remove = function remove (key) {
52521             var z = this.find(key);
52522
52523             if (!z) { return false; }
52524
52525             this.splay(z);
52526
52527             if (!z.left) { this.replace(z, z.right); }
52528             else if (!z.right) { this.replace(z, z.left); }
52529             else {
52530               var y = this.minNode(z.right);
52531               if (y.parent !== z) {
52532                 this.replace(y, y.right);
52533                 y.right = z.right;
52534                 y.right.parent = y;
52535               }
52536               this.replace(z, y);
52537               y.left = z.left;
52538               y.left.parent = y;
52539             }
52540
52541             this._size--;
52542             return true;
52543           };
52544
52545
52546           SplayTree.prototype.removeNode = function removeNode (z) {
52547             if (!z) { return false; }
52548
52549             this.splay(z);
52550
52551             if (!z.left) { this.replace(z, z.right); }
52552             else if (!z.right) { this.replace(z, z.left); }
52553             else {
52554               var y = this.minNode(z.right);
52555               if (y.parent !== z) {
52556                 this.replace(y, y.right);
52557                 y.right = z.right;
52558                 y.right.parent = y;
52559               }
52560               this.replace(z, y);
52561               y.left = z.left;
52562               y.left.parent = y;
52563             }
52564
52565             this._size--;
52566             return true;
52567           };
52568
52569
52570           SplayTree.prototype.erase = function erase (key) {
52571             var z = this.find(key);
52572             if (!z) { return; }
52573
52574             this.splay(z);
52575
52576             var s = z.left;
52577             var t = z.right;
52578
52579             var sMax = null;
52580             if (s) {
52581               s.parent = null;
52582               sMax = this.maxNode(s);
52583               this.splay(sMax);
52584               this._root = sMax;
52585             }
52586             if (t) {
52587               if (s) { sMax.right = t; }
52588               else { this._root = t; }
52589               t.parent = sMax;
52590             }
52591
52592             this._size--;
52593           };
52594
52595           /**
52596            * Removes and returns the node with smallest key
52597            * @return {?Node}
52598            */
52599           SplayTree.prototype.pop = function pop () {
52600             var node = this._root, returnValue = null;
52601             if (node) {
52602               while (node.left) { node = node.left; }
52603               returnValue = { key: node.key, data: node.data };
52604               this.remove(node.key);
52605             }
52606             return returnValue;
52607           };
52608
52609
52610           /* eslint-disable class-methods-use-this */
52611
52612           /**
52613            * Successor node
52614            * @param{Node} node
52615            * @return {?Node}
52616            */
52617           SplayTree.prototype.next = function next (node) {
52618             var successor = node;
52619             if (successor) {
52620               if (successor.right) {
52621                 successor = successor.right;
52622                 while (successor && successor.left) { successor = successor.left; }
52623               } else {
52624                 successor = node.parent;
52625                 while (successor && successor.right === node) {
52626                   node = successor; successor = successor.parent;
52627                 }
52628               }
52629             }
52630             return successor;
52631           };
52632
52633
52634           /**
52635            * Predecessor node
52636            * @param{Node} node
52637            * @return {?Node}
52638            */
52639           SplayTree.prototype.prev = function prev (node) {
52640             var predecessor = node;
52641             if (predecessor) {
52642               if (predecessor.left) {
52643                 predecessor = predecessor.left;
52644                 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
52645               } else {
52646                 predecessor = node.parent;
52647                 while (predecessor && predecessor.left === node) {
52648                   node = predecessor;
52649                   predecessor = predecessor.parent;
52650                 }
52651               }
52652             }
52653             return predecessor;
52654           };
52655           /* eslint-enable class-methods-use-this */
52656
52657
52658           /**
52659            * @param{forEachCallback} callback
52660            * @return {SplayTree}
52661            */
52662           SplayTree.prototype.forEach = function forEach (callback) {
52663             var current = this._root;
52664             var s = [], done = false, i = 0;
52665
52666             while (!done) {
52667               // Reach the left most Node of the current Node
52668               if (current) {
52669                 // Place pointer to a tree node on the stack
52670                 // before traversing the node's left subtree
52671                 s.push(current);
52672                 current = current.left;
52673               } else {
52674                 // BackTrack from the empty subtree and visit the Node
52675                 // at the top of the stack; however, if the stack is
52676                 // empty you are done
52677                 if (s.length > 0) {
52678                   current = s.pop();
52679                   callback(current, i++);
52680
52681                   // We have visited the node and its left
52682                   // subtree. Now, it's right subtree's turn
52683                   current = current.right;
52684                 } else { done = true; }
52685               }
52686             }
52687             return this;
52688           };
52689
52690
52691           /**
52692            * Walk key range from `low` to `high`. Stops if `fn` returns a value.
52693            * @param{Key}    low
52694            * @param{Key}    high
52695            * @param{Function} fn
52696            * @param{*?}     ctx
52697            * @return {SplayTree}
52698            */
52699           SplayTree.prototype.range = function range (low, high, fn, ctx) {
52700               var this$1 = this;
52701
52702             var Q = [];
52703             var compare = this._compare;
52704             var node = this._root, cmp;
52705
52706             while (Q.length !== 0 || node) {
52707               if (node) {
52708                 Q.push(node);
52709                 node = node.left;
52710               } else {
52711                 node = Q.pop();
52712                 cmp = compare(node.key, high);
52713                 if (cmp > 0) {
52714                   break;
52715                 } else if (compare(node.key, low) >= 0) {
52716                   if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
52717                 }
52718                 node = node.right;
52719               }
52720             }
52721             return this;
52722           };
52723
52724           /**
52725            * Returns all keys in order
52726            * @return {Array<Key>}
52727            */
52728           SplayTree.prototype.keys = function keys () {
52729             var current = this._root;
52730             var s = [], r = [], done = false;
52731
52732             while (!done) {
52733               if (current) {
52734                 s.push(current);
52735                 current = current.left;
52736               } else {
52737                 if (s.length > 0) {
52738                   current = s.pop();
52739                   r.push(current.key);
52740                   current = current.right;
52741                 } else { done = true; }
52742               }
52743             }
52744             return r;
52745           };
52746
52747
52748           /**
52749            * Returns `data` fields of all nodes in order.
52750            * @return {Array<Value>}
52751            */
52752           SplayTree.prototype.values = function values () {
52753             var current = this._root;
52754             var s = [], r = [], done = false;
52755
52756             while (!done) {
52757               if (current) {
52758                 s.push(current);
52759                 current = current.left;
52760               } else {
52761                 if (s.length > 0) {
52762                   current = s.pop();
52763                   r.push(current.data);
52764                   current = current.right;
52765                 } else { done = true; }
52766               }
52767             }
52768             return r;
52769           };
52770
52771
52772           /**
52773            * Returns node at given index
52774            * @param{number} index
52775            * @return {?Node}
52776            */
52777           SplayTree.prototype.at = function at (index) {
52778             // removed after a consideration, more misleading than useful
52779             // index = index % this.size;
52780             // if (index < 0) index = this.size - index;
52781
52782             var current = this._root;
52783             var s = [], done = false, i = 0;
52784
52785             while (!done) {
52786               if (current) {
52787                 s.push(current);
52788                 current = current.left;
52789               } else {
52790                 if (s.length > 0) {
52791                   current = s.pop();
52792                   if (i === index) { return current; }
52793                   i++;
52794                   current = current.right;
52795                 } else { done = true; }
52796               }
52797             }
52798             return null;
52799           };
52800
52801           /**
52802            * Bulk-load items. Both array have to be same size
52803            * @param{Array<Key>}  keys
52804            * @param{Array<Value>}[values]
52805            * @param{Boolean}     [presort=false] Pre-sort keys and values, using
52806            *                                       tree's comparator. Sorting is done
52807            *                                       in-place
52808            * @return {AVLTree}
52809            */
52810           SplayTree.prototype.load = function load (keys, values, presort) {
52811               if ( keys === void 0 ) keys = [];
52812               if ( values === void 0 ) values = [];
52813               if ( presort === void 0 ) presort = false;
52814
52815             if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
52816             var size = keys.length;
52817             if (presort) { sort(keys, values, 0, size - 1, this._compare); }
52818             this._root = loadRecursive(null, keys, values, 0, size);
52819             this._size = size;
52820             return this;
52821           };
52822
52823
52824           SplayTree.prototype.min = function min () {
52825             var node = this.minNode(this._root);
52826             if (node) { return node.key; }
52827             else    { return null; }
52828           };
52829
52830
52831           SplayTree.prototype.max = function max () {
52832             var node = this.maxNode(this._root);
52833             if (node) { return node.key; }
52834             else    { return null; }
52835           };
52836
52837           SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
52838           prototypeAccessors.size.get = function () { return this._size; };
52839
52840
52841           /**
52842            * Create a tree and load it with items
52843            * @param{Array<Key>}        keys
52844            * @param{Array<Value>?}      [values]
52845
52846            * @param{Function?}          [comparator]
52847            * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
52848            *                                             tree's comparator. Sorting is done
52849            *                                             in-place
52850            * @param{Boolean?}           [noDuplicates=false] Allow duplicates
52851            * @return {SplayTree}
52852            */
52853           SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
52854             return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
52855           };
52856
52857           Object.defineProperties( SplayTree.prototype, prototypeAccessors );
52858
52859
52860           function loadRecursive (parent, keys, values, start, end) {
52861             var size = end - start;
52862             if (size > 0) {
52863               var middle = start + Math.floor(size / 2);
52864               var key    = keys[middle];
52865               var data   = values[middle];
52866               var node   = { key: key, data: data, parent: parent };
52867               node.left    = loadRecursive(node, keys, values, start, middle);
52868               node.right   = loadRecursive(node, keys, values, middle + 1, end);
52869               return node;
52870             }
52871             return null;
52872           }
52873
52874
52875           function sort(keys, values, left, right, compare) {
52876             if (left >= right) { return; }
52877
52878             var pivot = keys[(left + right) >> 1];
52879             var i = left - 1;
52880             var j = right + 1;
52881
52882             while (true) {
52883               do { i++; } while (compare(keys[i], pivot) < 0);
52884               do { j--; } while (compare(keys[j], pivot) > 0);
52885               if (i >= j) { break; }
52886
52887               var tmp = keys[i];
52888               keys[i] = keys[j];
52889               keys[j] = tmp;
52890
52891               tmp = values[i];
52892               values[i] = values[j];
52893               values[j] = tmp;
52894             }
52895
52896             sort(keys, values,  left,     j, compare);
52897             sort(keys, values, j + 1, right, compare);
52898           }
52899
52900           var NORMAL               = 0;
52901           var NON_CONTRIBUTING     = 1;
52902           var SAME_TRANSITION      = 2;
52903           var DIFFERENT_TRANSITION = 3;
52904
52905           var INTERSECTION = 0;
52906           var UNION        = 1;
52907           var DIFFERENCE   = 2;
52908           var XOR          = 3;
52909
52910           /**
52911            * @param  {SweepEvent} event
52912            * @param  {SweepEvent} prev
52913            * @param  {Operation} operation
52914            */
52915           function computeFields (event, prev, operation) {
52916             // compute inOut and otherInOut fields
52917             if (prev === null) {
52918               event.inOut      = false;
52919               event.otherInOut = true;
52920
52921             // previous line segment in sweepline belongs to the same polygon
52922             } else {
52923               if (event.isSubject === prev.isSubject) {
52924                 event.inOut      = !prev.inOut;
52925                 event.otherInOut = prev.otherInOut;
52926
52927               // previous line segment in sweepline belongs to the clipping polygon
52928               } else {
52929                 event.inOut      = !prev.otherInOut;
52930                 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
52931               }
52932
52933               // compute prevInResult field
52934               if (prev) {
52935                 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
52936                   ? prev.prevInResult : prev;
52937               }
52938             }
52939
52940             // check if the line segment belongs to the Boolean operation
52941             event.inResult = inResult(event, operation);
52942           }
52943
52944
52945           /* eslint-disable indent */
52946           function inResult(event, operation) {
52947             switch (event.type) {
52948               case NORMAL:
52949                 switch (operation) {
52950                   case INTERSECTION:
52951                     return !event.otherInOut;
52952                   case UNION:
52953                     return event.otherInOut;
52954                   case DIFFERENCE:
52955                     // return (event.isSubject && !event.otherInOut) ||
52956                     //         (!event.isSubject && event.otherInOut);
52957                     return (event.isSubject && event.otherInOut) ||
52958                             (!event.isSubject && !event.otherInOut);
52959                   case XOR:
52960                     return true;
52961                 }
52962                 break;
52963               case SAME_TRANSITION:
52964                 return operation === INTERSECTION || operation === UNION;
52965               case DIFFERENT_TRANSITION:
52966                 return operation === DIFFERENCE;
52967               case NON_CONTRIBUTING:
52968                 return false;
52969             }
52970             return false;
52971           }
52972           /* eslint-enable indent */
52973
52974           var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
52975
52976             /**
52977              * Is left endpoint?
52978              * @type {Boolean}
52979              */
52980             this.left = left;
52981
52982             /**
52983              * @type {Array.<Number>}
52984              */
52985             this.point = point;
52986
52987             /**
52988              * Other edge reference
52989              * @type {SweepEvent}
52990              */
52991             this.otherEvent = otherEvent;
52992
52993             /**
52994              * Belongs to source or clipping polygon
52995              * @type {Boolean}
52996              */
52997             this.isSubject = isSubject;
52998
52999             /**
53000              * Edge contribution type
53001              * @type {Number}
53002              */
53003             this.type = edgeType || NORMAL;
53004
53005
53006             /**
53007              * In-out transition for the sweepline crossing polygon
53008              * @type {Boolean}
53009              */
53010             this.inOut = false;
53011
53012
53013             /**
53014              * @type {Boolean}
53015              */
53016             this.otherInOut = false;
53017
53018             /**
53019              * Previous event in result?
53020              * @type {SweepEvent}
53021              */
53022             this.prevInResult = null;
53023
53024             /**
53025              * Does event belong to result?
53026              * @type {Boolean}
53027              */
53028             this.inResult = false;
53029
53030
53031             // connection step
53032
53033             /**
53034              * @type {Boolean}
53035              */
53036             this.resultInOut = false;
53037
53038             this.isExteriorRing = true;
53039           };
53040
53041
53042           /**
53043            * @param{Array.<Number>}p
53044            * @return {Boolean}
53045            */
53046           SweepEvent.prototype.isBelow = function isBelow (p) {
53047             var p0 = this.point, p1 = this.otherEvent.point;
53048             return this.left
53049               ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
53050               // signedArea(this.point, this.otherEvent.point, p) > 0 :
53051               : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
53052               //signedArea(this.otherEvent.point, this.point, p) > 0;
53053           };
53054
53055
53056           /**
53057            * @param{Array.<Number>}p
53058            * @return {Boolean}
53059            */
53060           SweepEvent.prototype.isAbove = function isAbove (p) {
53061             return !this.isBelow(p);
53062           };
53063
53064
53065           /**
53066            * @return {Boolean}
53067            */
53068           SweepEvent.prototype.isVertical = function isVertical () {
53069             return this.point[0] === this.otherEvent.point[0];
53070           };
53071
53072
53073           SweepEvent.prototype.clone = function clone () {
53074             var copy = new SweepEvent(
53075               this.point, this.left, this.otherEvent, this.isSubject, this.type);
53076
53077             copy.inResult     = this.inResult;
53078             copy.prevInResult = this.prevInResult;
53079             copy.isExteriorRing = this.isExteriorRing;
53080             copy.inOut        = this.inOut;
53081             copy.otherInOut   = this.otherInOut;
53082
53083             return copy;
53084           };
53085
53086           function equals(p1, p2) {
53087             if (p1[0] === p2[0]) {
53088               if (p1[1] === p2[1]) {
53089                 return true;
53090               } else {
53091                 return false;
53092               }
53093             }
53094             return false;
53095           }
53096
53097           // const EPSILON = 1e-9;
53098           // const abs = Math.abs;
53099           // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
53100           // Precision problem.
53101           //
53102           // module.exports = function equals(p1, p2) {
53103           //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
53104           // };
53105
53106           /**
53107            * Signed area of the triangle (p0, p1, p2)
53108            * @param  {Array.<Number>} p0
53109            * @param  {Array.<Number>} p1
53110            * @param  {Array.<Number>} p2
53111            * @return {Number}
53112            */
53113           function signedArea(p0, p1, p2) {
53114             return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
53115           }
53116
53117           /**
53118            * @param  {SweepEvent} e1
53119            * @param  {SweepEvent} e2
53120            * @return {Number}
53121            */
53122           function compareEvents(e1, e2) {
53123             var p1 = e1.point;
53124             var p2 = e2.point;
53125
53126             // Different x-coordinate
53127             if (p1[0] > p2[0]) { return 1; }
53128             if (p1[0] < p2[0]) { return -1; }
53129
53130             // Different points, but same x-coordinate
53131             // Event with lower y-coordinate is processed first
53132             if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
53133
53134             return specialCases(e1, e2, p1);
53135           }
53136
53137
53138           /* eslint-disable no-unused-vars */
53139           function specialCases(e1, e2, p1, p2) {
53140             // Same coordinates, but one is a left endpoint and the other is
53141             // a right endpoint. The right endpoint is processed first
53142             if (e1.left !== e2.left)
53143               { return e1.left ? 1 : -1; }
53144
53145             // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
53146             // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
53147             // Same coordinates, both events
53148             // are left endpoints or right endpoints.
53149             // not collinear
53150             if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
53151               // the event associate to the bottom segment is processed first
53152               return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
53153             }
53154
53155             return (!e1.isSubject && e2.isSubject) ? 1 : -1;
53156           }
53157           /* eslint-enable no-unused-vars */
53158
53159           /**
53160            * @param  {SweepEvent} se
53161            * @param  {Array.<Number>} p
53162            * @param  {Queue} queue
53163            * @return {Queue}
53164            */
53165           function divideSegment(se, p, queue)  {
53166             var r = new SweepEvent(p, false, se,            se.isSubject);
53167             var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
53168
53169             /* eslint-disable no-console */
53170             if (equals(se.point, se.otherEvent.point)) {
53171
53172               console.warn('what is that, a collapsed segment?', se);
53173             }
53174             /* eslint-enable no-console */
53175
53176             r.contourId = l.contourId = se.contourId;
53177
53178             // avoid a rounding error. The left event would be processed after the right event
53179             if (compareEvents(l, se.otherEvent) > 0) {
53180               se.otherEvent.left = true;
53181               l.left = false;
53182             }
53183
53184             // avoid a rounding error. The left event would be processed after the right event
53185             // if (compareEvents(se, r) > 0) {}
53186
53187             se.otherEvent.otherEvent = l;
53188             se.otherEvent = r;
53189
53190             queue.push(l);
53191             queue.push(r);
53192
53193             return queue;
53194           }
53195
53196           //const EPS = 1e-9;
53197
53198           /**
53199            * Finds the magnitude of the cross product of two vectors (if we pretend
53200            * they're in three dimensions)
53201            *
53202            * @param {Object} a First vector
53203            * @param {Object} b Second vector
53204            * @private
53205            * @returns {Number} The magnitude of the cross product
53206            */
53207           function crossProduct(a, b) {
53208             return (a[0] * b[1]) - (a[1] * b[0]);
53209           }
53210
53211           /**
53212            * Finds the dot product of two vectors.
53213            *
53214            * @param {Object} a First vector
53215            * @param {Object} b Second vector
53216            * @private
53217            * @returns {Number} The dot product
53218            */
53219           function dotProduct(a, b) {
53220             return (a[0] * b[0]) + (a[1] * b[1]);
53221           }
53222
53223           /**
53224            * Finds the intersection (if any) between two line segments a and b, given the
53225            * line segments' end points a1, a2 and b1, b2.
53226            *
53227            * This algorithm is based on Schneider and Eberly.
53228            * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
53229            * Page 244.
53230            *
53231            * @param {Array.<Number>} a1 point of first line
53232            * @param {Array.<Number>} a2 point of first line
53233            * @param {Array.<Number>} b1 point of second line
53234            * @param {Array.<Number>} b2 point of second line
53235            * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
53236            *                                         (meaning connected segments) as
53237            *                                         intersections
53238            * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
53239            * intersection. If they overlap, the two end points of the overlapping segment.
53240            * Otherwise, null.
53241            */
53242           function intersection (a1, a2, b1, b2, noEndpointTouch) {
53243             // The algorithm expects our lines in the form P + sd, where P is a point,
53244             // s is on the interval [0, 1], and d is a vector.
53245             // We are passed two points. P can be the first point of each pair. The
53246             // vector, then, could be thought of as the distance (in x and y components)
53247             // from the first point to the second point.
53248             // So first, let's make our vectors:
53249             var va = [a2[0] - a1[0], a2[1] - a1[1]];
53250             var vb = [b2[0] - b1[0], b2[1] - b1[1]];
53251             // We also define a function to convert back to regular point form:
53252
53253             /* eslint-disable arrow-body-style */
53254
53255             function toPoint(p, s, d) {
53256               return [
53257                 p[0] + s * d[0],
53258                 p[1] + s * d[1]
53259               ];
53260             }
53261
53262             /* eslint-enable arrow-body-style */
53263
53264             // The rest is pretty much a straight port of the algorithm.
53265             var e = [b1[0] - a1[0], b1[1] - a1[1]];
53266             var kross    = crossProduct(va, vb);
53267             var sqrKross = kross * kross;
53268             var sqrLenA  = dotProduct(va, va);
53269             //const sqrLenB  = dotProduct(vb, vb);
53270
53271             // Check for line intersection. This works because of the properties of the
53272             // cross product -- specifically, two vectors are parallel if and only if the
53273             // cross product is the 0 vector. The full calculation involves relative error
53274             // to account for possible very small line segments. See Schneider & Eberly
53275             // for details.
53276             if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
53277               // If they're not parallel, then (because these are line segments) they
53278               // still might not actually intersect. This code checks that the
53279               // intersection point of the lines is actually on both line segments.
53280               var s = crossProduct(e, vb) / kross;
53281               if (s < 0 || s > 1) {
53282                 // not on line segment a
53283                 return null;
53284               }
53285               var t = crossProduct(e, va) / kross;
53286               if (t < 0 || t > 1) {
53287                 // not on line segment b
53288                 return null;
53289               }
53290               if (s === 0 || s === 1) {
53291                 // on an endpoint of line segment a
53292                 return noEndpointTouch ? null : [toPoint(a1, s, va)];
53293               }
53294               if (t === 0 || t === 1) {
53295                 // on an endpoint of line segment b
53296                 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
53297               }
53298               return [toPoint(a1, s, va)];
53299             }
53300
53301             // If we've reached this point, then the lines are either parallel or the
53302             // same, but the segments could overlap partially or fully, or not at all.
53303             // So we need to find the overlap, if any. To do that, we can use e, which is
53304             // the (vector) difference between the two initial points. If this is parallel
53305             // with the line itself, then the two lines are the same line, and there will
53306             // be overlap.
53307             //const sqrLenE = dotProduct(e, e);
53308             kross = crossProduct(e, va);
53309             sqrKross = kross * kross;
53310
53311             if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
53312             // Lines are just parallel, not the same. No overlap.
53313               return null;
53314             }
53315
53316             var sa = dotProduct(va, e) / sqrLenA;
53317             var sb = sa + dotProduct(va, vb) / sqrLenA;
53318             var smin = Math.min(sa, sb);
53319             var smax = Math.max(sa, sb);
53320
53321             // this is, essentially, the FindIntersection acting on floats from
53322             // Schneider & Eberly, just inlined into this function.
53323             if (smin <= 1 && smax >= 0) {
53324
53325               // overlap on an end point
53326               if (smin === 1) {
53327                 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
53328               }
53329
53330               if (smax === 0) {
53331                 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
53332               }
53333
53334               if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
53335
53336               // There's overlap on a segment -- two points of intersection. Return both.
53337               return [
53338                 toPoint(a1, smin > 0 ? smin : 0, va),
53339                 toPoint(a1, smax < 1 ? smax : 1, va)
53340               ];
53341             }
53342
53343             return null;
53344           }
53345
53346           /**
53347            * @param  {SweepEvent} se1
53348            * @param  {SweepEvent} se2
53349            * @param  {Queue}      queue
53350            * @return {Number}
53351            */
53352           function possibleIntersection (se1, se2, queue) {
53353             // that disallows self-intersecting polygons,
53354             // did cost us half a day, so I'll leave it
53355             // out of respect
53356             // if (se1.isSubject === se2.isSubject) return;
53357             var inter = intersection(
53358               se1.point, se1.otherEvent.point,
53359               se2.point, se2.otherEvent.point
53360             );
53361
53362             var nintersections = inter ? inter.length : 0;
53363             if (nintersections === 0) { return 0; } // no intersection
53364
53365             // the line segments intersect at an endpoint of both line segments
53366             if ((nintersections === 1) &&
53367                 (equals(se1.point, se2.point) ||
53368                  equals(se1.otherEvent.point, se2.otherEvent.point))) {
53369               return 0;
53370             }
53371
53372             if (nintersections === 2 && se1.isSubject === se2.isSubject) {
53373               // if(se1.contourId === se2.contourId){
53374               // console.warn('Edges of the same polygon overlap',
53375               //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
53376               // }
53377               //throw new Error('Edges of the same polygon overlap');
53378               return 0;
53379             }
53380
53381             // The line segments associated to se1 and se2 intersect
53382             if (nintersections === 1) {
53383
53384               // if the intersection point is not an endpoint of se1
53385               if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
53386                 divideSegment(se1, inter[0], queue);
53387               }
53388
53389               // if the intersection point is not an endpoint of se2
53390               if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
53391                 divideSegment(se2, inter[0], queue);
53392               }
53393               return 1;
53394             }
53395
53396             // The line segments associated to se1 and se2 overlap
53397             var events        = [];
53398             var leftCoincide  = false;
53399             var rightCoincide = false;
53400
53401             if (equals(se1.point, se2.point)) {
53402               leftCoincide = true; // linked
53403             } else if (compareEvents(se1, se2) === 1) {
53404               events.push(se2, se1);
53405             } else {
53406               events.push(se1, se2);
53407             }
53408
53409             if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
53410               rightCoincide = true;
53411             } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
53412               events.push(se2.otherEvent, se1.otherEvent);
53413             } else {
53414               events.push(se1.otherEvent, se2.otherEvent);
53415             }
53416
53417             if ((leftCoincide && rightCoincide) || leftCoincide) {
53418               // both line segments are equal or share the left endpoint
53419               se2.type = NON_CONTRIBUTING;
53420               se1.type = (se2.inOut === se1.inOut)
53421                 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
53422
53423               if (leftCoincide && !rightCoincide) {
53424                 // honestly no idea, but changing events selection from [2, 1]
53425                 // to [0, 1] fixes the overlapping self-intersecting polygons issue
53426                 divideSegment(events[1].otherEvent, events[0].point, queue);
53427               }
53428               return 2;
53429             }
53430
53431             // the line segments share the right endpoint
53432             if (rightCoincide) {
53433               divideSegment(events[0], events[1].point, queue);
53434               return 3;
53435             }
53436
53437             // no line segment includes totally the other one
53438             if (events[0] !== events[3].otherEvent) {
53439               divideSegment(events[0], events[1].point, queue);
53440               divideSegment(events[1], events[2].point, queue);
53441               return 3;
53442             }
53443
53444             // one line segment includes the other one
53445             divideSegment(events[0], events[1].point, queue);
53446             divideSegment(events[3].otherEvent, events[2].point, queue);
53447
53448             return 3;
53449           }
53450
53451           /**
53452            * @param  {SweepEvent} le1
53453            * @param  {SweepEvent} le2
53454            * @return {Number}
53455            */
53456           function compareSegments(le1, le2) {
53457             if (le1 === le2) { return 0; }
53458
53459             // Segments are not collinear
53460             if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
53461               signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
53462
53463               // If they share their left endpoint use the right endpoint to sort
53464               if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
53465
53466               // Different left endpoint: use the left endpoint to sort
53467               if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
53468
53469               // has the line segment associated to e1 been inserted
53470               // into S after the line segment associated to e2 ?
53471               if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
53472
53473               // The line segment associated to e2 has been inserted
53474               // into S after the line segment associated to e1
53475               return le1.isBelow(le2.point) ? -1 : 1;
53476             }
53477
53478             if (le1.isSubject === le2.isSubject) { // same polygon
53479               var p1 = le1.point, p2 = le2.point;
53480               if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
53481                 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
53482                 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
53483                 else { return le1.contourId > le2.contourId ? 1 : -1; }
53484               }
53485             } else { // Segments are collinear, but belong to separate polygons
53486               return le1.isSubject ? -1 : 1;
53487             }
53488
53489             return compareEvents(le1, le2) === 1 ? 1 : -1;
53490           }
53491
53492           function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
53493             var sweepLine = new SplayTree(compareSegments);
53494             var sortedEvents = [];
53495
53496             var rightbound = Math.min(sbbox[2], cbbox[2]);
53497
53498             var prev, next, begin;
53499
53500             while (eventQueue.length !== 0) {
53501               var event = eventQueue.pop();
53502               sortedEvents.push(event);
53503
53504               // optimization by bboxes for intersection and difference goes here
53505               if ((operation === INTERSECTION && event.point[0] > rightbound) ||
53506                   (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
53507                 break;
53508               }
53509
53510               if (event.left) {
53511                 next  = prev = sweepLine.insert(event);
53512                 begin = sweepLine.minNode();
53513
53514                 if (prev !== begin) { prev = sweepLine.prev(prev); }
53515                 else                { prev = null; }
53516
53517                 next = sweepLine.next(next);
53518
53519                 var prevEvent = prev ? prev.key : null;
53520                 var prevprevEvent = (void 0);
53521                 computeFields(event, prevEvent, operation);
53522                 if (next) {
53523                   if (possibleIntersection(event, next.key, eventQueue) === 2) {
53524                     computeFields(event, prevEvent, operation);
53525                     computeFields(event, next.key, operation);
53526                   }
53527                 }
53528
53529                 if (prev) {
53530                   if (possibleIntersection(prev.key, event, eventQueue) === 2) {
53531                     var prevprev = prev;
53532                     if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
53533                     else                    { prevprev = null; }
53534
53535                     prevprevEvent = prevprev ? prevprev.key : null;
53536                     computeFields(prevEvent, prevprevEvent, operation);
53537                     computeFields(event,     prevEvent,     operation);
53538                   }
53539                 }
53540               } else {
53541                 event = event.otherEvent;
53542                 next = prev = sweepLine.find(event);
53543
53544                 if (prev && next) {
53545
53546                   if (prev !== begin) { prev = sweepLine.prev(prev); }
53547                   else                { prev = null; }
53548
53549                   next = sweepLine.next(next);
53550                   sweepLine.remove(event);
53551
53552                   if (next && prev) {
53553                     possibleIntersection(prev.key, next.key, eventQueue);
53554                   }
53555                 }
53556               }
53557             }
53558             return sortedEvents;
53559           }
53560
53561           /**
53562            * @param  {Array.<SweepEvent>} sortedEvents
53563            * @return {Array.<SweepEvent>}
53564            */
53565           function orderEvents(sortedEvents) {
53566             var event, i, len, tmp;
53567             var resultEvents = [];
53568             for (i = 0, len = sortedEvents.length; i < len; i++) {
53569               event = sortedEvents[i];
53570               if ((event.left && event.inResult) ||
53571                 (!event.left && event.otherEvent.inResult)) {
53572                 resultEvents.push(event);
53573               }
53574             }
53575             // Due to overlapping edges the resultEvents array can be not wholly sorted
53576             var sorted = false;
53577             while (!sorted) {
53578               sorted = true;
53579               for (i = 0, len = resultEvents.length; i < len; i++) {
53580                 if ((i + 1) < len &&
53581                   compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
53582                   tmp = resultEvents[i];
53583                   resultEvents[i] = resultEvents[i + 1];
53584                   resultEvents[i + 1] = tmp;
53585                   sorted = false;
53586                 }
53587               }
53588             }
53589
53590
53591             for (i = 0, len = resultEvents.length; i < len; i++) {
53592               event = resultEvents[i];
53593               event.pos = i;
53594             }
53595
53596             // imagine, the right event is found in the beginning of the queue,
53597             // when his left counterpart is not marked yet
53598             for (i = 0, len = resultEvents.length; i < len; i++) {
53599               event = resultEvents[i];
53600               if (!event.left) {
53601                 tmp = event.pos;
53602                 event.pos = event.otherEvent.pos;
53603                 event.otherEvent.pos = tmp;
53604               }
53605             }
53606
53607             return resultEvents;
53608           }
53609
53610
53611           /**
53612            * @param  {Number} pos
53613            * @param  {Array.<SweepEvent>} resultEvents
53614            * @param  {Object>}    processed
53615            * @return {Number}
53616            */
53617           function nextPos(pos, resultEvents, processed, origIndex) {
53618             var p, p1;
53619             var newPos = pos + 1;
53620             var length = resultEvents.length;
53621
53622             p  = resultEvents[pos].point;
53623
53624             if (newPos < length)
53625               { p1 = resultEvents[newPos].point; }
53626
53627
53628             // while in range and not the current one by value
53629             while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
53630               if (!processed[newPos]) {
53631                 return newPos;
53632               } else   {
53633                 newPos++;
53634               }
53635               p1 = resultEvents[newPos].point;
53636             }
53637
53638             newPos = pos - 1;
53639
53640             while (processed[newPos] && newPos >= origIndex) {
53641               newPos--;
53642             }
53643             return newPos;
53644           }
53645
53646
53647           /**
53648            * @param  {Array.<SweepEvent>} sortedEvents
53649            * @return {Array.<*>} polygons
53650            */
53651           function connectEdges(sortedEvents, operation) {
53652             var i, len;
53653             var resultEvents = orderEvents(sortedEvents);
53654
53655             // "false"-filled array
53656             var processed = {};
53657             var result = [];
53658             var event;
53659
53660             for (i = 0, len = resultEvents.length; i < len; i++) {
53661               if (processed[i]) { continue; }
53662               var contour = [[]];
53663
53664               if (!resultEvents[i].isExteriorRing) {
53665                 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
53666                   result.push(contour);
53667                 } else if (result.length === 0) {
53668                   result.push([[contour]]);
53669                 } else {
53670                   result[result.length - 1].push(contour[0]);
53671                 }
53672               } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
53673                 result[result.length - 1].push(contour[0]);
53674               } else {
53675                 result.push(contour);
53676               }
53677
53678               var ringId = result.length - 1;
53679               var pos = i;
53680
53681               var initial = resultEvents[i].point;
53682               contour[0].push(initial);
53683
53684               while (pos >= i) {
53685                 event = resultEvents[pos];
53686                 processed[pos] = true;
53687
53688                 if (event.left) {
53689                   event.resultInOut = false;
53690                   event.contourId   = ringId;
53691                 } else {
53692                   event.otherEvent.resultInOut = true;
53693                   event.otherEvent.contourId   = ringId;
53694                 }
53695
53696                 pos = event.pos;
53697                 processed[pos] = true;
53698                 contour[0].push(resultEvents[pos].point);
53699                 pos = nextPos(pos, resultEvents, processed, i);
53700               }
53701
53702               pos = pos === -1 ? i : pos;
53703
53704               event = resultEvents[pos];
53705               processed[pos] = processed[event.pos] = true;
53706               event.otherEvent.resultInOut = true;
53707               event.otherEvent.contourId   = ringId;
53708             }
53709
53710             // Handle if the result is a polygon (eg not multipoly)
53711             // Commented it again, let's see what do we mean by that
53712             // if (result.length === 1) result = result[0];
53713             return result;
53714           }
53715
53716           var tinyqueue = TinyQueue;
53717           var default_1 = TinyQueue;
53718
53719           function TinyQueue(data, compare) {
53720               var this$1 = this;
53721
53722               if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
53723
53724               this.data = data || [];
53725               this.length = this.data.length;
53726               this.compare = compare || defaultCompare;
53727
53728               if (this.length > 0) {
53729                   for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
53730               }
53731           }
53732
53733           function defaultCompare(a, b) {
53734               return a < b ? -1 : a > b ? 1 : 0;
53735           }
53736
53737           TinyQueue.prototype = {
53738
53739               push: function (item) {
53740                   this.data.push(item);
53741                   this.length++;
53742                   this._up(this.length - 1);
53743               },
53744
53745               pop: function () {
53746                   if (this.length === 0) { return undefined; }
53747
53748                   var top = this.data[0];
53749                   this.length--;
53750
53751                   if (this.length > 0) {
53752                       this.data[0] = this.data[this.length];
53753                       this._down(0);
53754                   }
53755                   this.data.pop();
53756
53757                   return top;
53758               },
53759
53760               peek: function () {
53761                   return this.data[0];
53762               },
53763
53764               _up: function (pos) {
53765                   var data = this.data;
53766                   var compare = this.compare;
53767                   var item = data[pos];
53768
53769                   while (pos > 0) {
53770                       var parent = (pos - 1) >> 1;
53771                       var current = data[parent];
53772                       if (compare(item, current) >= 0) { break; }
53773                       data[pos] = current;
53774                       pos = parent;
53775                   }
53776
53777                   data[pos] = item;
53778               },
53779
53780               _down: function (pos) {
53781                   var this$1 = this;
53782
53783                   var data = this.data;
53784                   var compare = this.compare;
53785                   var halfLength = this.length >> 1;
53786                   var item = data[pos];
53787
53788                   while (pos < halfLength) {
53789                       var left = (pos << 1) + 1;
53790                       var right = left + 1;
53791                       var best = data[left];
53792
53793                       if (right < this$1.length && compare(data[right], best) < 0) {
53794                           left = right;
53795                           best = data[right];
53796                       }
53797                       if (compare(best, item) >= 0) { break; }
53798
53799                       data[pos] = best;
53800                       pos = left;
53801                   }
53802
53803                   data[pos] = item;
53804               }
53805           };
53806           tinyqueue.default = default_1;
53807
53808           var max = Math.max;
53809           var min = Math.min;
53810
53811           var contourId = 0;
53812
53813
53814           function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
53815             var i, len, s1, s2, e1, e2;
53816             for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
53817               s1 = contourOrHole[i];
53818               s2 = contourOrHole[i + 1];
53819               e1 = new SweepEvent(s1, false, undefined, isSubject);
53820               e2 = new SweepEvent(s2, false, e1,        isSubject);
53821               e1.otherEvent = e2;
53822
53823               if (s1[0] === s2[0] && s1[1] === s2[1]) {
53824                 continue; // skip collapsed edges, or it breaks
53825               }
53826
53827               e1.contourId = e2.contourId = depth;
53828               if (!isExteriorRing) {
53829                 e1.isExteriorRing = false;
53830                 e2.isExteriorRing = false;
53831               }
53832               if (compareEvents(e1, e2) > 0) {
53833                 e2.left = true;
53834               } else {
53835                 e1.left = true;
53836               }
53837
53838               var x = s1[0], y = s1[1];
53839               bbox[0] = min(bbox[0], x);
53840               bbox[1] = min(bbox[1], y);
53841               bbox[2] = max(bbox[2], x);
53842               bbox[3] = max(bbox[3], y);
53843
53844               // Pushing it so the queue is sorted from left to right,
53845               // with object on the left having the highest priority.
53846               Q.push(e1);
53847               Q.push(e2);
53848             }
53849           }
53850
53851
53852           function fillQueue(subject, clipping, sbbox, cbbox, operation) {
53853             var eventQueue = new tinyqueue(null, compareEvents);
53854             var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
53855
53856             for (i = 0, ii = subject.length; i < ii; i++) {
53857               polygonSet = subject[i];
53858               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53859                 isExteriorRing = j === 0;
53860                 if (isExteriorRing) { contourId++; }
53861                 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
53862               }
53863             }
53864
53865             for (i = 0, ii = clipping.length; i < ii; i++) {
53866               polygonSet = clipping[i];
53867               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53868                 isExteriorRing = j === 0;
53869                 if (operation === DIFFERENCE) { isExteriorRing = false; }
53870                 if (isExteriorRing) { contourId++; }
53871                 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
53872               }
53873             }
53874
53875             return eventQueue;
53876           }
53877
53878           var EMPTY = [];
53879
53880
53881           function trivialOperation(subject, clipping, operation) {
53882             var result = null;
53883             if (subject.length * clipping.length === 0) {
53884               if        (operation === INTERSECTION) {
53885                 result = EMPTY;
53886               } else if (operation === DIFFERENCE) {
53887                 result = subject;
53888               } else if (operation === UNION ||
53889                          operation === XOR) {
53890                 result = (subject.length === 0) ? clipping : subject;
53891               }
53892             }
53893             return result;
53894           }
53895
53896
53897           function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
53898             var result = null;
53899             if (sbbox[0] > cbbox[2] ||
53900                 cbbox[0] > sbbox[2] ||
53901                 sbbox[1] > cbbox[3] ||
53902                 cbbox[1] > sbbox[3]) {
53903               if        (operation === INTERSECTION) {
53904                 result = EMPTY;
53905               } else if (operation === DIFFERENCE) {
53906                 result = subject;
53907               } else if (operation === UNION ||
53908                          operation === XOR) {
53909                 result = subject.concat(clipping);
53910               }
53911             }
53912             return result;
53913           }
53914
53915
53916           function boolean(subject, clipping, operation) {
53917             if (typeof subject[0][0][0] === 'number') {
53918               subject = [subject];
53919             }
53920             if (typeof clipping[0][0][0] === 'number') {
53921               clipping = [clipping];
53922             }
53923             var trivial = trivialOperation(subject, clipping, operation);
53924             if (trivial) {
53925               return trivial === EMPTY ? null : trivial;
53926             }
53927             var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
53928             var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
53929
53930             //console.time('fill queue');
53931             var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
53932             //console.timeEnd('fill queue');
53933
53934             trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
53935             if (trivial) {
53936               return trivial === EMPTY ? null : trivial;
53937             }
53938             //console.time('subdivide edges');
53939             var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
53940             //console.timeEnd('subdivide edges');
53941
53942             //console.time('connect vertices');
53943             var result = connectEdges(sortedEvents, operation);
53944             //console.timeEnd('connect vertices');
53945             return result;
53946           }
53947
53948           function union (subject, clipping) {
53949             return boolean(subject, clipping, UNION);
53950           }
53951
53952           function diff (subject, clipping) {
53953             return boolean(subject, clipping, DIFFERENCE);
53954           }
53955
53956           function xor (subject, clipping){
53957             return boolean(subject, clipping, XOR);
53958           }
53959
53960           function intersection$1 (subject, clipping) {
53961             return boolean(subject, clipping, INTERSECTION);
53962           }
53963
53964           /**
53965            * @enum {Number}
53966            */
53967           var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
53968
53969           exports.union = union;
53970           exports.diff = diff;
53971           exports.xor = xor;
53972           exports.intersection = intersection$1;
53973           exports.operations = operations;
53974
53975           Object.defineProperty(exports, '__esModule', { value: true });
53976
53977         })));
53978
53979         });
53980
53981         var martinez = unwrapExports(martinez_umd);
53982
53983         var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
53984           var e, m;
53985           var eLen = (nBytes * 8) - mLen - 1;
53986           var eMax = (1 << eLen) - 1;
53987           var eBias = eMax >> 1;
53988           var nBits = -7;
53989           var i = isLE ? (nBytes - 1) : 0;
53990           var d = isLE ? -1 : 1;
53991           var s = buffer[offset + i];
53992
53993           i += d;
53994
53995           e = s & ((1 << (-nBits)) - 1);
53996           s >>= (-nBits);
53997           nBits += eLen;
53998           for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
53999
54000           m = e & ((1 << (-nBits)) - 1);
54001           e >>= (-nBits);
54002           nBits += mLen;
54003           for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
54004
54005           if (e === 0) {
54006             e = 1 - eBias;
54007           } else if (e === eMax) {
54008             return m ? NaN : ((s ? -1 : 1) * Infinity)
54009           } else {
54010             m = m + Math.pow(2, mLen);
54011             e = e - eBias;
54012           }
54013           return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
54014         };
54015
54016         var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
54017           var e, m, c;
54018           var eLen = (nBytes * 8) - mLen - 1;
54019           var eMax = (1 << eLen) - 1;
54020           var eBias = eMax >> 1;
54021           var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
54022           var i = isLE ? 0 : (nBytes - 1);
54023           var d = isLE ? 1 : -1;
54024           var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
54025
54026           value = Math.abs(value);
54027
54028           if (isNaN(value) || value === Infinity) {
54029             m = isNaN(value) ? 1 : 0;
54030             e = eMax;
54031           } else {
54032             e = Math.floor(Math.log(value) / Math.LN2);
54033             if (value * (c = Math.pow(2, -e)) < 1) {
54034               e--;
54035               c *= 2;
54036             }
54037             if (e + eBias >= 1) {
54038               value += rt / c;
54039             } else {
54040               value += rt * Math.pow(2, 1 - eBias);
54041             }
54042             if (value * c >= 2) {
54043               e++;
54044               c /= 2;
54045             }
54046
54047             if (e + eBias >= eMax) {
54048               m = 0;
54049               e = eMax;
54050             } else if (e + eBias >= 1) {
54051               m = ((value * c) - 1) * Math.pow(2, mLen);
54052               e = e + eBias;
54053             } else {
54054               m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
54055               e = 0;
54056             }
54057           }
54058
54059           for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
54060
54061           e = (e << mLen) | m;
54062           eLen += mLen;
54063           for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
54064
54065           buffer[offset + i - d] |= s * 128;
54066         };
54067
54068         var ieee754 = {
54069                 read: read$6,
54070                 write: write$6
54071         };
54072
54073         var pbf = Pbf;
54074
54075
54076
54077         function Pbf(buf) {
54078             this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
54079             this.pos = 0;
54080             this.type = 0;
54081             this.length = this.buf.length;
54082         }
54083
54084         Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
54085         Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
54086         Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
54087         Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
54088
54089         var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
54090             SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
54091
54092         Pbf.prototype = {
54093
54094             destroy: function() {
54095                 this.buf = null;
54096             },
54097
54098             // === READING =================================================================
54099
54100             readFields: function(readField, result, end) {
54101                 end = end || this.length;
54102
54103                 while (this.pos < end) {
54104                     var val = this.readVarint(),
54105                         tag = val >> 3,
54106                         startPos = this.pos;
54107
54108                     this.type = val & 0x7;
54109                     readField(tag, result, this);
54110
54111                     if (this.pos === startPos) this.skip(val);
54112                 }
54113                 return result;
54114             },
54115
54116             readMessage: function(readField, result) {
54117                 return this.readFields(readField, result, this.readVarint() + this.pos);
54118             },
54119
54120             readFixed32: function() {
54121                 var val = readUInt32(this.buf, this.pos);
54122                 this.pos += 4;
54123                 return val;
54124             },
54125
54126             readSFixed32: function() {
54127                 var val = readInt32(this.buf, this.pos);
54128                 this.pos += 4;
54129                 return val;
54130             },
54131
54132             // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
54133
54134             readFixed64: function() {
54135                 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54136                 this.pos += 8;
54137                 return val;
54138             },
54139
54140             readSFixed64: function() {
54141                 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54142                 this.pos += 8;
54143                 return val;
54144             },
54145
54146             readFloat: function() {
54147                 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
54148                 this.pos += 4;
54149                 return val;
54150             },
54151
54152             readDouble: function() {
54153                 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
54154                 this.pos += 8;
54155                 return val;
54156             },
54157
54158             readVarint: function(isSigned) {
54159                 var buf = this.buf,
54160                     val, b;
54161
54162                 b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
54163                 b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
54164                 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
54165                 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
54166                 b = buf[this.pos];   val |= (b & 0x0f) << 28;
54167
54168                 return readVarintRemainder(val, isSigned, this);
54169             },
54170
54171             readVarint64: function() { // for compatibility with v2.0.1
54172                 return this.readVarint(true);
54173             },
54174
54175             readSVarint: function() {
54176                 var num = this.readVarint();
54177                 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
54178             },
54179
54180             readBoolean: function() {
54181                 return Boolean(this.readVarint());
54182             },
54183
54184             readString: function() {
54185                 var end = this.readVarint() + this.pos,
54186                     str = readUtf8(this.buf, this.pos, end);
54187                 this.pos = end;
54188                 return str;
54189             },
54190
54191             readBytes: function() {
54192                 var end = this.readVarint() + this.pos,
54193                     buffer = this.buf.subarray(this.pos, end);
54194                 this.pos = end;
54195                 return buffer;
54196             },
54197
54198             // verbose for performance reasons; doesn't affect gzipped size
54199
54200             readPackedVarint: function(arr, isSigned) {
54201                 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
54202                 var end = readPackedEnd(this);
54203                 arr = arr || [];
54204                 while (this.pos < end) arr.push(this.readVarint(isSigned));
54205                 return arr;
54206             },
54207             readPackedSVarint: function(arr) {
54208                 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
54209                 var end = readPackedEnd(this);
54210                 arr = arr || [];
54211                 while (this.pos < end) arr.push(this.readSVarint());
54212                 return arr;
54213             },
54214             readPackedBoolean: function(arr) {
54215                 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
54216                 var end = readPackedEnd(this);
54217                 arr = arr || [];
54218                 while (this.pos < end) arr.push(this.readBoolean());
54219                 return arr;
54220             },
54221             readPackedFloat: function(arr) {
54222                 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
54223                 var end = readPackedEnd(this);
54224                 arr = arr || [];
54225                 while (this.pos < end) arr.push(this.readFloat());
54226                 return arr;
54227             },
54228             readPackedDouble: function(arr) {
54229                 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
54230                 var end = readPackedEnd(this);
54231                 arr = arr || [];
54232                 while (this.pos < end) arr.push(this.readDouble());
54233                 return arr;
54234             },
54235             readPackedFixed32: function(arr) {
54236                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
54237                 var end = readPackedEnd(this);
54238                 arr = arr || [];
54239                 while (this.pos < end) arr.push(this.readFixed32());
54240                 return arr;
54241             },
54242             readPackedSFixed32: function(arr) {
54243                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
54244                 var end = readPackedEnd(this);
54245                 arr = arr || [];
54246                 while (this.pos < end) arr.push(this.readSFixed32());
54247                 return arr;
54248             },
54249             readPackedFixed64: function(arr) {
54250                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
54251                 var end = readPackedEnd(this);
54252                 arr = arr || [];
54253                 while (this.pos < end) arr.push(this.readFixed64());
54254                 return arr;
54255             },
54256             readPackedSFixed64: function(arr) {
54257                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
54258                 var end = readPackedEnd(this);
54259                 arr = arr || [];
54260                 while (this.pos < end) arr.push(this.readSFixed64());
54261                 return arr;
54262             },
54263
54264             skip: function(val) {
54265                 var type = val & 0x7;
54266                 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
54267                 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
54268                 else if (type === Pbf.Fixed32) this.pos += 4;
54269                 else if (type === Pbf.Fixed64) this.pos += 8;
54270                 else throw new Error('Unimplemented type: ' + type);
54271             },
54272
54273             // === WRITING =================================================================
54274
54275             writeTag: function(tag, type) {
54276                 this.writeVarint((tag << 3) | type);
54277             },
54278
54279             realloc: function(min) {
54280                 var length = this.length || 16;
54281
54282                 while (length < this.pos + min) length *= 2;
54283
54284                 if (length !== this.length) {
54285                     var buf = new Uint8Array(length);
54286                     buf.set(this.buf);
54287                     this.buf = buf;
54288                     this.length = length;
54289                 }
54290             },
54291
54292             finish: function() {
54293                 this.length = this.pos;
54294                 this.pos = 0;
54295                 return this.buf.subarray(0, this.length);
54296             },
54297
54298             writeFixed32: function(val) {
54299                 this.realloc(4);
54300                 writeInt32(this.buf, val, this.pos);
54301                 this.pos += 4;
54302             },
54303
54304             writeSFixed32: function(val) {
54305                 this.realloc(4);
54306                 writeInt32(this.buf, val, this.pos);
54307                 this.pos += 4;
54308             },
54309
54310             writeFixed64: function(val) {
54311                 this.realloc(8);
54312                 writeInt32(this.buf, val & -1, this.pos);
54313                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54314                 this.pos += 8;
54315             },
54316
54317             writeSFixed64: function(val) {
54318                 this.realloc(8);
54319                 writeInt32(this.buf, val & -1, this.pos);
54320                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54321                 this.pos += 8;
54322             },
54323
54324             writeVarint: function(val) {
54325                 val = +val || 0;
54326
54327                 if (val > 0xfffffff || val < 0) {
54328                     writeBigVarint(val, this);
54329                     return;
54330                 }
54331
54332                 this.realloc(4);
54333
54334                 this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54335                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54336                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54337                 this.buf[this.pos++] =   (val >>> 7) & 0x7f;
54338             },
54339
54340             writeSVarint: function(val) {
54341                 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
54342             },
54343
54344             writeBoolean: function(val) {
54345                 this.writeVarint(Boolean(val));
54346             },
54347
54348             writeString: function(str) {
54349                 str = String(str);
54350                 this.realloc(str.length * 4);
54351
54352                 this.pos++; // reserve 1 byte for short string length
54353
54354                 var startPos = this.pos;
54355                 // write the string directly to the buffer and see how much was written
54356                 this.pos = writeUtf8(this.buf, str, this.pos);
54357                 var len = this.pos - startPos;
54358
54359                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54360
54361                 // finally, write the message length in the reserved place and restore the position
54362                 this.pos = startPos - 1;
54363                 this.writeVarint(len);
54364                 this.pos += len;
54365             },
54366
54367             writeFloat: function(val) {
54368                 this.realloc(4);
54369                 ieee754.write(this.buf, val, this.pos, true, 23, 4);
54370                 this.pos += 4;
54371             },
54372
54373             writeDouble: function(val) {
54374                 this.realloc(8);
54375                 ieee754.write(this.buf, val, this.pos, true, 52, 8);
54376                 this.pos += 8;
54377             },
54378
54379             writeBytes: function(buffer) {
54380                 var len = buffer.length;
54381                 this.writeVarint(len);
54382                 this.realloc(len);
54383                 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
54384             },
54385
54386             writeRawMessage: function(fn, obj) {
54387                 this.pos++; // reserve 1 byte for short message length
54388
54389                 // write the message directly to the buffer and see how much was written
54390                 var startPos = this.pos;
54391                 fn(obj, this);
54392                 var len = this.pos - startPos;
54393
54394                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54395
54396                 // finally, write the message length in the reserved place and restore the position
54397                 this.pos = startPos - 1;
54398                 this.writeVarint(len);
54399                 this.pos += len;
54400             },
54401
54402             writeMessage: function(tag, fn, obj) {
54403                 this.writeTag(tag, Pbf.Bytes);
54404                 this.writeRawMessage(fn, obj);
54405             },
54406
54407             writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
54408             writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
54409             writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
54410             writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
54411             writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
54412             writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
54413             writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
54414             writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
54415             writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
54416
54417             writeBytesField: function(tag, buffer) {
54418                 this.writeTag(tag, Pbf.Bytes);
54419                 this.writeBytes(buffer);
54420             },
54421             writeFixed32Field: function(tag, val) {
54422                 this.writeTag(tag, Pbf.Fixed32);
54423                 this.writeFixed32(val);
54424             },
54425             writeSFixed32Field: function(tag, val) {
54426                 this.writeTag(tag, Pbf.Fixed32);
54427                 this.writeSFixed32(val);
54428             },
54429             writeFixed64Field: function(tag, val) {
54430                 this.writeTag(tag, Pbf.Fixed64);
54431                 this.writeFixed64(val);
54432             },
54433             writeSFixed64Field: function(tag, val) {
54434                 this.writeTag(tag, Pbf.Fixed64);
54435                 this.writeSFixed64(val);
54436             },
54437             writeVarintField: function(tag, val) {
54438                 this.writeTag(tag, Pbf.Varint);
54439                 this.writeVarint(val);
54440             },
54441             writeSVarintField: function(tag, val) {
54442                 this.writeTag(tag, Pbf.Varint);
54443                 this.writeSVarint(val);
54444             },
54445             writeStringField: function(tag, str) {
54446                 this.writeTag(tag, Pbf.Bytes);
54447                 this.writeString(str);
54448             },
54449             writeFloatField: function(tag, val) {
54450                 this.writeTag(tag, Pbf.Fixed32);
54451                 this.writeFloat(val);
54452             },
54453             writeDoubleField: function(tag, val) {
54454                 this.writeTag(tag, Pbf.Fixed64);
54455                 this.writeDouble(val);
54456             },
54457             writeBooleanField: function(tag, val) {
54458                 this.writeVarintField(tag, Boolean(val));
54459             }
54460         };
54461
54462         function readVarintRemainder(l, s, p) {
54463             var buf = p.buf,
54464                 h, b;
54465
54466             b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
54467             b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
54468             b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
54469             b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
54470             b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
54471             b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
54472
54473             throw new Error('Expected varint not more than 10 bytes');
54474         }
54475
54476         function readPackedEnd(pbf) {
54477             return pbf.type === Pbf.Bytes ?
54478                 pbf.readVarint() + pbf.pos : pbf.pos + 1;
54479         }
54480
54481         function toNum(low, high, isSigned) {
54482             if (isSigned) {
54483                 return high * 0x100000000 + (low >>> 0);
54484             }
54485
54486             return ((high >>> 0) * 0x100000000) + (low >>> 0);
54487         }
54488
54489         function writeBigVarint(val, pbf) {
54490             var low, high;
54491
54492             if (val >= 0) {
54493                 low  = (val % 0x100000000) | 0;
54494                 high = (val / 0x100000000) | 0;
54495             } else {
54496                 low  = ~(-val % 0x100000000);
54497                 high = ~(-val / 0x100000000);
54498
54499                 if (low ^ 0xffffffff) {
54500                     low = (low + 1) | 0;
54501                 } else {
54502                     low = 0;
54503                     high = (high + 1) | 0;
54504                 }
54505             }
54506
54507             if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
54508                 throw new Error('Given varint doesn\'t fit into 10 bytes');
54509             }
54510
54511             pbf.realloc(10);
54512
54513             writeBigVarintLow(low, high, pbf);
54514             writeBigVarintHigh(high, pbf);
54515         }
54516
54517         function writeBigVarintLow(low, high, pbf) {
54518             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54519             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54520             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54521             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54522             pbf.buf[pbf.pos]   = low & 0x7f;
54523         }
54524
54525         function writeBigVarintHigh(high, pbf) {
54526             var lsb = (high & 0x07) << 4;
54527
54528             pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
54529             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54530             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54531             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54532             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54533             pbf.buf[pbf.pos++]  = high & 0x7f;
54534         }
54535
54536         function makeRoomForExtraLength(startPos, len, pbf) {
54537             var extraLen =
54538                 len <= 0x3fff ? 1 :
54539                 len <= 0x1fffff ? 2 :
54540                 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
54541
54542             // if 1 byte isn't enough for encoding message length, shift the data to the right
54543             pbf.realloc(extraLen);
54544             for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
54545         }
54546
54547         function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
54548         function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
54549         function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
54550         function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
54551         function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
54552         function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
54553         function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
54554         function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
54555         function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
54556
54557         // Buffer code below from https://github.com/feross/buffer, MIT-licensed
54558
54559         function readUInt32(buf, pos) {
54560             return ((buf[pos]) |
54561                 (buf[pos + 1] << 8) |
54562                 (buf[pos + 2] << 16)) +
54563                 (buf[pos + 3] * 0x1000000);
54564         }
54565
54566         function writeInt32(buf, val, pos) {
54567             buf[pos] = val;
54568             buf[pos + 1] = (val >>> 8);
54569             buf[pos + 2] = (val >>> 16);
54570             buf[pos + 3] = (val >>> 24);
54571         }
54572
54573         function readInt32(buf, pos) {
54574             return ((buf[pos]) |
54575                 (buf[pos + 1] << 8) |
54576                 (buf[pos + 2] << 16)) +
54577                 (buf[pos + 3] << 24);
54578         }
54579
54580         function readUtf8(buf, pos, end) {
54581             var str = '';
54582             var i = pos;
54583
54584             while (i < end) {
54585                 var b0 = buf[i];
54586                 var c = null; // codepoint
54587                 var bytesPerSequence =
54588                     b0 > 0xEF ? 4 :
54589                     b0 > 0xDF ? 3 :
54590                     b0 > 0xBF ? 2 : 1;
54591
54592                 if (i + bytesPerSequence > end) break;
54593
54594                 var b1, b2, b3;
54595
54596                 if (bytesPerSequence === 1) {
54597                     if (b0 < 0x80) {
54598                         c = b0;
54599                     }
54600                 } else if (bytesPerSequence === 2) {
54601                     b1 = buf[i + 1];
54602                     if ((b1 & 0xC0) === 0x80) {
54603                         c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
54604                         if (c <= 0x7F) {
54605                             c = null;
54606                         }
54607                     }
54608                 } else if (bytesPerSequence === 3) {
54609                     b1 = buf[i + 1];
54610                     b2 = buf[i + 2];
54611                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
54612                         c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
54613                         if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
54614                             c = null;
54615                         }
54616                     }
54617                 } else if (bytesPerSequence === 4) {
54618                     b1 = buf[i + 1];
54619                     b2 = buf[i + 2];
54620                     b3 = buf[i + 3];
54621                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
54622                         c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
54623                         if (c <= 0xFFFF || c >= 0x110000) {
54624                             c = null;
54625                         }
54626                     }
54627                 }
54628
54629                 if (c === null) {
54630                     c = 0xFFFD;
54631                     bytesPerSequence = 1;
54632
54633                 } else if (c > 0xFFFF) {
54634                     c -= 0x10000;
54635                     str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
54636                     c = 0xDC00 | c & 0x3FF;
54637                 }
54638
54639                 str += String.fromCharCode(c);
54640                 i += bytesPerSequence;
54641             }
54642
54643             return str;
54644         }
54645
54646         function writeUtf8(buf, str, pos) {
54647             for (var i = 0, c, lead; i < str.length; i++) {
54648                 c = str.charCodeAt(i); // code point
54649
54650                 if (c > 0xD7FF && c < 0xE000) {
54651                     if (lead) {
54652                         if (c < 0xDC00) {
54653                             buf[pos++] = 0xEF;
54654                             buf[pos++] = 0xBF;
54655                             buf[pos++] = 0xBD;
54656                             lead = c;
54657                             continue;
54658                         } else {
54659                             c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
54660                             lead = null;
54661                         }
54662                     } else {
54663                         if (c > 0xDBFF || (i + 1 === str.length)) {
54664                             buf[pos++] = 0xEF;
54665                             buf[pos++] = 0xBF;
54666                             buf[pos++] = 0xBD;
54667                         } else {
54668                             lead = c;
54669                         }
54670                         continue;
54671                     }
54672                 } else if (lead) {
54673                     buf[pos++] = 0xEF;
54674                     buf[pos++] = 0xBF;
54675                     buf[pos++] = 0xBD;
54676                     lead = null;
54677                 }
54678
54679                 if (c < 0x80) {
54680                     buf[pos++] = c;
54681                 } else {
54682                     if (c < 0x800) {
54683                         buf[pos++] = c >> 0x6 | 0xC0;
54684                     } else {
54685                         if (c < 0x10000) {
54686                             buf[pos++] = c >> 0xC | 0xE0;
54687                         } else {
54688                             buf[pos++] = c >> 0x12 | 0xF0;
54689                             buf[pos++] = c >> 0xC & 0x3F | 0x80;
54690                         }
54691                         buf[pos++] = c >> 0x6 & 0x3F | 0x80;
54692                     }
54693                     buf[pos++] = c & 0x3F | 0x80;
54694                 }
54695             }
54696             return pos;
54697         }
54698
54699         var pointGeometry = Point;
54700
54701         /**
54702          * A standalone point geometry with useful accessor, comparison, and
54703          * modification methods.
54704          *
54705          * @class Point
54706          * @param {Number} x the x-coordinate. this could be longitude or screen
54707          * pixels, or any other sort of unit.
54708          * @param {Number} y the y-coordinate. this could be latitude or screen
54709          * pixels, or any other sort of unit.
54710          * @example
54711          * var point = new Point(-77, 38);
54712          */
54713         function Point(x, y) {
54714             this.x = x;
54715             this.y = y;
54716         }
54717
54718         Point.prototype = {
54719
54720             /**
54721              * Clone this point, returning a new point that can be modified
54722              * without affecting the old one.
54723              * @return {Point} the clone
54724              */
54725             clone: function() { return new Point(this.x, this.y); },
54726
54727             /**
54728              * Add this point's x & y coordinates to another point,
54729              * yielding a new point.
54730              * @param {Point} p the other point
54731              * @return {Point} output point
54732              */
54733             add:     function(p) { return this.clone()._add(p); },
54734
54735             /**
54736              * Subtract this point's x & y coordinates to from point,
54737              * yielding a new point.
54738              * @param {Point} p the other point
54739              * @return {Point} output point
54740              */
54741             sub:     function(p) { return this.clone()._sub(p); },
54742
54743             /**
54744              * Multiply this point's x & y coordinates by point,
54745              * yielding a new point.
54746              * @param {Point} p the other point
54747              * @return {Point} output point
54748              */
54749             multByPoint:    function(p) { return this.clone()._multByPoint(p); },
54750
54751             /**
54752              * Divide this point's x & y coordinates by point,
54753              * yielding a new point.
54754              * @param {Point} p the other point
54755              * @return {Point} output point
54756              */
54757             divByPoint:     function(p) { return this.clone()._divByPoint(p); },
54758
54759             /**
54760              * Multiply this point's x & y coordinates by a factor,
54761              * yielding a new point.
54762              * @param {Point} k factor
54763              * @return {Point} output point
54764              */
54765             mult:    function(k) { return this.clone()._mult(k); },
54766
54767             /**
54768              * Divide this point's x & y coordinates by a factor,
54769              * yielding a new point.
54770              * @param {Point} k factor
54771              * @return {Point} output point
54772              */
54773             div:     function(k) { return this.clone()._div(k); },
54774
54775             /**
54776              * Rotate this point around the 0, 0 origin by an angle a,
54777              * given in radians
54778              * @param {Number} a angle to rotate around, in radians
54779              * @return {Point} output point
54780              */
54781             rotate:  function(a) { return this.clone()._rotate(a); },
54782
54783             /**
54784              * Rotate this point around p point by an angle a,
54785              * given in radians
54786              * @param {Number} a angle to rotate around, in radians
54787              * @param {Point} p Point to rotate around
54788              * @return {Point} output point
54789              */
54790             rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
54791
54792             /**
54793              * Multiply this point by a 4x1 transformation matrix
54794              * @param {Array<Number>} m transformation matrix
54795              * @return {Point} output point
54796              */
54797             matMult: function(m) { return this.clone()._matMult(m); },
54798
54799             /**
54800              * Calculate this point but as a unit vector from 0, 0, meaning
54801              * that the distance from the resulting point to the 0, 0
54802              * coordinate will be equal to 1 and the angle from the resulting
54803              * point to the 0, 0 coordinate will be the same as before.
54804              * @return {Point} unit vector point
54805              */
54806             unit:    function() { return this.clone()._unit(); },
54807
54808             /**
54809              * Compute a perpendicular point, where the new y coordinate
54810              * is the old x coordinate and the new x coordinate is the old y
54811              * coordinate multiplied by -1
54812              * @return {Point} perpendicular point
54813              */
54814             perp:    function() { return this.clone()._perp(); },
54815
54816             /**
54817              * Return a version of this point with the x & y coordinates
54818              * rounded to integers.
54819              * @return {Point} rounded point
54820              */
54821             round:   function() { return this.clone()._round(); },
54822
54823             /**
54824              * Return the magitude of this point: this is the Euclidean
54825              * distance from the 0, 0 coordinate to this point's x and y
54826              * coordinates.
54827              * @return {Number} magnitude
54828              */
54829             mag: function() {
54830                 return Math.sqrt(this.x * this.x + this.y * this.y);
54831             },
54832
54833             /**
54834              * Judge whether this point is equal to another point, returning
54835              * true or false.
54836              * @param {Point} other the other point
54837              * @return {boolean} whether the points are equal
54838              */
54839             equals: function(other) {
54840                 return this.x === other.x &&
54841                        this.y === other.y;
54842             },
54843
54844             /**
54845              * Calculate the distance from this point to another point
54846              * @param {Point} p the other point
54847              * @return {Number} distance
54848              */
54849             dist: function(p) {
54850                 return Math.sqrt(this.distSqr(p));
54851             },
54852
54853             /**
54854              * Calculate the distance from this point to another point,
54855              * without the square root step. Useful if you're comparing
54856              * relative distances.
54857              * @param {Point} p the other point
54858              * @return {Number} distance
54859              */
54860             distSqr: function(p) {
54861                 var dx = p.x - this.x,
54862                     dy = p.y - this.y;
54863                 return dx * dx + dy * dy;
54864             },
54865
54866             /**
54867              * Get the angle from the 0, 0 coordinate to this point, in radians
54868              * coordinates.
54869              * @return {Number} angle
54870              */
54871             angle: function() {
54872                 return Math.atan2(this.y, this.x);
54873             },
54874
54875             /**
54876              * Get the angle from this point to another point, in radians
54877              * @param {Point} b the other point
54878              * @return {Number} angle
54879              */
54880             angleTo: function(b) {
54881                 return Math.atan2(this.y - b.y, this.x - b.x);
54882             },
54883
54884             /**
54885              * Get the angle between this point and another point, in radians
54886              * @param {Point} b the other point
54887              * @return {Number} angle
54888              */
54889             angleWith: function(b) {
54890                 return this.angleWithSep(b.x, b.y);
54891             },
54892
54893             /*
54894              * Find the angle of the two vectors, solving the formula for
54895              * the cross product a x b = |a||b|sin(θ) for θ.
54896              * @param {Number} x the x-coordinate
54897              * @param {Number} y the y-coordinate
54898              * @return {Number} the angle in radians
54899              */
54900             angleWithSep: function(x, y) {
54901                 return Math.atan2(
54902                     this.x * y - this.y * x,
54903                     this.x * x + this.y * y);
54904             },
54905
54906             _matMult: function(m) {
54907                 var x = m[0] * this.x + m[1] * this.y,
54908                     y = m[2] * this.x + m[3] * this.y;
54909                 this.x = x;
54910                 this.y = y;
54911                 return this;
54912             },
54913
54914             _add: function(p) {
54915                 this.x += p.x;
54916                 this.y += p.y;
54917                 return this;
54918             },
54919
54920             _sub: function(p) {
54921                 this.x -= p.x;
54922                 this.y -= p.y;
54923                 return this;
54924             },
54925
54926             _mult: function(k) {
54927                 this.x *= k;
54928                 this.y *= k;
54929                 return this;
54930             },
54931
54932             _div: function(k) {
54933                 this.x /= k;
54934                 this.y /= k;
54935                 return this;
54936             },
54937
54938             _multByPoint: function(p) {
54939                 this.x *= p.x;
54940                 this.y *= p.y;
54941                 return this;
54942             },
54943
54944             _divByPoint: function(p) {
54945                 this.x /= p.x;
54946                 this.y /= p.y;
54947                 return this;
54948             },
54949
54950             _unit: function() {
54951                 this._div(this.mag());
54952                 return this;
54953             },
54954
54955             _perp: function() {
54956                 var y = this.y;
54957                 this.y = this.x;
54958                 this.x = -y;
54959                 return this;
54960             },
54961
54962             _rotate: function(angle) {
54963                 var cos = Math.cos(angle),
54964                     sin = Math.sin(angle),
54965                     x = cos * this.x - sin * this.y,
54966                     y = sin * this.x + cos * this.y;
54967                 this.x = x;
54968                 this.y = y;
54969                 return this;
54970             },
54971
54972             _rotateAround: function(angle, p) {
54973                 var cos = Math.cos(angle),
54974                     sin = Math.sin(angle),
54975                     x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
54976                     y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
54977                 this.x = x;
54978                 this.y = y;
54979                 return this;
54980             },
54981
54982             _round: function() {
54983                 this.x = Math.round(this.x);
54984                 this.y = Math.round(this.y);
54985                 return this;
54986             }
54987         };
54988
54989         /**
54990          * Construct a point from an array if necessary, otherwise if the input
54991          * is already a Point, or an unknown type, return it unchanged
54992          * @param {Array<Number>|Point|*} a any kind of input value
54993          * @return {Point} constructed point, or passed-through value.
54994          * @example
54995          * // this
54996          * var point = Point.convert([0, 1]);
54997          * // is equivalent to
54998          * var point = new Point(0, 1);
54999          */
55000         Point.convert = function (a) {
55001             if (a instanceof Point) {
55002                 return a;
55003             }
55004             if (Array.isArray(a)) {
55005                 return new Point(a[0], a[1]);
55006             }
55007             return a;
55008         };
55009
55010         var vectortilefeature = VectorTileFeature;
55011
55012         function VectorTileFeature(pbf, end, extent, keys, values) {
55013             // Public
55014             this.properties = {};
55015             this.extent = extent;
55016             this.type = 0;
55017
55018             // Private
55019             this._pbf = pbf;
55020             this._geometry = -1;
55021             this._keys = keys;
55022             this._values = values;
55023
55024             pbf.readFields(readFeature, this, end);
55025         }
55026
55027         function readFeature(tag, feature, pbf) {
55028             if (tag == 1) feature.id = pbf.readVarint();
55029             else if (tag == 2) readTag(pbf, feature);
55030             else if (tag == 3) feature.type = pbf.readVarint();
55031             else if (tag == 4) feature._geometry = pbf.pos;
55032         }
55033
55034         function readTag(pbf, feature) {
55035             var end = pbf.readVarint() + pbf.pos;
55036
55037             while (pbf.pos < end) {
55038                 var key = feature._keys[pbf.readVarint()],
55039                     value = feature._values[pbf.readVarint()];
55040                 feature.properties[key] = value;
55041             }
55042         }
55043
55044         VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
55045
55046         VectorTileFeature.prototype.loadGeometry = function() {
55047             var pbf = this._pbf;
55048             pbf.pos = this._geometry;
55049
55050             var end = pbf.readVarint() + pbf.pos,
55051                 cmd = 1,
55052                 length = 0,
55053                 x = 0,
55054                 y = 0,
55055                 lines = [],
55056                 line;
55057
55058             while (pbf.pos < end) {
55059                 if (length <= 0) {
55060                     var cmdLen = pbf.readVarint();
55061                     cmd = cmdLen & 0x7;
55062                     length = cmdLen >> 3;
55063                 }
55064
55065                 length--;
55066
55067                 if (cmd === 1 || cmd === 2) {
55068                     x += pbf.readSVarint();
55069                     y += pbf.readSVarint();
55070
55071                     if (cmd === 1) { // moveTo
55072                         if (line) lines.push(line);
55073                         line = [];
55074                     }
55075
55076                     line.push(new pointGeometry(x, y));
55077
55078                 } else if (cmd === 7) {
55079
55080                     // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
55081                     if (line) {
55082                         line.push(line[0].clone()); // closePolygon
55083                     }
55084
55085                 } else {
55086                     throw new Error('unknown command ' + cmd);
55087                 }
55088             }
55089
55090             if (line) lines.push(line);
55091
55092             return lines;
55093         };
55094
55095         VectorTileFeature.prototype.bbox = function() {
55096             var pbf = this._pbf;
55097             pbf.pos = this._geometry;
55098
55099             var end = pbf.readVarint() + pbf.pos,
55100                 cmd = 1,
55101                 length = 0,
55102                 x = 0,
55103                 y = 0,
55104                 x1 = Infinity,
55105                 x2 = -Infinity,
55106                 y1 = Infinity,
55107                 y2 = -Infinity;
55108
55109             while (pbf.pos < end) {
55110                 if (length <= 0) {
55111                     var cmdLen = pbf.readVarint();
55112                     cmd = cmdLen & 0x7;
55113                     length = cmdLen >> 3;
55114                 }
55115
55116                 length--;
55117
55118                 if (cmd === 1 || cmd === 2) {
55119                     x += pbf.readSVarint();
55120                     y += pbf.readSVarint();
55121                     if (x < x1) x1 = x;
55122                     if (x > x2) x2 = x;
55123                     if (y < y1) y1 = y;
55124                     if (y > y2) y2 = y;
55125
55126                 } else if (cmd !== 7) {
55127                     throw new Error('unknown command ' + cmd);
55128                 }
55129             }
55130
55131             return [x1, y1, x2, y2];
55132         };
55133
55134         VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
55135             var size = this.extent * Math.pow(2, z),
55136                 x0 = this.extent * x,
55137                 y0 = this.extent * y,
55138                 coords = this.loadGeometry(),
55139                 type = VectorTileFeature.types[this.type],
55140                 i, j;
55141
55142             function project(line) {
55143                 for (var j = 0; j < line.length; j++) {
55144                     var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
55145                     line[j] = [
55146                         (p.x + x0) * 360 / size - 180,
55147                         360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
55148                     ];
55149                 }
55150             }
55151
55152             switch (this.type) {
55153             case 1:
55154                 var points = [];
55155                 for (i = 0; i < coords.length; i++) {
55156                     points[i] = coords[i][0];
55157                 }
55158                 coords = points;
55159                 project(coords);
55160                 break;
55161
55162             case 2:
55163                 for (i = 0; i < coords.length; i++) {
55164                     project(coords[i]);
55165                 }
55166                 break;
55167
55168             case 3:
55169                 coords = classifyRings(coords);
55170                 for (i = 0; i < coords.length; i++) {
55171                     for (j = 0; j < coords[i].length; j++) {
55172                         project(coords[i][j]);
55173                     }
55174                 }
55175                 break;
55176             }
55177
55178             if (coords.length === 1) {
55179                 coords = coords[0];
55180             } else {
55181                 type = 'Multi' + type;
55182             }
55183
55184             var result = {
55185                 type: "Feature",
55186                 geometry: {
55187                     type: type,
55188                     coordinates: coords
55189                 },
55190                 properties: this.properties
55191             };
55192
55193             if ('id' in this) {
55194                 result.id = this.id;
55195             }
55196
55197             return result;
55198         };
55199
55200         // classifies an array of rings into polygons with outer rings and holes
55201
55202         function classifyRings(rings) {
55203             var len = rings.length;
55204
55205             if (len <= 1) return [rings];
55206
55207             var polygons = [],
55208                 polygon,
55209                 ccw;
55210
55211             for (var i = 0; i < len; i++) {
55212                 var area = signedArea(rings[i]);
55213                 if (area === 0) continue;
55214
55215                 if (ccw === undefined) ccw = area < 0;
55216
55217                 if (ccw === area < 0) {
55218                     if (polygon) polygons.push(polygon);
55219                     polygon = [rings[i]];
55220
55221                 } else {
55222                     polygon.push(rings[i]);
55223                 }
55224             }
55225             if (polygon) polygons.push(polygon);
55226
55227             return polygons;
55228         }
55229
55230         function signedArea(ring) {
55231             var sum = 0;
55232             for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
55233                 p1 = ring[i];
55234                 p2 = ring[j];
55235                 sum += (p2.x - p1.x) * (p1.y + p2.y);
55236             }
55237             return sum;
55238         }
55239
55240         var vectortilelayer = VectorTileLayer;
55241
55242         function VectorTileLayer(pbf, end) {
55243             // Public
55244             this.version = 1;
55245             this.name = null;
55246             this.extent = 4096;
55247             this.length = 0;
55248
55249             // Private
55250             this._pbf = pbf;
55251             this._keys = [];
55252             this._values = [];
55253             this._features = [];
55254
55255             pbf.readFields(readLayer, this, end);
55256
55257             this.length = this._features.length;
55258         }
55259
55260         function readLayer(tag, layer, pbf) {
55261             if (tag === 15) layer.version = pbf.readVarint();
55262             else if (tag === 1) layer.name = pbf.readString();
55263             else if (tag === 5) layer.extent = pbf.readVarint();
55264             else if (tag === 2) layer._features.push(pbf.pos);
55265             else if (tag === 3) layer._keys.push(pbf.readString());
55266             else if (tag === 4) layer._values.push(readValueMessage(pbf));
55267         }
55268
55269         function readValueMessage(pbf) {
55270             var value = null,
55271                 end = pbf.readVarint() + pbf.pos;
55272
55273             while (pbf.pos < end) {
55274                 var tag = pbf.readVarint() >> 3;
55275
55276                 value = tag === 1 ? pbf.readString() :
55277                     tag === 2 ? pbf.readFloat() :
55278                     tag === 3 ? pbf.readDouble() :
55279                     tag === 4 ? pbf.readVarint64() :
55280                     tag === 5 ? pbf.readVarint() :
55281                     tag === 6 ? pbf.readSVarint() :
55282                     tag === 7 ? pbf.readBoolean() : null;
55283             }
55284
55285             return value;
55286         }
55287
55288         // return feature `i` from this layer as a `VectorTileFeature`
55289         VectorTileLayer.prototype.feature = function(i) {
55290             if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
55291
55292             this._pbf.pos = this._features[i];
55293
55294             var end = this._pbf.readVarint() + this._pbf.pos;
55295             return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
55296         };
55297
55298         var vectortile = VectorTile;
55299
55300         function VectorTile(pbf, end) {
55301             this.layers = pbf.readFields(readTile, {}, end);
55302         }
55303
55304         function readTile(tag, layers, pbf) {
55305             if (tag === 3) {
55306                 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
55307                 if (layer.length) layers[layer.name] = layer;
55308             }
55309         }
55310
55311         var VectorTile$1 = vectortile;
55312         var VectorTileFeature$1 = vectortilefeature;
55313         var VectorTileLayer$1 = vectortilelayer;
55314
55315         var vectorTile = {
55316                 VectorTile: VectorTile$1,
55317                 VectorTileFeature: VectorTileFeature$1,
55318                 VectorTileLayer: VectorTileLayer$1
55319         };
55320
55321         var tiler$6 = utilTiler().tileSize(512).margin(1);
55322         var dispatch$7 = dispatch('loadedData');
55323         var _vtCache;
55324
55325
55326         function abortRequest$6(controller) {
55327             controller.abort();
55328         }
55329
55330
55331         function vtToGeoJSON(data, tile, mergeCache) {
55332             var vectorTile$1 = new vectorTile.VectorTile(new pbf(data));
55333             var layers = Object.keys(vectorTile$1.layers);
55334             if (!Array.isArray(layers)) { layers = [layers]; }
55335
55336             var features = [];
55337             layers.forEach(function(layerID) {
55338                 var layer = vectorTile$1.layers[layerID];
55339                 if (layer) {
55340                     for (var i = 0; i < layer.length; i++) {
55341                         var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
55342                         var geometry = feature.geometry;
55343
55344                         // Treat all Polygons as MultiPolygons
55345                         if (geometry.type === 'Polygon') {
55346                             geometry.type = 'MultiPolygon';
55347                             geometry.coordinates = [geometry.coordinates];
55348                         }
55349
55350                         // Clip to tile bounds
55351                         if (geometry.type === 'MultiPolygon') {
55352                             var isClipped = false;
55353                             var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
55354                             if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
55355                                 // feature = featureClip;
55356                                 isClipped = true;
55357                             }
55358                             if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
55359                             if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
55360                         }
55361
55362                         // Generate some unique IDs and add some metadata
55363                         var featurehash = utilHashcode(fastJsonStableStringify(feature));
55364                         var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
55365                         feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
55366                         feature.__featurehash__ = featurehash;
55367                         feature.__propertyhash__ = propertyhash;
55368                         features.push(feature);
55369
55370                         // Clipped Polygons at same zoom with identical properties can get merged
55371                         if (isClipped && geometry.type === 'MultiPolygon') {
55372                             var merged = mergeCache[propertyhash];
55373                             if (merged && merged.length) {
55374                                 var other = merged[0];
55375                                 var coords = martinez.union(
55376                                     feature.geometry.coordinates, other.geometry.coordinates
55377                                 );
55378
55379                                 if (!coords || !coords.length) {
55380                                     continue;  // something failed in martinez union
55381                                 }
55382
55383                                 merged.push(feature);
55384                                 for (var j = 0; j < merged.length; j++) {      // all these features get...
55385                                     merged[j].geometry.coordinates = coords;   // same coords
55386                                     merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
55387                                 }
55388                             } else {
55389                                 mergeCache[propertyhash] = [feature];
55390                             }
55391                         }
55392                     }
55393                 }
55394             });
55395
55396             return features;
55397         }
55398
55399
55400         function loadTile(source, tile) {
55401             if (source.loaded[tile.id] || source.inflight[tile.id]) return;
55402
55403             var url = source.template
55404                 .replace('{x}', tile.xyz[0])
55405                 .replace('{y}', tile.xyz[1])
55406                 // TMS-flipped y coordinate
55407                 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
55408                 .replace(/\{z(oom)?\}/, tile.xyz[2])
55409                 .replace(/\{switch:([^}]+)\}/, function(s, r) {
55410                     var subdomains = r.split(',');
55411                     return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
55412                 });
55413
55414
55415             var controller = new AbortController();
55416             source.inflight[tile.id] = controller;
55417
55418             fetch(url, { signal: controller.signal })
55419                 .then(function(response) {
55420                     if (!response.ok) {
55421                         throw new Error(response.status + ' ' + response.statusText);
55422                     }
55423                     source.loaded[tile.id] = [];
55424                     delete source.inflight[tile.id];
55425                     return response.arrayBuffer();
55426                 })
55427                 .then(function(data) {
55428                     if (!data) {
55429                         throw new Error('No Data');
55430                     }
55431
55432                     var z = tile.xyz[2];
55433                     if (!source.canMerge[z]) {
55434                         source.canMerge[z] = {};  // initialize mergeCache
55435                     }
55436
55437                     source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
55438                     dispatch$7.call('loadedData');
55439                 })
55440                 .catch(function() {
55441                     source.loaded[tile.id] = [];
55442                     delete source.inflight[tile.id];
55443                 });
55444         }
55445
55446
55447         var serviceVectorTile = {
55448
55449             init: function() {
55450                 if (!_vtCache) {
55451                     this.reset();
55452                 }
55453
55454                 this.event = utilRebind(this, dispatch$7, 'on');
55455             },
55456
55457
55458             reset: function() {
55459                 for (var sourceID in _vtCache) {
55460                     var source = _vtCache[sourceID];
55461                     if (source && source.inflight) {
55462                         Object.values(source.inflight).forEach(abortRequest$6);
55463                     }
55464                 }
55465
55466                 _vtCache = {};
55467             },
55468
55469
55470             addSource: function(sourceID, template) {
55471                 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
55472                 return _vtCache[sourceID];
55473             },
55474
55475
55476             data: function(sourceID, projection) {
55477                 var source = _vtCache[sourceID];
55478                 if (!source) return [];
55479
55480                 var tiles = tiler$6.getTiles(projection);
55481                 var seen = {};
55482                 var results = [];
55483
55484                 for (var i = 0; i < tiles.length; i++) {
55485                     var features = source.loaded[tiles[i].id];
55486                     if (!features || !features.length) continue;
55487
55488                     for (var j = 0; j < features.length; j++) {
55489                         var feature = features[j];
55490                         var hash = feature.__featurehash__;
55491                         if (seen[hash]) continue;
55492                         seen[hash] = true;
55493
55494                         // return a shallow copy, because the hash may change
55495                         // later if this feature gets merged with another
55496                         results.push(Object.assign({}, feature));  // shallow copy
55497                     }
55498                 }
55499
55500                 return results;
55501             },
55502
55503
55504             loadTiles: function(sourceID, template, projection) {
55505                 var source = _vtCache[sourceID];
55506                 if (!source) {
55507                     source = this.addSource(sourceID, template);
55508                 }
55509
55510                 var tiles = tiler$6.getTiles(projection);
55511
55512                 // abort inflight requests that are no longer needed
55513                 Object.keys(source.inflight).forEach(function(k) {
55514                     var wanted = tiles.find(function(tile) { return k === tile.id; });
55515                     if (!wanted) {
55516                         abortRequest$6(source.inflight[k]);
55517                         delete source.inflight[k];
55518                     }
55519                 });
55520
55521                 tiles.forEach(function(tile) {
55522                     loadTile(source, tile);
55523                 });
55524             },
55525
55526
55527             cache: function() {
55528                 return _vtCache;
55529             }
55530
55531         };
55532
55533         var apibase$5 = 'https://www.wikidata.org/w/api.php?';
55534         var _wikidataCache = {};
55535
55536
55537         var serviceWikidata = {
55538
55539             init: function() {},
55540
55541             reset: function() {
55542                 _wikidataCache = {};
55543             },
55544
55545
55546             // Search for Wikidata items matching the query
55547             itemsForSearchQuery: function(query, callback) {
55548                 if (!query) {
55549                     if (callback) callback('No query', {});
55550                     return;
55551                 }
55552
55553                 var url = apibase$5 + utilQsString({
55554                     action: 'wbsearchentities',
55555                     format: 'json',
55556                     formatversion: 2,
55557                     search: query,
55558                     type: 'item',
55559                     language: this.languagesToQuery()[0],
55560                     limit: 10,
55561                     origin: '*'
55562                 });
55563
55564                 d3_json(url)
55565                     .then(function(result) {
55566                         if (result && result.error) {
55567                             throw new Error(result.error);
55568                         }
55569                         if (callback) callback(null, result.search || {});
55570                     })
55571                     .catch(function(err) {
55572                         if (callback) callback(err.message, {});
55573                     });
55574             },
55575
55576
55577             // Given a Wikipedia language and article title,
55578             // return an array of corresponding Wikidata entities.
55579             itemsByTitle: function(lang, title, callback) {
55580                 if (!title) {
55581                     if (callback) callback('No title', {});
55582                     return;
55583                 }
55584
55585                 lang = lang || 'en';
55586                 var url = apibase$5 + utilQsString({
55587                     action: 'wbgetentities',
55588                     format: 'json',
55589                     formatversion: 2,
55590                     sites: lang.replace(/-/g, '_') + 'wiki',
55591                     titles: title,
55592                     languages: 'en', // shrink response by filtering to one language
55593                     origin: '*'
55594                 });
55595
55596                 d3_json(url)
55597                     .then(function(result) {
55598                         if (result && result.error) {
55599                             throw new Error(result.error);
55600                         }
55601                         if (callback) callback(null, result.entities || {});
55602                     })
55603                     .catch(function(err) {
55604                         if (callback) callback(err.message, {});
55605                     });
55606             },
55607
55608
55609             languagesToQuery: function() {
55610                 return utilArrayUniq([
55611                     currentLocale.toLowerCase(),
55612                     currentLocale.split('-', 2)[0].toLowerCase(),
55613                     'en'
55614                 ]);
55615             },
55616
55617
55618             entityByQID: function(qid, callback) {
55619                 if (!qid) {
55620                     callback('No qid', {});
55621                     return;
55622                 }
55623                 if (_wikidataCache[qid]) {
55624                     if (callback) callback(null, _wikidataCache[qid]);
55625                     return;
55626                 }
55627
55628                 var langs = this.languagesToQuery();
55629                 var url = apibase$5 + utilQsString({
55630                     action: 'wbgetentities',
55631                     format: 'json',
55632                     formatversion: 2,
55633                     ids: qid,
55634                     props: 'labels|descriptions|claims|sitelinks',
55635                     sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
55636                     languages: langs.join('|'),
55637                     languagefallback: 1,
55638                     origin: '*'
55639                 });
55640
55641                 d3_json(url)
55642                     .then(function(result) {
55643                         if (result && result.error) {
55644                             throw new Error(result.error);
55645                         }
55646                         if (callback) callback(null, result.entities[qid] || {});
55647                     })
55648                     .catch(function(err) {
55649                         if (callback) callback(err.message, {});
55650                     });
55651             },
55652
55653
55654             // Pass `params` object of the form:
55655             // {
55656             //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
55657             // }
55658             //
55659             // Get an result object used to display tag documentation
55660             // {
55661             //   title:        'string',
55662             //   description:  'string',
55663             //   editURL:      'string',
55664             //   imageURL:     'string',
55665             //   wiki:         { title: 'string', text: 'string', url: 'string' }
55666             // }
55667             //
55668             getDocs: function(params, callback) {
55669                 var langs = this.languagesToQuery();
55670                 this.entityByQID(params.qid, function(err, entity) {
55671                     if (err || !entity) {
55672                         callback(err || 'No entity');
55673                         return;
55674                     }
55675
55676                     var i;
55677                     var description;
55678                     if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
55679                         description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
55680                     }
55681
55682                     // prepare result
55683                     var result = {
55684                         title: entity.id,
55685                         description: description,
55686                         editURL: 'https://www.wikidata.org/wiki/' + entity.id
55687                     };
55688
55689                     // add image
55690                     if (entity.claims) {
55691                         var imageroot = 'https://commons.wikimedia.org/w/index.php';
55692                         var props = ['P154','P18'];  // logo image, image
55693                         var prop, image;
55694                         for (i = 0; i < props.length; i++) {
55695                             prop = entity.claims[props[i]];
55696                             if (prop && Object.keys(prop).length > 0) {
55697                                 image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
55698                                 if (image) {
55699                                     result.imageURL = imageroot + '?' + utilQsString({
55700                                         title: 'Special:Redirect/file/' + image,
55701                                         width: 400
55702                                     });
55703                                     break;
55704                                 }
55705                             }
55706                         }
55707                     }
55708
55709                     if (entity.sitelinks) {
55710                         var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
55711
55712                         // must be one of these that we requested..
55713                         for (i = 0; i < langs.length; i++) {   // check each, in order of preference
55714                             var w = langs[i] + 'wiki';
55715                             if (entity.sitelinks[w]) {
55716                                 var title = entity.sitelinks[w].title;
55717                                 var tKey = 'inspector.wiki_reference';
55718                                 if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
55719                                     tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
55720                                 }
55721
55722                                 result.wiki = {
55723                                     title: title,
55724                                     text: tKey,
55725                                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
55726                                 };
55727                                 break;
55728                             }
55729                         }
55730                     }
55731
55732                     callback(null, result);
55733                 });
55734             }
55735
55736         };
55737
55738         var endpoint = 'https://en.wikipedia.org/w/api.php?';
55739
55740         var serviceWikipedia = {
55741
55742             init: function() {},
55743             reset: function() {},
55744
55745
55746             search: function(lang, query, callback) {
55747                 if (!query) {
55748                     if (callback) callback('No Query', []);
55749                     return;
55750                 }
55751
55752                 lang = lang || 'en';
55753                 var url = endpoint.replace('en', lang) +
55754                     utilQsString({
55755                         action: 'query',
55756                         list: 'search',
55757                         srlimit: '10',
55758                         srinfo: 'suggestion',
55759                         format: 'json',
55760                         origin: '*',
55761                         srsearch: query
55762                     });
55763
55764                 d3_json(url)
55765                     .then(function(result) {
55766                         if (result && result.error) {
55767                             throw new Error(result.error);
55768                         } else if (!result || !result.query || !result.query.search) {
55769                             throw new Error('No Results');
55770                         }
55771                         if (callback) {
55772                             var titles = result.query.search.map(function(d) { return d.title; });
55773                             callback(null, titles);
55774                         }
55775                     })
55776                     .catch(function(err) {
55777                         if (callback) callback(err, []);
55778                     });
55779             },
55780
55781
55782             suggestions: function(lang, query, callback) {
55783                 if (!query) {
55784                     if (callback) callback('', []);
55785                     return;
55786                 }
55787
55788                 lang = lang || 'en';
55789                 var url = endpoint.replace('en', lang) +
55790                     utilQsString({
55791                         action: 'opensearch',
55792                         namespace: 0,
55793                         suggest: '',
55794                         format: 'json',
55795                         origin: '*',
55796                         search: query
55797                     });
55798
55799                 d3_json(url)
55800                     .then(function(result) {
55801                         if (result && result.error) {
55802                             throw new Error(result.error);
55803                         } else if (!result || result.length < 2) {
55804                             throw new Error('No Results');
55805                         }
55806                         if (callback) callback(null, result[1] || []);
55807                     })
55808                     .catch(function(err) {
55809                         if (callback) callback(err.message, []);
55810                     });
55811             },
55812
55813
55814             translations: function(lang, title, callback) {
55815                 if (!title) {
55816                     if (callback) callback('No Title');
55817                     return;
55818                 }
55819
55820                 var url = endpoint.replace('en', lang) +
55821                     utilQsString({
55822                         action: 'query',
55823                         prop: 'langlinks',
55824                         format: 'json',
55825                         origin: '*',
55826                         lllimit: 500,
55827                         titles: title
55828                     });
55829
55830                 d3_json(url)
55831                     .then(function(result) {
55832                         if (result && result.error) {
55833                             throw new Error(result.error);
55834                         } else if (!result || !result.query || !result.query.pages) {
55835                             throw new Error('No Results');
55836                         }
55837                         if (callback) {
55838                             var list = result.query.pages[Object.keys(result.query.pages)[0]];
55839                             var translations = {};
55840                             if (list && list.langlinks) {
55841                                 list.langlinks.forEach(function(d) { translations[d.lang] = d['*']; });
55842                             }
55843                             callback(null, translations);
55844                         }
55845                     })
55846                     .catch(function(err) {
55847                         if (callback) callback(err.message);
55848                     });
55849             }
55850
55851         };
55852
55853         var services$1 = {
55854             geocoder: serviceNominatim,
55855             keepRight: serviceKeepRight,
55856             improveOSM: serviceImproveOSM,
55857             mapillary: serviceMapillary,
55858             openstreetcam: serviceOpenstreetcam,
55859             osm: serviceOsm,
55860             osmWikibase: serviceOsmWikibase,
55861             maprules: serviceMapRules,
55862             streetside: serviceStreetside,
55863             taginfo: serviceTaginfo,
55864             vectorTile: serviceVectorTile,
55865             wikidata: serviceWikidata,
55866             wikipedia: serviceWikipedia
55867         };
55868
55869         function svgIcon(name, svgklass, useklass) {
55870             return function drawIcon(selection) {
55871                 selection.selectAll('svg.icon')
55872                     .data([0])
55873                     .enter()
55874                     .append('svg')
55875                     .attr('class', 'icon ' + (svgklass || ''))
55876                     .append('use')
55877                     .attr('xlink:href', name)
55878                     .attr('class', useklass);
55879             };
55880         }
55881
55882         function uiNoteComments() {
55883             var _note;
55884
55885
55886             function noteComments(selection) {
55887                 if (_note.isNew()) return; // don't draw .comments-container
55888
55889                 var comments = selection.selectAll('.comments-container')
55890                     .data([0]);
55891
55892                 comments = comments.enter()
55893                     .append('div')
55894                     .attr('class', 'comments-container')
55895                     .merge(comments);
55896
55897                 var commentEnter = comments.selectAll('.comment')
55898                     .data(_note.comments)
55899                     .enter()
55900                     .append('div')
55901                     .attr('class', 'comment');
55902
55903                 commentEnter
55904                     .append('div')
55905                     .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
55906                     .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
55907
55908                 var mainEnter = commentEnter
55909                     .append('div')
55910                     .attr('class', 'comment-main');
55911
55912                 var metadataEnter = mainEnter
55913                     .append('div')
55914                     .attr('class', 'comment-metadata');
55915
55916                 metadataEnter
55917                     .append('div')
55918                     .attr('class', 'comment-author')
55919                     .each(function(d) {
55920                         var selection = d3_select(this);
55921                         var osm = services$1.osm;
55922                         if (osm && d.user) {
55923                             selection = selection
55924                                 .append('a')
55925                                 .attr('class', 'comment-author-link')
55926                                 .attr('href', osm.userURL(d.user))
55927                                 .attr('tabindex', -1)
55928                                 .attr('target', '_blank');
55929                         }
55930                         selection
55931                             .text(function(d) { return d.user || t('note.anonymous'); });
55932                     });
55933
55934                 metadataEnter
55935                     .append('div')
55936                     .attr('class', 'comment-date')
55937                     .text(function(d) {
55938                         return t('note.status.' + d.action, { when: localeDateString(d.date) });
55939                     });
55940
55941                 mainEnter
55942                     .append('div')
55943                     .attr('class', 'comment-text')
55944                     .html(function(d) { return d.html; });
55945
55946                 comments
55947                     .call(replaceAvatars);
55948             }
55949
55950
55951             function replaceAvatars(selection) {
55952                 var osm = services$1.osm;
55953                 if (!osm) return;
55954
55955                 var uids = {};  // gather uids in the comment thread
55956                 _note.comments.forEach(function(d) {
55957                     if (d.uid) uids[d.uid] = true;
55958                 });
55959
55960                 Object.keys(uids).forEach(function(uid) {
55961                     osm.loadUser(uid, function(err, user) {
55962                         if (!user || !user.image_url) return;
55963
55964                         selection.selectAll('.comment-avatar.user-' + uid)
55965                             .html('')
55966                             .append('img')
55967                             .attr('class', 'icon comment-avatar-icon')
55968                             .attr('src', user.image_url)
55969                             .attr('alt', user.display_name);
55970                     });
55971                 });
55972             }
55973
55974
55975             function localeDateString(s) {
55976                 if (!s) return null;
55977                 var detected = utilDetect();
55978                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
55979                 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
55980                 var d = new Date(s);
55981                 if (isNaN(d.getTime())) return null;
55982                 return d.toLocaleDateString(detected.locale, options);
55983             }
55984
55985
55986             noteComments.note = function(val) {
55987                 if (!arguments.length) return _note;
55988                 _note = val;
55989                 return noteComments;
55990             };
55991
55992
55993             return noteComments;
55994         }
55995
55996         function uiNoteHeader() {
55997             var _note;
55998
55999
56000             function noteHeader(selection) {
56001                 var header = selection.selectAll('.note-header')
56002                     .data(
56003                         (_note ? [_note] : []),
56004                         function(d) { return d.status + d.id; }
56005                     );
56006
56007                 header.exit()
56008                     .remove();
56009
56010                 var headerEnter = header.enter()
56011                     .append('div')
56012                     .attr('class', 'note-header');
56013
56014                 var iconEnter = headerEnter
56015                     .append('div')
56016                     .attr('class', function(d) { return 'note-header-icon ' + d.status; })
56017                     .classed('new', function(d) { return d.id < 0; });
56018
56019                 iconEnter
56020                     .append('div')
56021                     .attr('class', 'preset-icon-28')
56022                     .call(svgIcon('#iD-icon-note', 'note-fill'));
56023
56024                 iconEnter.each(function(d) {
56025                     var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
56026                     iconEnter
56027                         .append('div')
56028                         .attr('class', 'note-icon-annotation')
56029                         .call(svgIcon(statusIcon, 'icon-annotation'));
56030                 });
56031
56032                 headerEnter
56033                     .append('div')
56034                     .attr('class', 'note-header-label')
56035                     .text(function(d) {
56036                         if (_note.isNew()) { return t('note.new'); }
56037                         return t('note.note') + ' ' + d.id + ' ' +
56038                             (d.status === 'closed' ? t('note.closed') : '');
56039                     });
56040             }
56041
56042
56043             noteHeader.note = function(val) {
56044                 if (!arguments.length) return _note;
56045                 _note = val;
56046                 return noteHeader;
56047             };
56048
56049
56050             return noteHeader;
56051         }
56052
56053         function uiNoteReport() {
56054             var _note;
56055
56056             function noteReport(selection) {
56057                 var url;
56058                 if (services$1.osm && (_note instanceof osmNote) && (!_note.isNew())) {
56059                     url = services$1.osm.noteReportURL(_note);
56060                 }
56061
56062                 var link = selection.selectAll('.note-report')
56063                     .data(url ? [url] : []);
56064
56065                 // exit
56066                 link.exit()
56067                     .remove();
56068
56069                 // enter
56070                 var linkEnter = link.enter()
56071                     .append('a')
56072                     .attr('class', 'note-report')
56073                     .attr('target', '_blank')
56074                     .attr('href', function(d) { return d; })
56075                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56076
56077                 linkEnter
56078                     .append('span')
56079                     .text(t('note.report'));
56080             }
56081
56082
56083             noteReport.note = function(val) {
56084                 if (!arguments.length) return _note;
56085                 _note = val;
56086                 return noteReport;
56087             };
56088
56089             return noteReport;
56090         }
56091
56092         var _tooltipID = 0;
56093
56094         function tooltip(klass) {
56095             var _id = _tooltipID++;
56096             var tooltip = function(selection) {
56097                 selection.each(setup);
56098             };
56099             var _animation = utilFunctor(false);
56100             var _title = function() {
56101                 var title = this.getAttribute('data-original-title');
56102                 if (title) {
56103                     return title;
56104                 } else {
56105                     title = this.getAttribute('title');
56106                     this.removeAttribute('title');
56107                     this.setAttribute('data-original-title', title);
56108                 }
56109                 return title;
56110             };
56111             var _html = utilFunctor(false);
56112             var _placement = utilFunctor('top');
56113
56114
56115             tooltip.title = function(val) {
56116                 if (arguments.length) {
56117                     _title = utilFunctor(val);
56118                     return tooltip;
56119                 } else {
56120                     return _title;
56121                 }
56122             };
56123
56124
56125             tooltip.html = function(val) {
56126                 if (arguments.length) {
56127                     _html = utilFunctor(val);
56128                     return tooltip;
56129                 } else {
56130                     return _html;
56131                 }
56132             };
56133
56134
56135             tooltip.placement = function(val) {
56136                 if (arguments.length) {
56137                     _placement = utilFunctor(val);
56138                     return tooltip;
56139                 } else {
56140                     return _placement;
56141                 }
56142             };
56143
56144
56145             tooltip.show = function(selection) {
56146                 selection.each(show);
56147             };
56148
56149
56150             tooltip.hide = function(selection) {
56151                 selection.each(hide);
56152             };
56153
56154
56155             tooltip.toggle = function(selection) {
56156                 selection.each(toggle);
56157             };
56158
56159
56160             tooltip.destroy = function(selection, selector) {
56161                 // by default, just destroy the current tooltip
56162                 selector = selector || '.tooltip-' + _id;
56163
56164                 selection
56165                     .on('mouseenter.tooltip', null)
56166                     .on('mouseleave.tooltip', null)
56167                     .attr('title', function() {
56168                         return this.getAttribute('data-original-title') || this.getAttribute('title');
56169                     })
56170                     .attr('data-original-title', null)
56171                     .selectAll(selector)
56172                     .remove();
56173             };
56174
56175
56176             tooltip.destroyAny = function(selection) {
56177                 selection.call(tooltip.destroy, '.tooltip');
56178             };
56179
56180             var isTouchEvent = false;
56181
56182             function setup() {
56183                 var root = d3_select(this);
56184                 var animate = _animation.apply(this, arguments);
56185                 var tip = root.selectAll('.tooltip-' + _id)
56186                     .data([0]);
56187
56188                 var enter = tip.enter()
56189                     .append('div')
56190                     .attr('class', 'tooltip tooltip-' + _id + ' ' + (klass ? klass : ''));
56191
56192                 enter
56193                     .append('div')
56194                     .attr('class', 'tooltip-arrow');
56195
56196                 enter
56197                     .append('div')
56198                     .attr('class', 'tooltip-inner');
56199
56200                 tip = enter
56201                     .merge(tip);
56202
56203                 if (animate) {
56204                     tip.classed('fade', true);
56205                 }
56206
56207                 var place = _placement.apply(this, arguments);
56208                 tip.classed(place, true);
56209
56210                 root.on('touchstart.tooltip', function() {
56211                     // hack to avoid showing tooltips upon touch input
56212                     isTouchEvent = true;
56213                 });
56214                 root.on('mouseenter.tooltip', show);
56215                 root.on('mouseleave.tooltip', hide);
56216             }
56217
56218
56219             function show() {
56220                 if (isTouchEvent) {
56221                     isTouchEvent = false;
56222                     return;
56223                 }
56224                 var root = d3_select(this);
56225                 var content = _title.apply(this, arguments);
56226                 var tip = root.selectAll('.tooltip-' + _id);
56227
56228                 if (tip.empty()) {   // tooltip was removed somehow, put it back
56229                     root.call(tooltip.destroy);
56230                     root.each(setup);
56231                     tip = root.selectAll('.tooltip-' + _id);
56232                 }
56233
56234                 tip.classed('in', true);
56235                 var markup = _html.apply(this, arguments);
56236
56237                 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
56238                 var place = _placement.apply(this, arguments);
56239                 var outer = getPosition(root.node());
56240                 var inner = getPosition(tip.node());
56241                 var pos;
56242
56243                 switch (place) {
56244                     case 'top':
56245                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
56246                     break;
56247                     case 'right':
56248                     pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
56249                     break;
56250                     case 'left':
56251                     pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
56252                     break;
56253                     case 'bottom':
56254                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y + outer.h };
56255                     break;
56256                 }
56257
56258                 if (pos) {
56259                     tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
56260                 } else {
56261                     tip.style('left', null).style('top', null);
56262                 }
56263
56264                 this.tooltipVisible = true;
56265
56266
56267                 function getPosition(node) {
56268                     var mode = d3_select(node).style('position');
56269                     if (mode === 'absolute' || mode === 'static') {
56270                         return {
56271                             x: node.offsetLeft,
56272                             y: node.offsetTop,
56273                             w: node.offsetWidth,
56274                             h: node.offsetHeight
56275                         };
56276                     } else {
56277                         return {
56278                             x: 0,
56279                             y: 0,
56280                             w: node.offsetWidth,
56281                             h: node.offsetHeight
56282                         };
56283                     }
56284                 }
56285             }
56286
56287
56288             function hide() {
56289                 d3_select(this).selectAll('.tooltip-' + _id).classed('in', false);
56290                 this.tooltipVisible = false;
56291             }
56292
56293
56294             function toggle() {
56295                 if (this.tooltipVisible) {
56296                     hide.apply(this, arguments);
56297                 } else {
56298                     show.apply(this, arguments);
56299                 }
56300             }
56301
56302
56303             return tooltip;
56304         }
56305
56306         function uiQuickLinks() {
56307             var _choices = [];
56308
56309
56310             function quickLinks(selection) {
56311                 var container = selection.selectAll('.quick-links')
56312                     .data([0]);
56313
56314                 container = container.enter()
56315                     .append('div')
56316                     .attr('class', 'quick-links')
56317                     .merge(container);
56318
56319                 var items = container.selectAll('.quick-link')
56320                     .data(_choices, function(d) { return d.id; });
56321
56322                 items.exit()
56323                     .remove();
56324
56325                 items.enter()
56326                     .append('a')
56327                     .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
56328                     .attr('href', '#')
56329                     .text(function(d) { return t(d.label); })
56330                     .each(function(d) {
56331                         if (typeof d.tooltip !== 'function') return;
56332                         d3_select(this)
56333                             .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
56334                     })
56335                     .on('click', function(d) {
56336                         if (typeof d.click !== 'function') return;
56337                         event.preventDefault();
56338                         d.click(d);
56339                     });
56340             }
56341
56342
56343             //  val should be an array of choices like:
56344             //    [{
56345             //       id: 'link-id',
56346             //       label: 'translation.key',
56347             //       tooltip: function(d),
56348             //       click: function(d)
56349             //    }, ..]
56350             quickLinks.choices = function(val) {
56351                 if (!arguments.length) return _choices;
56352                 _choices = val;
56353                 return quickLinks;
56354             };
56355
56356
56357             return quickLinks;
56358         }
56359
56360         function uiTooltipHtml(text, key, heading) {
56361             var s = '';
56362
56363             if (heading) {
56364                 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
56365             }
56366             if (text) {
56367                 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
56368             }
56369             if (key) {
56370                 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
56371                     '<span class="keyhint">' + key + '</span></div>';
56372             }
56373
56374             return s;
56375         }
56376
56377         function uiViewOnOSM(context) {
56378             var _what;   // an osmEntity or osmNote
56379
56380
56381             function viewOnOSM(selection) {
56382                 var url;
56383                 if (_what instanceof osmEntity) {
56384                     url = context.connection().entityURL(_what);
56385                 } else if (_what instanceof osmNote) {
56386                     url = context.connection().noteURL(_what);
56387                 }
56388
56389                 var data = ((!_what || _what.isNew()) ? [] : [_what]);
56390                 var link = selection.selectAll('.view-on-osm')
56391                     .data(data, function(d) { return d.id; });
56392
56393                 // exit
56394                 link.exit()
56395                     .remove();
56396
56397                 // enter
56398                 var linkEnter = link.enter()
56399                     .append('a')
56400                     .attr('class', 'view-on-osm')
56401                     .attr('target', '_blank')
56402                     .attr('href', url)
56403                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56404
56405                 linkEnter
56406                     .append('span')
56407                     .text(t('inspector.view_on_osm'));
56408             }
56409
56410
56411             viewOnOSM.what = function(_) {
56412                 if (!arguments.length) return _what;
56413                 _what = _;
56414                 return viewOnOSM;
56415             };
56416
56417             return viewOnOSM;
56418         }
56419
56420         function uiNoteEditor(context) {
56421             var dispatch$1 = dispatch('change');
56422             var quickLinks = uiQuickLinks();
56423             var noteComments = uiNoteComments();
56424             var noteHeader = uiNoteHeader();
56425
56426             // var formFields = uiFormFields(context);
56427
56428             var _note;
56429             // var _fieldsArr;
56430
56431
56432             function noteEditor(selection) {
56433                 // quick links
56434                 var choices = [{
56435                     id: 'zoom_to',
56436                     label: 'inspector.zoom_to.title',
56437                     tooltip: function() {
56438                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
56439                     },
56440                     click: function zoomTo() {
56441                         context.mode().zoomToSelected();
56442                     }
56443                 }];
56444
56445
56446                 var header = selection.selectAll('.header')
56447                     .data([0]);
56448
56449                 var headerEnter = header.enter()
56450                     .append('div')
56451                     .attr('class', 'header fillL');
56452
56453                 headerEnter
56454                     .append('button')
56455                     .attr('class', 'fr note-editor-close')
56456                     .on('click', function() {
56457                         context.enter(modeBrowse(context));
56458                     })
56459                     .call(svgIcon('#iD-icon-close'));
56460
56461                 headerEnter
56462                     .append('h3')
56463                     .text(t('note.title'));
56464
56465
56466                 var body = selection.selectAll('.body')
56467                     .data([0]);
56468
56469                 body = body.enter()
56470                     .append('div')
56471                     .attr('class', 'body')
56472                     .merge(body);
56473
56474                 var editor = body.selectAll('.note-editor')
56475                     .data([0]);
56476
56477                 editor.enter()
56478                     .append('div')
56479                     .attr('class', 'modal-section note-editor')
56480                     .merge(editor)
56481                     .call(noteHeader.note(_note))
56482                     .call(quickLinks.choices(choices))
56483                     .call(noteComments.note(_note))
56484                     .call(noteSaveSection);
56485
56486
56487                 var footer = selection.selectAll('.footer')
56488                     .data([0]);
56489
56490                 footer.enter()
56491                     .append('div')
56492                     .attr('class', 'footer')
56493                     .merge(footer)
56494                     .call(uiViewOnOSM(context).what(_note))
56495                     .call(uiNoteReport().note(_note));
56496
56497
56498                 // rerender the note editor on any auth change
56499                 var osm = services$1.osm;
56500                 if (osm) {
56501                     osm.on('change.note-save', function() {
56502                         selection.call(noteEditor);
56503                     });
56504                 }
56505             }
56506
56507
56508             function noteSaveSection(selection) {
56509                 var isSelected = (_note && _note.id === context.selectedNoteID());
56510                 var noteSave = selection.selectAll('.note-save')
56511                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56512
56513                 // exit
56514                 noteSave.exit()
56515                     .remove();
56516
56517                 // enter
56518                 var noteSaveEnter = noteSave.enter()
56519                     .append('div')
56520                     .attr('class', 'note-save save-section cf');
56521
56522                 // // if new note, show categories to pick from
56523                 // if (_note.isNew()) {
56524                 //     var presets = context.presets();
56525
56526                 //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
56527                 //     _fieldsArr = [
56528                 //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
56529                 //     ];
56530
56531                 //     _fieldsArr.forEach(function(field) {
56532                 //         field
56533                 //             .on('change', changeCategory);
56534                 //     });
56535
56536                 //     noteSaveEnter
56537                 //         .append('div')
56538                 //         .attr('class', 'note-category')
56539                 //         .call(formFields.fieldsArr(_fieldsArr));
56540                 // }
56541
56542                 // function changeCategory() {
56543                 //     // NOTE: perhaps there is a better way to get value
56544                 //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
56545
56546                 //     // store the unsaved category with the note itself
56547                 //     _note = _note.update({ newCategory: val });
56548                 //     var osm = services.osm;
56549                 //     if (osm) {
56550                 //         osm.replaceNote(_note);  // update note cache
56551                 //     }
56552                 //     noteSave
56553                 //         .call(noteSaveButtons);
56554                 // }
56555
56556                 noteSaveEnter
56557                     .append('h4')
56558                     .attr('class', '.note-save-header')
56559                     .text(function() {
56560                         return _note.isNew() ? t('note.newDescription') : t('note.newComment');
56561                     });
56562
56563                 noteSaveEnter
56564                     .append('textarea')
56565                     .attr('class', 'new-comment-input')
56566                     .attr('placeholder', t('note.inputPlaceholder'))
56567                     .attr('maxlength', 1000)
56568                     .property('value', function(d) { return d.newComment; })
56569                     .call(utilNoAuto)
56570                     .on('keydown.note-input', keydown)
56571                     .on('input.note-input', changeInput)
56572                     .on('blur.note-input', changeInput);
56573
56574                 // update
56575                 noteSave = noteSaveEnter
56576                     .merge(noteSave)
56577                     .call(userDetails)
56578                     .call(noteSaveButtons);
56579
56580
56581                 // fast submit if user presses cmd+enter
56582                 function keydown() {
56583                     if (!(event.keyCode === 13 && event.metaKey)) return;
56584
56585                     var osm = services$1.osm;
56586                     if (!osm) return;
56587
56588                     var hasAuth = osm.authenticated();
56589                     if (!hasAuth) return;
56590
56591                     if (!_note.newComment) return;
56592
56593                     event.preventDefault();
56594
56595                     d3_select(this)
56596                         .on('keydown.note-input', null);
56597
56598                     // focus on button and submit
56599                     window.setTimeout(function() {
56600                         if (_note.isNew()) {
56601                             noteSave.selectAll('.save-button').node().focus();
56602                             clickSave(_note);
56603                         } else  {
56604                             noteSave.selectAll('.comment-button').node().focus();
56605                             clickComment(_note);
56606                         }
56607                     }, 10);
56608                 }
56609
56610
56611                 function changeInput() {
56612                     var input = d3_select(this);
56613                     var val = input.property('value').trim() || undefined;
56614
56615                     // store the unsaved comment with the note itself
56616                     _note = _note.update({ newComment: val });
56617
56618                     var osm = services$1.osm;
56619                     if (osm) {
56620                         osm.replaceNote(_note);  // update note cache
56621                     }
56622
56623                     noteSave
56624                         .call(noteSaveButtons);
56625                 }
56626             }
56627
56628
56629             function userDetails(selection) {
56630                 var detailSection = selection.selectAll('.detail-section')
56631                     .data([0]);
56632
56633                 detailSection = detailSection.enter()
56634                     .append('div')
56635                     .attr('class', 'detail-section')
56636                     .merge(detailSection);
56637
56638                 var osm = services$1.osm;
56639                 if (!osm) return;
56640
56641                 // Add warning if user is not logged in
56642                 var hasAuth = osm.authenticated();
56643                 var authWarning = detailSection.selectAll('.auth-warning')
56644                     .data(hasAuth ? [] : [0]);
56645
56646                 authWarning.exit()
56647                     .transition()
56648                     .duration(200)
56649                     .style('opacity', 0)
56650                     .remove();
56651
56652                 var authEnter = authWarning.enter()
56653                     .insert('div', '.tag-reference-body')
56654                     .attr('class', 'field-warning auth-warning')
56655                     .style('opacity', 0);
56656
56657                 authEnter
56658                     .call(svgIcon('#iD-icon-alert', 'inline'));
56659
56660                 authEnter
56661                     .append('span')
56662                     .text(t('note.login'));
56663
56664                 authEnter
56665                     .append('a')
56666                     .attr('target', '_blank')
56667                     .call(svgIcon('#iD-icon-out-link', 'inline'))
56668                     .append('span')
56669                     .text(t('login'))
56670                     .on('click.note-login', function() {
56671                         event.preventDefault();
56672                         osm.authenticate();
56673                     });
56674
56675                 authEnter
56676                     .transition()
56677                     .duration(200)
56678                     .style('opacity', 1);
56679
56680
56681                 var prose = detailSection.selectAll('.note-save-prose')
56682                     .data(hasAuth ? [0] : []);
56683
56684                 prose.exit()
56685                     .remove();
56686
56687                 prose = prose.enter()
56688                     .append('p')
56689                     .attr('class', 'note-save-prose')
56690                     .text(t('note.upload_explanation'))
56691                     .merge(prose);
56692
56693                 osm.userDetails(function(err, user) {
56694                     if (err) return;
56695
56696                     var userLink = d3_select(document.createElement('div'));
56697
56698                     if (user.image_url) {
56699                         userLink
56700                             .append('img')
56701                             .attr('src', user.image_url)
56702                             .attr('class', 'icon pre-text user-icon');
56703                     }
56704
56705                     userLink
56706                         .append('a')
56707                         .attr('class', 'user-info')
56708                         .text(user.display_name)
56709                         .attr('href', osm.userURL(user.display_name))
56710                         .attr('tabindex', -1)
56711                         .attr('target', '_blank');
56712
56713                     prose
56714                         .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
56715                 });
56716             }
56717
56718
56719             function noteSaveButtons(selection) {
56720                 var osm = services$1.osm;
56721                 var hasAuth = osm && osm.authenticated();
56722
56723                 var isSelected = (_note && _note.id === context.selectedNoteID());
56724                 var buttonSection = selection.selectAll('.buttons')
56725                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56726
56727                 // exit
56728                 buttonSection.exit()
56729                     .remove();
56730
56731                 // enter
56732                 var buttonEnter = buttonSection.enter()
56733                     .append('div')
56734                     .attr('class', 'buttons');
56735
56736                 if (_note.isNew()) {
56737                     buttonEnter
56738                         .append('button')
56739                         .attr('class', 'button cancel-button secondary-action')
56740                         .text(t('confirm.cancel'));
56741
56742                     buttonEnter
56743                         .append('button')
56744                         .attr('class', 'button save-button action')
56745                         .text(t('note.save'));
56746
56747                 } else {
56748                     buttonEnter
56749                         .append('button')
56750                         .attr('class', 'button status-button action');
56751
56752                     buttonEnter
56753                         .append('button')
56754                         .attr('class', 'button comment-button action')
56755                         .text(t('note.comment'));
56756                 }
56757
56758
56759                 // update
56760                 buttonSection = buttonSection
56761                     .merge(buttonEnter);
56762
56763                 buttonSection.select('.cancel-button')   // select and propagate data
56764                     .on('click.cancel', clickCancel);
56765
56766                 buttonSection.select('.save-button')     // select and propagate data
56767                     .attr('disabled', isSaveDisabled)
56768                     .on('click.save', clickSave);
56769
56770                 buttonSection.select('.status-button')   // select and propagate data
56771                     .attr('disabled', (hasAuth ? null : true))
56772                     .text(function(d) {
56773                         var action = (d.status === 'open' ? 'close' : 'open');
56774                         var andComment = (d.newComment ? '_comment' : '');
56775                         return t('note.' + action + andComment);
56776                     })
56777                     .on('click.status', clickStatus);
56778
56779                 buttonSection.select('.comment-button')   // select and propagate data
56780                     .attr('disabled', isSaveDisabled)
56781                     .on('click.comment', clickComment);
56782
56783
56784                 function isSaveDisabled(d) {
56785                     return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
56786                 }
56787             }
56788
56789
56790
56791             function clickCancel(d) {
56792                 this.blur();    // avoid keeping focus on the button - #4641
56793                 var osm = services$1.osm;
56794                 if (osm) {
56795                     osm.removeNote(d);
56796                 }
56797                 context.enter(modeBrowse(context));
56798                 dispatch$1.call('change');
56799             }
56800
56801
56802             function clickSave(d) {
56803                 this.blur();    // avoid keeping focus on the button - #4641
56804                 var osm = services$1.osm;
56805                 if (osm) {
56806                     osm.postNoteCreate(d, function(err, note) {
56807                         dispatch$1.call('change', note);
56808                     });
56809                 }
56810             }
56811
56812
56813             function clickStatus(d) {
56814                 this.blur();    // avoid keeping focus on the button - #4641
56815                 var osm = services$1.osm;
56816                 if (osm) {
56817                     var setStatus = (d.status === 'open' ? 'closed' : 'open');
56818                     osm.postNoteUpdate(d, setStatus, function(err, note) {
56819                         dispatch$1.call('change', note);
56820                     });
56821                 }
56822             }
56823
56824             function clickComment(d) {
56825                 this.blur();    // avoid keeping focus on the button - #4641
56826                 var osm = services$1.osm;
56827                 if (osm) {
56828                     osm.postNoteUpdate(d, d.status, function(err, note) {
56829                         dispatch$1.call('change', note);
56830                     });
56831                 }
56832             }
56833
56834
56835             noteEditor.note = function(val) {
56836                 if (!arguments.length) return _note;
56837                 _note = val;
56838                 return noteEditor;
56839             };
56840
56841
56842             return utilRebind(noteEditor, dispatch$1, 'on');
56843         }
56844
56845         function modeSelectNote(context, selectedNoteID) {
56846             var mode = {
56847                 id: 'select-note',
56848                 button: 'browse'
56849             };
56850
56851             var osm = services$1.osm;
56852             var keybinding = utilKeybinding('select-note');
56853             var noteEditor = uiNoteEditor(context)
56854                 .on('change', function() {
56855                     context.map().pan([0,0]);  // trigger a redraw
56856                     var note = checkSelectedID();
56857                     if (!note) return;
56858                     context.ui().sidebar
56859                         .show(noteEditor.note(note));
56860                 });
56861
56862             var behaviors = [
56863                 behaviorBreathe(),
56864                 behaviorHover(context),
56865                 behaviorSelect(context),
56866                 behaviorLasso(context),
56867                 modeDragNode(context).behavior,
56868                 modeDragNote(context).behavior
56869             ];
56870
56871             var newFeature = false;
56872
56873
56874             function checkSelectedID() {
56875                 if (!osm) return;
56876                 var note = osm.getNote(selectedNoteID);
56877                 if (!note) {
56878                     context.enter(modeBrowse(context));
56879                 }
56880                 return note;
56881             }
56882
56883
56884             // class the note as selected, or return to browse mode if the note is gone
56885             function selectNote(drawn) {
56886                 if (!checkSelectedID()) return;
56887
56888                 var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
56889
56890                 if (selection.empty()) {
56891                     // Return to browse mode if selected DOM elements have
56892                     // disappeared because the user moved them out of view..
56893                     var source = event && event.type === 'zoom' && event.sourceEvent;
56894                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
56895                         context.enter(modeBrowse(context));
56896                     }
56897
56898                 } else {
56899                     selection
56900                         .classed('selected', true);
56901
56902                     context.selectedNoteID(selectedNoteID);
56903                 }
56904             }
56905
56906
56907             function esc() {
56908                 if (d3_select('.combobox').size()) return;
56909                 context.enter(modeBrowse(context));
56910             }
56911
56912
56913             mode.zoomToSelected = function() {
56914                 if (!osm) return;
56915                 var note = osm.getNote(selectedNoteID);
56916                 if (note) {
56917                     context.map().centerZoomEase(note.loc, 20);
56918                 }
56919             };
56920
56921
56922             mode.newFeature = function(val) {
56923                 if (!arguments.length) return newFeature;
56924                 newFeature = val;
56925                 return mode;
56926             };
56927
56928
56929             mode.enter = function() {
56930                 var note = checkSelectedID();
56931                 if (!note) return;
56932
56933                 behaviors.forEach(context.install);
56934
56935                 keybinding
56936                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
56937                     .on('⎋', esc, true);
56938
56939                 d3_select(document)
56940                     .call(keybinding);
56941
56942                 selectNote();
56943
56944                 var sidebar = context.ui().sidebar;
56945                 sidebar.show(noteEditor.note(note));
56946
56947                 // expand the sidebar, avoid obscuring the note if needed
56948                 sidebar.expand(sidebar.intersects(note.extent()));
56949
56950                 context.map()
56951                     .on('drawn.select', selectNote);
56952             };
56953
56954
56955             mode.exit = function() {
56956                 behaviors.forEach(context.uninstall);
56957
56958                 d3_select(document)
56959                     .call(keybinding.unbind);
56960
56961                 context.surface()
56962                     .selectAll('.layer-notes .selected')
56963                     .classed('selected hover', false);
56964
56965                 context.map()
56966                     .on('drawn.select', null);
56967
56968                 context.ui().sidebar
56969                     .hide();
56970
56971                 context.selectedNoteID(null);
56972             };
56973
56974
56975             return mode;
56976         }
56977
56978         function modeDragNote(context) {
56979             var mode = {
56980                 id: 'drag-note',
56981                 button: 'browse'
56982             };
56983
56984             var edit = behaviorEdit(context);
56985
56986             var _nudgeInterval;
56987             var _lastLoc;
56988             var _note;    // most current note.. dragged note may have stale datum.
56989
56990
56991             function startNudge(nudge) {
56992                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
56993                 _nudgeInterval = window.setInterval(function() {
56994                     context.pan(nudge);
56995                     doMove(nudge);
56996                 }, 50);
56997             }
56998
56999
57000             function stopNudge() {
57001                 if (_nudgeInterval) {
57002                     window.clearInterval(_nudgeInterval);
57003                     _nudgeInterval = null;
57004                 }
57005             }
57006
57007
57008             function origin(note) {
57009                 return context.projection(note.loc);
57010             }
57011
57012
57013             function start(note) {
57014                 _note = note;
57015                 var osm = services$1.osm;
57016                 if (osm) {
57017                     // Get latest note from cache.. The marker may have a stale datum bound to it
57018                     // and dragging it around can sometimes delete the users note comment.
57019                     _note = osm.getNote(_note.id);
57020                 }
57021
57022                 context.surface().selectAll('.note-' + _note.id)
57023                     .classed('active', true);
57024
57025                 context.perform(actionNoop());
57026                 context.enter(mode);
57027                 context.selectedNoteID(_note.id);
57028             }
57029
57030
57031             function move() {
57032                 event.sourceEvent.stopPropagation();
57033                 _lastLoc = context.projection.invert(event.point);
57034
57035                 doMove();
57036                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
57037                 if (nudge) {
57038                     startNudge(nudge);
57039                 } else {
57040                     stopNudge();
57041                 }
57042             }
57043
57044
57045             function doMove(nudge) {
57046                 nudge = nudge || [0, 0];
57047
57048                 var currPoint = (event && event.point) || context.projection(_lastLoc);
57049                 var currMouse = geoVecSubtract(currPoint, nudge);
57050                 var loc = context.projection.invert(currMouse);
57051
57052                 _note = _note.move(loc);
57053
57054                 var osm = services$1.osm;
57055                 if (osm) {
57056                     osm.replaceNote(_note);  // update note cache
57057                 }
57058
57059                 context.replace(actionNoop());   // trigger redraw
57060             }
57061
57062
57063             function end() {
57064                 context.replace(actionNoop());   // trigger redraw
57065
57066                 context
57067                     .selectedNoteID(_note.id)
57068                     .enter(modeSelectNote(context, _note.id));
57069             }
57070
57071
57072             var drag = behaviorDrag()
57073                 .selector('.layer-touch.markers .target.note.new')
57074                 .surface(d3_select('#map').node())
57075                 .origin(origin)
57076                 .on('start', start)
57077                 .on('move', move)
57078                 .on('end', end);
57079
57080
57081             mode.enter = function() {
57082                 context.install(edit);
57083             };
57084
57085
57086             mode.exit = function() {
57087                 context.ui().sidebar.hover.cancel();
57088                 context.uninstall(edit);
57089
57090                 context.surface()
57091                     .selectAll('.active')
57092                     .classed('active', false);
57093
57094                 stopNudge();
57095             };
57096
57097             mode.behavior = drag;
57098
57099             return mode;
57100         }
57101
57102         function uiDataHeader() {
57103             var _datum;
57104
57105
57106             function dataHeader(selection) {
57107                 var header = selection.selectAll('.data-header')
57108                     .data(
57109                         (_datum ? [_datum] : []),
57110                         function(d) { return d.__featurehash__; }
57111                     );
57112
57113                 header.exit()
57114                     .remove();
57115
57116                 var headerEnter = header.enter()
57117                     .append('div')
57118                     .attr('class', 'data-header');
57119
57120                 var iconEnter = headerEnter
57121                     .append('div')
57122                     .attr('class', 'data-header-icon');
57123
57124                 iconEnter
57125                     .append('div')
57126                     .attr('class', 'preset-icon-28')
57127                     .call(svgIcon('#iD-icon-data', 'note-fill'));
57128
57129                 headerEnter
57130                     .append('div')
57131                     .attr('class', 'data-header-label')
57132                     .text(t('map_data.layers.custom.title'));
57133             }
57134
57135
57136             dataHeader.datum = function(val) {
57137                 if (!arguments.length) return _datum;
57138                 _datum = val;
57139                 return this;
57140             };
57141
57142
57143             return dataHeader;
57144         }
57145
57146         // This code assumes that the combobox values will not have duplicate entries.
57147         // It is keyed on the `value` of the entry. Data should be an array of objects like:
57148         //   [{
57149         //       value:  'display text',  // required
57150         //       title:  'hover text'     // optional
57151         //   }, ...]
57152
57153         var _comboHideTimerID;
57154
57155         function uiCombobox(context, klass) {
57156             var dispatch$1 = dispatch('accept', 'cancel');
57157             var container = context.container();
57158
57159             var _suggestions = [];
57160             var _data = [];
57161             var _fetched = {};
57162             var _selected = null;
57163             var _canAutocomplete = true;
57164             var _caseSensitive = false;
57165             var _cancelFetch = false;
57166             var _minItems = 2;
57167             var _tDown = 0;
57168
57169             var _fetcher = function(val, cb) {
57170                 cb(_data.filter(function(d) {
57171                     return d.value
57172                         .toString()
57173                         .toLowerCase()
57174                         .indexOf(val.toLowerCase()) !== -1;
57175                 }));
57176             };
57177
57178             var combobox = function(input, attachTo) {
57179                 if (!input || input.empty()) return;
57180
57181                 input
57182                     .classed('combobox-input', true)
57183                     .on('focus.combo-input', focus)
57184                     .on('blur.combo-input', blur)
57185                     .on('keydown.combo-input', keydown)
57186                     .on('keyup.combo-input', keyup)
57187                     .on('input.combo-input', change)
57188                     .on('mousedown.combo-input', mousedown)
57189                     .each(function() {
57190                         var parent = this.parentNode;
57191                         var sibling = this.nextSibling;
57192
57193                         d3_select(parent).selectAll('.combobox-caret')
57194                             .filter(function(d) { return d === input.node(); })
57195                             .data([input.node()])
57196                             .enter()
57197                             .insert('div', function() { return sibling; })
57198                             .attr('class', 'combobox-caret')
57199                             .on('mousedown.combo-caret', function() {
57200                                 event.preventDefault(); // don't steal focus from input
57201                                 input.node().focus(); // focus the input as if it was clicked
57202                                 mousedown();
57203                             })
57204                             .on('mouseup.combo-caret', function() {
57205                                 event.preventDefault(); // don't steal focus from input
57206                                 mouseup();
57207                             });
57208                     });
57209
57210
57211                 function mousedown() {
57212                     if (event.button !== 0) return;    // left click only
57213                     _tDown = +new Date();
57214
57215                     // clear selection
57216                     var start = input.property('selectionStart');
57217                     var end = input.property('selectionEnd');
57218                     if (start !== end) {
57219                         var val = utilGetSetValue(input);
57220                         input.node().setSelectionRange(val.length, val.length);
57221                         return;
57222                     }
57223
57224                     input.on('mouseup.combo-input', mouseup);
57225                 }
57226
57227
57228                 function mouseup() {
57229                     input.on('mouseup.combo-input', null);
57230                     if (event.button !== 0) return;    // left click only
57231                     if (input.node() !== document.activeElement) return;   // exit if this input is not focused
57232
57233                     var start = input.property('selectionStart');
57234                     var end = input.property('selectionEnd');
57235                     if (start !== end) return;  // exit if user is selecting
57236
57237                     // not showing or showing for a different field - try to show it.
57238                     var combo = container.selectAll('.combobox');
57239                     if (combo.empty() || combo.datum() !== input.node()) {
57240                         var tOrig = _tDown;
57241                         window.setTimeout(function() {
57242                             if (tOrig !== _tDown) return;   // exit if user double clicked
57243                             fetchComboData('', function() {
57244                                 show();
57245                                 render();
57246                             });
57247                         }, 250);
57248
57249                     } else {
57250                         hide();
57251                     }
57252                 }
57253
57254
57255                 function focus() {
57256                     fetchComboData('');   // prefetch values (may warm taginfo cache)
57257                 }
57258
57259
57260                 function blur() {
57261                     _comboHideTimerID = window.setTimeout(hide, 75);
57262                 }
57263
57264
57265                 function show() {
57266                     hide();   // remove any existing
57267
57268                     container
57269                         .insert('div', ':first-child')
57270                         .datum(input.node())
57271                         .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
57272                         .style('position', 'absolute')
57273                         .style('display', 'block')
57274                         .style('left', '0px')
57275                         .on('mousedown.combo-container', function () {
57276                             // prevent moving focus out of the input field
57277                             event.preventDefault();
57278                         });
57279
57280                     d3_select('body')
57281                         .on('scroll.combo-scroll', render, true);
57282                 }
57283
57284
57285                 function hide() {
57286                     if (_comboHideTimerID) {
57287                         window.clearTimeout(_comboHideTimerID);
57288                         _comboHideTimerID = undefined;
57289                     }
57290
57291                     container.selectAll('.combobox')
57292                         .remove();
57293
57294                     d3_select('body')
57295                         .on('scroll.combo-scroll', null);
57296                 }
57297
57298
57299                 function keydown() {
57300                     var shown = !container.selectAll('.combobox').empty();
57301                     var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
57302
57303                     switch (event.keyCode) {
57304                         case 8:   // ⌫ Backspace
57305                         case 46:  // ⌦ Delete
57306                             event.stopPropagation();
57307                             _selected = null;
57308                             render();
57309                             input.on('input.combo-input', function() {
57310                                 var start = input.property('selectionStart');
57311                                 input.node().setSelectionRange(start, start);
57312                                 input.on('input.combo-input', change);
57313                             });
57314                             break;
57315
57316                         case 9:   // ⇥ Tab
57317                             accept();
57318                             break;
57319
57320                         case 13:  // ↩ Return
57321                             event.preventDefault();
57322                             event.stopPropagation();
57323                             break;
57324
57325                         case 38:  // ↑ Up arrow
57326                             if (tagName === 'textarea' && !shown) return;
57327                             event.preventDefault();
57328                             if (tagName === 'input' && !shown) {
57329                                 show();
57330                             }
57331                             nav(-1);
57332                             break;
57333
57334                         case 40:  // ↓ Down arrow
57335                             if (tagName === 'textarea' && !shown) return;
57336                             event.preventDefault();
57337                             if (tagName === 'input' && !shown) {
57338                                 show();
57339                             }
57340                             nav(+1);
57341                             break;
57342                     }
57343                 }
57344
57345
57346                 function keyup() {
57347                     switch (event.keyCode) {
57348                         case 27:  // ⎋ Escape
57349                             cancel();
57350                             break;
57351
57352                         case 13:  // ↩ Return
57353                             accept();
57354                             break;
57355                     }
57356                 }
57357
57358
57359                 // Called whenever the input value is changed (e.g. on typing)
57360                 function change() {
57361                     fetchComboData(value(), function() {
57362                         _selected = null;
57363                         var val = input.property('value');
57364
57365                         if (_suggestions.length) {
57366                             if (input.property('selectionEnd') === val.length) {
57367                                 _selected = tryAutocomplete();
57368                             }
57369
57370                             if (!_selected) {
57371                                 _selected = val;
57372                             }
57373                         }
57374
57375                         if (val.length) {
57376                             var combo = container.selectAll('.combobox');
57377                             if (combo.empty()) {
57378                                 show();
57379                             }
57380                         } else {
57381                             hide();
57382                         }
57383
57384                         render();
57385                     });
57386                 }
57387
57388
57389                 // Called when the user presses up/down arrows to navigate the list
57390                 function nav(dir) {
57391                     if (_suggestions.length) {
57392                         // try to determine previously selected index..
57393                         var index = -1;
57394                         for (var i = 0; i < _suggestions.length; i++) {
57395                             if (_selected && _suggestions[i].value === _selected) {
57396                                 index = i;
57397                                 break;
57398                             }
57399                         }
57400
57401                         // pick new _selected
57402                         index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
57403                         _selected = _suggestions[index].value;
57404                         input.property('value', _selected);
57405                     }
57406
57407                     render();
57408                     ensureVisible();
57409                 }
57410
57411
57412                 function ensureVisible() {
57413                     var combo = container.selectAll('.combobox');
57414                     if (combo.empty()) return;
57415
57416                     var containerRect = container.node().getBoundingClientRect();
57417                     var comboRect = combo.node().getBoundingClientRect();
57418
57419                     if (comboRect.bottom > containerRect.bottom) {
57420                         var node = attachTo ? attachTo.node() : input.node();
57421                         node.scrollIntoView({ behavior: 'instant', block: 'center' });
57422                         render();
57423                     }
57424
57425                     // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
57426                     var selected = combo.selectAll('.combobox-option.selected').node();
57427                     if (selected) {
57428                         selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
57429                     }
57430                 }
57431
57432
57433                 function value() {
57434                     var value = input.property('value');
57435                     var start = input.property('selectionStart');
57436                     var end = input.property('selectionEnd');
57437
57438                     if (start && end) {
57439                         value = value.substring(0, start);
57440                     }
57441
57442                     return value;
57443                 }
57444
57445
57446                 function fetchComboData(v, cb) {
57447                     _cancelFetch = false;
57448
57449                     _fetcher.call(input, v, function(results) {
57450                         // already chose a value, don't overwrite or autocomplete it
57451                         if (_cancelFetch) return;
57452
57453                         _suggestions = results;
57454                         results.forEach(function(d) { _fetched[d.value] = d; });
57455
57456                         if (cb) {
57457                             cb();
57458                         }
57459                     });
57460                 }
57461
57462
57463                 function tryAutocomplete() {
57464                     if (!_canAutocomplete) return;
57465
57466                     var val = _caseSensitive ? value() : value().toLowerCase();
57467                     if (!val) return;
57468
57469                     // Don't autocomplete if user is typing a number - #4935
57470                     if (!isNaN(parseFloat(val)) && isFinite(val)) return;
57471
57472                     var bestIndex = -1;
57473                     for (var i = 0; i < _suggestions.length; i++) {
57474                         var suggestion = _suggestions[i].value;
57475                         var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
57476
57477                         // if search string matches suggestion exactly, pick it..
57478                         if (compare === val) {
57479                             bestIndex = i;
57480                             break;
57481
57482                         // otherwise lock in the first result that starts with the search string..
57483                         } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
57484                             bestIndex = i;
57485                         }
57486                     }
57487
57488                     if (bestIndex !== -1) {
57489                         var bestVal = _suggestions[bestIndex].value;
57490                         input.property('value', bestVal);
57491                         input.node().setSelectionRange(val.length, bestVal.length);
57492                         return bestVal;
57493                     }
57494                 }
57495
57496
57497                 function render() {
57498                     if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
57499                         hide();
57500                         return;
57501                     }
57502
57503                     var shown = !container.selectAll('.combobox').empty();
57504                     if (!shown) return;
57505
57506                     var combo = container.selectAll('.combobox');
57507                     var options = combo.selectAll('.combobox-option')
57508                         .data(_suggestions, function(d) { return d.value; });
57509
57510                     options.exit()
57511                         .remove();
57512
57513                     // enter/update
57514                     options.enter()
57515                         .append('a')
57516                         .attr('class', 'combobox-option')
57517                         .attr('title', function(d) { return d.title; })
57518                         .text(function(d) { return d.display || d.value; })
57519                         .merge(options)
57520                         .classed('selected', function(d) { return d.value === _selected; })
57521                         .on('click.combo-option', accept)
57522                         .order();
57523
57524                     var node = attachTo ? attachTo.node() : input.node();
57525                     var rect = node.getBoundingClientRect();
57526
57527                     combo
57528                         .style('left', (rect.left + 5) + 'px')
57529                         .style('width', (rect.width - 10) + 'px')
57530                         .style('top', rect.height + rect.top + 'px');
57531                 }
57532
57533
57534                 // Dispatches an 'accept' event
57535                 // Then hides the combobox.
57536                 function accept(d) {
57537                     _cancelFetch = true;
57538                     var thiz = input.node();
57539
57540                     if (d) {   // user clicked on a suggestion
57541                         utilGetSetValue(input, d.value);    // replace field contents
57542                         utilTriggerEvent(input, 'change');
57543                     }
57544
57545                     // clear (and keep) selection
57546                     var val = utilGetSetValue(input);
57547                     thiz.setSelectionRange(val.length, val.length);
57548
57549                     d = _fetched[val];
57550                     dispatch$1.call('accept', thiz, d, val);
57551                     hide();
57552                 }
57553
57554
57555                 // Dispatches an 'cancel' event
57556                 // Then hides the combobox.
57557                 function cancel() {
57558                     _cancelFetch = true;
57559                     var thiz = input.node();
57560
57561                     // clear (and remove) selection, and replace field contents
57562                     var val = utilGetSetValue(input);
57563                     var start = input.property('selectionStart');
57564                     var end = input.property('selectionEnd');
57565                     val = val.slice(0, start) + val.slice(end);
57566                     utilGetSetValue(input, val);
57567                     thiz.setSelectionRange(val.length, val.length);
57568
57569                     dispatch$1.call('cancel', thiz);
57570                     hide();
57571                 }
57572
57573             };
57574
57575
57576             combobox.canAutocomplete = function(val) {
57577                 if (!arguments.length) return _canAutocomplete;
57578                 _canAutocomplete = val;
57579                 return combobox;
57580             };
57581
57582             combobox.caseSensitive = function(val) {
57583                 if (!arguments.length) return _caseSensitive;
57584                 _caseSensitive = val;
57585                 return combobox;
57586             };
57587
57588             combobox.data = function(val) {
57589                 if (!arguments.length) return _data;
57590                 _data = val;
57591                 return combobox;
57592             };
57593
57594             combobox.fetcher = function(val) {
57595                 if (!arguments.length) return _fetcher;
57596                 _fetcher = val;
57597                 return combobox;
57598             };
57599
57600             combobox.minItems = function(val) {
57601                 if (!arguments.length) return _minItems;
57602                 _minItems = val;
57603                 return combobox;
57604             };
57605
57606
57607             return utilRebind(combobox, dispatch$1, 'on');
57608         }
57609
57610
57611         uiCombobox.off = function(input) {
57612             input
57613                 .on('focus.combo-input', null)
57614                 .on('blur.combo-input', null)
57615                 .on('keydown.combo-input', null)
57616                 .on('keyup.combo-input', null)
57617                 .on('input.combo-input', null)
57618                 .on('mousedown.combo-input', null)
57619                 .on('mouseup.combo-input', null);
57620
57621
57622             d3_select('body')
57623                 .on('scroll.combo-scroll', null);
57624         };
57625
57626         // toggles the visibility of ui elements, using a combination of the
57627         // hide class, which sets display=none, and a d3 transition for opacity.
57628         // this will cause blinking when called repeatedly, so check that the
57629         // value actually changes between calls.
57630         function uiToggle(show, callback) {
57631             return function(selection) {
57632                 selection
57633                     .style('opacity', show ? 0 : 1)
57634                     .classed('hide', false)
57635                     .transition()
57636                     .style('opacity', show ? 1 : 0)
57637                     .on('end', function() {
57638                         d3_select(this)
57639                             .classed('hide', !show)
57640                             .style('opacity', null);
57641                         if (callback) callback.apply(this);
57642                     });
57643             };
57644         }
57645
57646         function uiDisclosure(context, key, expandedDefault) {
57647             var dispatch$1 = dispatch('toggled');
57648             var _preference = (context.storage('disclosure.' + key + '.expanded'));
57649             var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57650             var _title;
57651             var _updatePreference = true;
57652             var _content = function () {};
57653
57654
57655             var disclosure = function(selection) {
57656                 var hideToggle = selection.selectAll('.hide-toggle-' + key)
57657                     .data([0]);
57658
57659                 // enter
57660                 var hideToggleEnter = hideToggle.enter()
57661                     .append('a')
57662                     .attr('href', '#')
57663                     .attr('class', 'hide-toggle hide-toggle-' + key)
57664                     .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57665
57666                 hideToggleEnter
57667                     .append('span')
57668                     .attr('class', 'hide-toggle-text');
57669
57670                 // update
57671                 hideToggle = hideToggleEnter
57672                     .merge(hideToggle);
57673
57674                 hideToggle
57675                     .on('click', toggle)
57676                     .classed('expanded', _expanded);
57677
57678                 hideToggle.selectAll('.hide-toggle-text')
57679                     .text(_title);
57680
57681                 hideToggle.selectAll('.hide-toggle-icon')
57682                     .attr('xlink:href', _expanded ? '#iD-icon-down'
57683                         : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57684                     );
57685
57686
57687                 var wrap = selection.selectAll('.disclosure-wrap')
57688                     .data([0]);
57689
57690                 // enter/update
57691                 wrap = wrap.enter()
57692                     .append('div')
57693                     .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57694                     .merge(wrap)
57695                     .classed('hide', !_expanded);
57696
57697                 if (_expanded) {
57698                     wrap
57699                         .call(_content);
57700                 }
57701
57702
57703                 function toggle() {
57704                     event.preventDefault();
57705
57706                     _expanded = !_expanded;
57707
57708                     if (_updatePreference) {
57709                         context.storage('disclosure.' + key + '.expanded', _expanded);
57710                     }
57711
57712                     hideToggle
57713                         .classed('expanded', _expanded);
57714
57715                     hideToggle.selectAll('.hide-toggle-icon')
57716                         .attr('xlink:href', _expanded ? '#iD-icon-down'
57717                             : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57718                         );
57719
57720                     wrap
57721                         .call(uiToggle(_expanded));
57722
57723                     if (_expanded) {
57724                         wrap
57725                             .call(_content);
57726                     }
57727
57728                     dispatch$1.call('toggled', this, _expanded);
57729                 }
57730             };
57731
57732
57733             disclosure.title = function(val) {
57734                 if (!arguments.length) return _title;
57735                 _title = val;
57736                 return disclosure;
57737             };
57738
57739
57740             disclosure.expanded = function(val) {
57741                 if (!arguments.length) return _expanded;
57742                 _expanded = val;
57743                 return disclosure;
57744             };
57745
57746
57747             disclosure.updatePreference = function(val) {
57748                 if (!arguments.length) return _updatePreference;
57749                 _updatePreference = val;
57750                 return disclosure;
57751             };
57752
57753
57754             disclosure.content = function(val) {
57755                 if (!arguments.length) return _content;
57756                 _content = val;
57757                 return disclosure;
57758             };
57759
57760
57761             return utilRebind(disclosure, dispatch$1, 'on');
57762         }
57763
57764         // Pass `which` object of the form:
57765         // {
57766         //   key: 'string',     // required
57767         //   value: 'string'    // optional
57768         // }
57769         //   -or-
57770         // {
57771         //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
57772         // }
57773         //   -or-
57774         // {
57775         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
57776         // }
57777         //
57778         function uiTagReference(what) {
57779             var wikibase = what.qid ? services$1.wikidata : services$1.osmWikibase;
57780             var tagReference = {};
57781
57782             var _button = d3_select(null);
57783             var _body = d3_select(null);
57784             var _loaded;
57785             var _showing;
57786
57787
57788             function load() {
57789                 if (!wikibase) return;
57790
57791                 _button
57792                     .classed('tag-reference-loading', true);
57793
57794                 wikibase.getDocs(what, gotDocs);
57795             }
57796
57797
57798             function gotDocs(err, docs) {
57799                 _body.html('');
57800
57801                 if (!docs || !docs.title) {
57802                     _body
57803                         .append('p')
57804                         .attr('class', 'tag-reference-description')
57805                         .text(t('inspector.no_documentation_key'));
57806                     done();
57807                     return;
57808                 }
57809
57810                 if (docs.imageURL) {
57811                     _body
57812                         .append('img')
57813                         .attr('class', 'tag-reference-wiki-image')
57814                         .attr('src', docs.imageURL)
57815                         .on('load', function() { done(); })
57816                         .on('error', function() { d3_select(this).remove(); done(); });
57817                 } else {
57818                     done();
57819                 }
57820
57821                 _body
57822                     .append('p')
57823                     .attr('class', 'tag-reference-description')
57824                     .text(docs.description || t('inspector.no_documentation_key'))
57825                     .append('a')
57826                     .attr('class', 'tag-reference-edit')
57827                     .attr('target', '_blank')
57828                     .attr('tabindex', -1)
57829                     .attr('title', t('inspector.edit_reference'))
57830                     .attr('href', docs.editURL)
57831                     .call(svgIcon('#iD-icon-edit', 'inline'));
57832
57833                 if (docs.wiki) {
57834                     _body
57835                       .append('a')
57836                       .attr('class', 'tag-reference-link')
57837                       .attr('target', '_blank')
57838                       .attr('tabindex', -1)
57839                       .attr('href', docs.wiki.url)
57840                       .call(svgIcon('#iD-icon-out-link', 'inline'))
57841                       .append('span')
57842                       .text(t(docs.wiki.text));
57843                 }
57844
57845                 // Add link to info about "good changeset comments" - #2923
57846                 if (what.key === 'comment') {
57847                     _body
57848                         .append('a')
57849                         .attr('class', 'tag-reference-comment-link')
57850                         .attr('target', '_blank')
57851                         .attr('tabindex', -1)
57852                         .call(svgIcon('#iD-icon-out-link', 'inline'))
57853                         .attr('href', t('commit.about_changeset_comments_link'))
57854                         .append('span')
57855                         .text(t('commit.about_changeset_comments'));
57856                 }
57857             }
57858
57859
57860             function done() {
57861                 _loaded = true;
57862
57863                 _button
57864                     .classed('tag-reference-loading', false);
57865
57866                 _body
57867                     .classed('expanded', true)
57868                     .transition()
57869                     .duration(200)
57870                     .style('max-height', '200px')
57871                     .style('opacity', '1');
57872
57873                 _showing = true;
57874
57875                 _button.selectAll('svg.icon use').each(function() {
57876                     var iconUse = d3_select(this);
57877                     if (iconUse.attr('href') === '#iD-icon-info') {
57878                         iconUse.attr('href', '#iD-icon-info-filled');
57879                     }
57880                 });
57881             }
57882
57883
57884             function hide() {
57885                 _body
57886                     .transition()
57887                     .duration(200)
57888                     .style('max-height', '0px')
57889                     .style('opacity', '0')
57890                     .on('end', function () {
57891                         _body.classed('expanded', false);
57892                     });
57893
57894                 _showing = false;
57895
57896                 _button.selectAll('svg.icon use').each(function() {
57897                     var iconUse = d3_select(this);
57898                     if (iconUse.attr('href') === '#iD-icon-info-filled') {
57899                         iconUse.attr('href', '#iD-icon-info');
57900                     }
57901                 });
57902
57903             }
57904
57905
57906             tagReference.button = function(selection, klass, iconName) {
57907                 _button = selection.selectAll('.tag-reference-button')
57908                     .data([0]);
57909
57910                 _button = _button.enter()
57911                     .append('button')
57912                     .attr('class', 'tag-reference-button ' + klass)
57913                     .attr('title', t('icons.information'))
57914                     .attr('tabindex', -1)
57915                     .call(svgIcon('#iD-icon-' + (iconName || 'inspect')))
57916                     .merge(_button);
57917
57918                 _button
57919                     .on('click', function () {
57920                         event.stopPropagation();
57921                         event.preventDefault();
57922                         this.blur();    // avoid keeping focus on the button - #4641
57923                         if (_showing) {
57924                             hide();
57925                         } else if (_loaded) {
57926                             done();
57927                         } else {
57928                             load();
57929                         }
57930                     });
57931             };
57932
57933
57934             tagReference.body = function(selection) {
57935                 var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
57936                 _body = selection.selectAll('.tag-reference-body')
57937                     .data([itemID], function(d) { return d; });
57938
57939                 _body.exit()
57940                     .remove();
57941
57942                 _body = _body.enter()
57943                     .append('div')
57944                     .attr('class', 'tag-reference-body')
57945                     .style('max-height', '0')
57946                     .style('opacity', '0')
57947                     .merge(_body);
57948
57949                 if (_showing === false) {
57950                     hide();
57951                 }
57952             };
57953
57954
57955             tagReference.showing = function(val) {
57956                 if (!arguments.length) return _showing;
57957                 _showing = val;
57958                 return tagReference;
57959             };
57960
57961
57962             return tagReference;
57963         }
57964
57965         function uiRawTagEditor(context) {
57966             var taginfo = services$1.taginfo;
57967             var dispatch$1 = dispatch('change');
57968             var availableViews = [
57969                 { id: 'text', icon: '#fas-i-cursor' },
57970                 { id: 'list', icon: '#fas-th-list' }
57971             ];
57972
57973             var _tagView = (context.storage('raw-tag-editor-view') || 'list');   // 'list, 'text'
57974             var _readOnlyTags = [];
57975             var _indexedKeys = [];
57976             var _showBlank = false;
57977             var _updatePreference = true;
57978             var _expanded = false;
57979             var _pendingChange = null;
57980             var _state;
57981             var _preset;
57982             var _tags;
57983             var _entityID;
57984
57985
57986             function rawTagEditor(selection) {
57987                 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
57988
57989                 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
57990                     .title(t('inspector.all_tags') + ' (' + count + ')')
57991                     .on('toggled', toggled)
57992                     .updatePreference(_updatePreference)
57993                     .content(content);
57994
57995                 // Sometimes we want to force the raw_tag_editor to be opened/closed..
57996                 // When undefined, uiDisclosure will use the user's stored preference.
57997                 if (_expanded !== undefined) {
57998                     disclosure.expanded(_expanded);
57999                 }
58000
58001                 selection.call(disclosure);
58002
58003                 function toggled(expanded) {
58004                     _expanded = expanded;
58005                     if (expanded) {
58006                         selection.node().parentNode.scrollTop += 200;
58007                     }
58008                 }
58009             }
58010
58011
58012             function content(wrap) {
58013                 // When switching to a different entity or changing the state (hover/select)
58014                 // reorder the keys alphabetically.
58015                 // We trigger this by emptying the `_indexedKeys` array, then it will be rebuilt here.
58016                 // Otherwise leave their order alone - #5857, #5927
58017                 var all = Object.keys(_tags).sort();
58018                 var known = _indexedKeys.map(function(t) { return t.key; });
58019                 var missing = utilArrayDifference(all, known);
58020                 for (var i = 0; i < missing.length; i++) {
58021                     _indexedKeys.push({ index: _indexedKeys.length, key: missing[i] });
58022                 }
58023
58024                 // assemble row data, excluding any deleted tags
58025                 var rowData = _indexedKeys.map(function(row) {
58026                     var v = _tags[row.key];
58027                     return (v === undefined) ? null : Object.assign(row, { value: v });
58028                 }).filter(Boolean);
58029
58030                 // append blank row last, if necessary
58031                 if (!_indexedKeys.length || _showBlank) {
58032                     _showBlank = false;
58033                     rowData.push({ index: _indexedKeys.length, key: '', value: '' });
58034                 }
58035
58036
58037                 // View Options
58038                 var options = wrap.selectAll('.raw-tag-options')
58039                     .data([0]);
58040
58041                 var optionsEnter = options.enter()
58042                     .append('div')
58043                     .attr('class', 'raw-tag-options');
58044
58045                 var optionEnter = optionsEnter.selectAll('.raw-tag-option')
58046                     .data(availableViews, function(d) { return d.id; })
58047                     .enter();
58048
58049                 optionEnter
58050                     .append('button')
58051                     .attr('class', function(d) {
58052                         return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
58053                     })
58054                     .attr('title', function(d) { return d.id; })
58055                     .on('click', function(d) {
58056                         _tagView = d.id;
58057                         context.storage('raw-tag-editor-view', d.id);
58058
58059                         wrap.selectAll('.raw-tag-option')
58060                             .classed('selected', function(datum) { return datum === d; });
58061
58062                         wrap.selectAll('.tag-text')
58063                             .classed('hide', (d.id !== 'text'))
58064                             .each(setTextareaHeight);
58065
58066                         wrap.selectAll('.tag-list, .add-row')
58067                             .classed('hide', (d.id !== 'list'));
58068                     })
58069                     .each(function(d) {
58070                         d3_select(this)
58071                             .call(svgIcon(d.icon));
58072                     });
58073
58074
58075                 // View as Text
58076                 var textData = rowsToText(rowData);
58077                 var textarea = wrap.selectAll('.tag-text')
58078                     .data([0]);
58079
58080                 textarea = textarea.enter()
58081                     .append('textarea')
58082                     .attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : ''))
58083                     .call(utilNoAuto)
58084                     .attr('spellcheck', 'false')
58085                     .merge(textarea);
58086
58087                 textarea
58088                     .call(utilGetSetValue, textData)
58089                     .each(setTextareaHeight)
58090                     .on('input', setTextareaHeight)
58091                     .on('blur', textChanged)
58092                     .on('change', textChanged);
58093
58094                 // If All Fields section is hidden, focus textarea and put cursor at end..
58095                 var fieldsExpanded = d3_select('.hide-toggle-preset_fields.expanded').size();
58096                 if (_state !== 'hover' && _tagView === 'text' && !fieldsExpanded) {
58097                     var element = textarea.node();
58098                     element.focus();
58099                     element.setSelectionRange(textData.length, textData.length);
58100                 }
58101
58102
58103                 // View as List
58104                 var list = wrap.selectAll('.tag-list')
58105                     .data([0]);
58106
58107                 list = list.enter()
58108                     .append('ul')
58109                     .attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : ''))
58110                     .merge(list);
58111
58112
58113                 // Container for the Add button
58114                 var addRowEnter = wrap.selectAll('.add-row')
58115                     .data([0])
58116                     .enter()
58117                     .append('div')
58118                     .attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
58119
58120                 addRowEnter
58121                     .append('button')
58122                     .attr('class', 'add-tag')
58123                     .call(svgIcon('#iD-icon-plus', 'light'))
58124                     .on('click', addTag);
58125
58126                 addRowEnter
58127                     .append('div')
58128                     .attr('class', 'space-value');   // preserve space
58129
58130                 addRowEnter
58131                     .append('div')
58132                     .attr('class', 'space-buttons');  // preserve space
58133
58134
58135                 // Tag list items
58136                 var items = list.selectAll('.tag-row')
58137                     .data(rowData, function(d) { return d.key; });
58138
58139                 items.exit()
58140                     .each(unbind)
58141                     .remove();
58142
58143
58144                 // Enter
58145                 var itemsEnter = items.enter()
58146                     .append('li')
58147                     .attr('class', 'tag-row')
58148                     .classed('readonly', isReadOnly);
58149
58150                 var innerWrap = itemsEnter.append('div')
58151                     .attr('class', 'inner-wrap');
58152
58153                 innerWrap
58154                     .append('div')
58155                     .attr('class', 'key-wrap')
58156                     .append('input')
58157                     .property('type', 'text')
58158                     .attr('class', 'key')
58159                     .attr('maxlength', 255)
58160                     .call(utilNoAuto)
58161                     .on('blur', keyChange)
58162                     .on('change', keyChange);
58163
58164                 innerWrap
58165                     .append('div')
58166                     .attr('class', 'value-wrap')
58167                     .append('input')
58168                     .property('type', 'text')
58169                     .attr('class', 'value')
58170                     .attr('maxlength', 255)
58171                     .call(utilNoAuto)
58172                     .on('blur', valueChange)
58173                     .on('change', valueChange)
58174                     .on('keydown.push-more', pushMore);
58175
58176                 innerWrap
58177                     .append('button')
58178                     .attr('tabindex', -1)
58179                     .attr('class', 'form-field-button remove')
58180                     .attr('title', t('icons.remove'))
58181                     .call(svgIcon('#iD-operation-delete'));
58182
58183
58184                 // Update
58185                 items = items
58186                     .merge(itemsEnter)
58187                     .sort(function(a, b) { return a.index - b.index; });
58188
58189                 items
58190                     .each(function(d) {
58191                         var row = d3_select(this);
58192                         var key = row.select('input.key');      // propagate bound data
58193                         var value = row.select('input.value');  // propagate bound data
58194
58195                         if (_entityID && taginfo && _state !== 'hover') {
58196                             bindTypeahead(key, value);
58197                         }
58198
58199                         var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
58200                         var reference;
58201
58202                         if (isRelation && d.key === 'type') {
58203                             reference = uiTagReference({ rtype: d.value });
58204                         } else {
58205                             reference = uiTagReference({ key: d.key, value: d.value });
58206                         }
58207
58208                         if (_state === 'hover') {
58209                             reference.showing(false);
58210                         }
58211
58212                         row.select('.inner-wrap')      // propagate bound data
58213                             .call(reference.button);
58214
58215                         row.call(reference.body);
58216
58217                         row.select('button.remove');   // propagate bound data
58218                     });
58219
58220                 items.selectAll('input.key')
58221                     .attr('title', function(d) { return d.key; })
58222                     .call(utilGetSetValue, function(d) { return d.key; })
58223                     .property('disabled', isReadOnly);
58224
58225                 items.selectAll('input.value')
58226                     .attr('title', function(d) { return d.value; })
58227                     .call(utilGetSetValue, function(d) { return d.value; })
58228                     .property('disabled', isReadOnly);
58229
58230                 items.selectAll('button.remove')
58231                     .on('mousedown', removeTag);  // 'click' fires too late - #5878
58232
58233
58234
58235                 function isReadOnly(d) {
58236                     for (var i = 0; i < _readOnlyTags.length; i++) {
58237                         if (d.key.match(_readOnlyTags[i]) !== null) {
58238                             return true;
58239                         }
58240                     }
58241                     return false;
58242                 }
58243
58244
58245                 function setTextareaHeight() {
58246                     if (_tagView !== 'text') return;
58247
58248                     var selection = d3_select(this);
58249                     selection.style('height', null);
58250                     selection.style('height', selection.node().scrollHeight + 5 + 'px');
58251                 }
58252
58253
58254                 function stringify(s) {
58255                     return JSON.stringify(s).slice(1, -1);   // without leading/trailing "
58256                 }
58257
58258                 function unstringify(s) {
58259                     var leading = '';
58260                     var trailing = '';
58261                     if (s.length < 1 || s.charAt(0) !== '"') {
58262                         leading = '"';
58263                     }
58264                     if (s.length < 2 || s.charAt(s.length - 1) !== '"' ||
58265                         (s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\')
58266                     ) {
58267                         trailing = '"';
58268                     }
58269                     return JSON.parse(leading + s + trailing);
58270                 }
58271
58272
58273                 function rowsToText(rows) {
58274                     var str = rows
58275                         .filter(function(row) { return row.key && row.key.trim() !== ''; })
58276                         .map(function(row) { return stringify(row.key) + '=' + stringify(row.value); })
58277                         .join('\n');
58278
58279                     return _state === 'hover' ? str : str + '\n';
58280                 }
58281
58282
58283                 function textChanged() {
58284                     var newText = this.value.trim();
58285                     var newTags = {};
58286                     newText.split('\n').forEach(function(row) {
58287                         var m = row.match(/^\s*([^=]+)=(.*)$/);
58288                         if (m !== null) {
58289                             var k = unstringify(m[1].trim());
58290                             var v = unstringify(m[2].trim());
58291                             newTags[k] = v;
58292                         }
58293                     });
58294
58295                     var tagDiff = utilTagDiff(_tags, newTags);
58296                     if (!tagDiff.length) return;
58297
58298                     _pendingChange  = _pendingChange || {};
58299
58300                     tagDiff.forEach(function(change) {
58301                         if (isReadOnly({ key: change.key })) return;
58302
58303                         if (change.type === '-') {
58304                             _pendingChange[change.key] = undefined;
58305                         } else if (change.type === '+') {
58306                             _pendingChange[change.key] = change.newVal || '';
58307                         }
58308                     });
58309
58310                     scheduleChange();
58311                 }
58312
58313
58314                 function pushMore() {
58315                     if (event.keyCode === 9 && !event.shiftKey &&
58316                         list.selectAll('li:last-child input.value').node() === this) {
58317                         addTag();
58318                     }
58319                 }
58320
58321
58322                 function bindTypeahead(key, value) {
58323                     if (isReadOnly(key.datum())) return;
58324
58325                     var geometry = context.geometry(_entityID);
58326
58327                     key.call(uiCombobox(context, 'tag-key')
58328                         .fetcher(function(value, callback) {
58329                             taginfo.keys({
58330                                 debounce: true,
58331                                 geometry: geometry,
58332                                 query: value
58333                             }, function(err, data) {
58334                                 if (!err) {
58335                                     var filtered = data.filter(function(d) { return _tags[d.value] === undefined; });
58336                                     callback(sort(value, filtered));
58337                                 }
58338                             });
58339                         }));
58340
58341                     value.call(uiCombobox(context, 'tag-value')
58342                         .fetcher(function(value, callback) {
58343                             taginfo.values({
58344                                 debounce: true,
58345                                 key: utilGetSetValue(key),
58346                                 geometry: geometry,
58347                                 query: value
58348                             }, function(err, data) {
58349                                 if (!err) callback(sort(value, data));
58350                             });
58351                         }));
58352
58353
58354                     function sort(value, data) {
58355                         var sameletter = [];
58356                         var other = [];
58357                         for (var i = 0; i < data.length; i++) {
58358                             if (data[i].value.substring(0, value.length) === value) {
58359                                 sameletter.push(data[i]);
58360                             } else {
58361                                 other.push(data[i]);
58362                             }
58363                         }
58364                         return sameletter.concat(other);
58365                     }
58366                 }
58367
58368
58369                 function unbind() {
58370                     var row = d3_select(this);
58371
58372                     row.selectAll('input.key')
58373                         .call(uiCombobox.off);
58374
58375                     row.selectAll('input.value')
58376                         .call(uiCombobox.off);
58377                 }
58378
58379
58380                 function keyChange(d) {
58381                     var kOld = d.key;
58382                     var kNew = this.value.trim();
58383                     var row = this.parentNode.parentNode;
58384                     var inputVal = d3_select(row).selectAll('input.value');
58385                     var vNew = utilGetSetValue(inputVal);
58386
58387                     // allow no change if the key should be readonly
58388                     if (isReadOnly({ key: kNew })) {
58389                         this.value = kOld;
58390                         return;
58391                     }
58392
58393                     // switch focus if key is already in use
58394                     if (kNew && kNew !== kOld) {
58395                         if (_tags[kNew] !== undefined) {      // new key is already in use
58396                             this.value = kOld;                // reset the key
58397                             list.selectAll('input.value')
58398                                 .each(function(d) {
58399                                     if (d.key === kNew) {     // send focus to that other value combo instead
58400                                         var input = d3_select(this).node();
58401                                         input.focus();
58402                                         input.select();
58403                                     }
58404                                 });
58405                             return;
58406                         }
58407                     }
58408
58409                     _pendingChange  = _pendingChange || {};
58410
58411                     // exit if we are currently about to delete this row anyway - #6366
58412                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58413
58414                     if (kOld) {
58415                         _pendingChange[kOld] = undefined;
58416                     }
58417
58418                     _pendingChange[kNew] = vNew;
58419
58420                     d.key = kNew;    // update datum to avoid exit/enter on tag update
58421                     d.value = vNew;
58422
58423                     this.value = kNew;
58424                     utilGetSetValue(inputVal, vNew);
58425                     scheduleChange();
58426                 }
58427
58428
58429                 function valueChange(d) {
58430                     if (isReadOnly(d)) return;
58431
58432                     _pendingChange  = _pendingChange || {};
58433
58434                     // exit if we are currently about to delete this row anyway - #6366
58435                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58436
58437                     _pendingChange[d.key] = this.value;
58438                     scheduleChange();
58439                 }
58440
58441
58442                 function removeTag(d) {
58443                     if (isReadOnly(d)) return;
58444
58445                     if (d.key === '') {    // removing the blank row
58446                         _showBlank = false;
58447                         content(wrap);
58448
58449                     } else {
58450                         // remove from indexedKeys too, so that if the user puts it back,
58451                         // it will be sorted to the end and not back to its original position
58452                         _indexedKeys = _indexedKeys.filter(function(row) { return row.key !== d.key; });
58453
58454                         _pendingChange  = _pendingChange || {};
58455                         _pendingChange[d.key] = undefined;
58456                         scheduleChange();
58457                     }
58458                 }
58459
58460
58461                 function addTag() {
58462                     // Delay render in case this click is blurring an edited combo.
58463                     // Without the setTimeout, the `content` render would wipe out the pending tag change.
58464                     window.setTimeout(function() {
58465                         _showBlank = true;
58466                         content(wrap);
58467                         list.selectAll('li:last-child input.key').node().focus();
58468                     }, 20);
58469                 }
58470
58471
58472                 function scheduleChange() {
58473                     // Delay change in case this change is blurring an edited combo. - #5878
58474                     window.setTimeout(function() {
58475                         dispatch$1.call('change', this, _pendingChange);
58476                         _pendingChange = null;
58477                     }, 10);
58478                 }
58479
58480             }
58481
58482
58483             rawTagEditor.state = function(val) {
58484                 if (!arguments.length) return _state;
58485                 if (_state !== val) {
58486                     _indexedKeys = [];
58487                     _state = val;
58488                 }
58489                 return rawTagEditor;
58490             };
58491
58492
58493             rawTagEditor.preset = function(val) {
58494                 if (!arguments.length) return _preset;
58495                 _preset = val;
58496                 if (_preset.isFallback()) {
58497                     _expanded = true;
58498                     _updatePreference = false;
58499                 } else {
58500                     _expanded = undefined;
58501                     _updatePreference = true;
58502                 }
58503                 return rawTagEditor;
58504             };
58505
58506
58507             rawTagEditor.tags = function(val) {
58508                 if (!arguments.length) return _tags;
58509                 _tags = val;
58510                 return rawTagEditor;
58511             };
58512
58513
58514             rawTagEditor.entityID = function(val) {
58515                 if (!arguments.length) return _entityID;
58516                 if (_entityID !== val) {
58517                     _indexedKeys = [];
58518                     _entityID = val;
58519                 }
58520                 return rawTagEditor;
58521             };
58522
58523
58524             rawTagEditor.expanded = function(val) {
58525                 if (!arguments.length) return _expanded;
58526                 _expanded = val;
58527                 _updatePreference = false;
58528                 return rawTagEditor;
58529             };
58530
58531
58532             // pass an array of regular expressions to test against the tag key
58533             rawTagEditor.readOnlyTags = function(val) {
58534                 if (!arguments.length) return _readOnlyTags;
58535                 _readOnlyTags = val;
58536                 return rawTagEditor;
58537             };
58538
58539
58540             return utilRebind(rawTagEditor, dispatch$1, 'on');
58541         }
58542
58543         function uiDataEditor(context) {
58544             var dataHeader = uiDataHeader();
58545             var quickLinks = uiQuickLinks();
58546             var rawTagEditor = uiRawTagEditor(context);
58547             var _datum;
58548
58549
58550             function dataEditor(selection) {
58551                 // quick links
58552                 var choices = [{
58553                     id: 'zoom_to',
58554                     label: 'inspector.zoom_to.title',
58555                     tooltip: function() {
58556                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
58557                     },
58558                     click: function zoomTo() {
58559                         context.mode().zoomToSelected();
58560                     }
58561                 }];
58562
58563
58564                 var header = selection.selectAll('.header')
58565                     .data([0]);
58566
58567                 var headerEnter = header.enter()
58568                     .append('div')
58569                     .attr('class', 'header fillL');
58570
58571                 headerEnter
58572                     .append('button')
58573                     .attr('class', 'fr data-editor-close')
58574                     .on('click', function() {
58575                         context.enter(modeBrowse(context));
58576                     })
58577                     .call(svgIcon('#iD-icon-close'));
58578
58579                 headerEnter
58580                     .append('h3')
58581                     .text(t('map_data.title'));
58582
58583
58584                 var body = selection.selectAll('.body')
58585                     .data([0]);
58586
58587                 body = body.enter()
58588                     .append('div')
58589                     .attr('class', 'body')
58590                     .merge(body);
58591
58592                 var editor = body.selectAll('.data-editor')
58593                     .data([0]);
58594
58595                 // enter/update
58596                 editor.enter()
58597                     .append('div')
58598                     .attr('class', 'modal-section data-editor')
58599                     .merge(editor)
58600                     .call(dataHeader.datum(_datum))
58601                     .call(quickLinks.choices(choices));
58602
58603                 var rte = body.selectAll('.raw-tag-editor')
58604                     .data([0]);
58605
58606                 // enter/update
58607                 rte.enter()
58608                     .append('div')
58609                     .attr('class', 'raw-tag-editor inspector-inner data-editor')
58610                     .merge(rte)
58611                     .call(rawTagEditor
58612                         .expanded(true)
58613                         .readOnlyTags([/./])
58614                         .tags((_datum && _datum.properties) || {})
58615                         .state('hover')
58616                     )
58617                     .selectAll('textarea.tag-text')
58618                     .property('disabled', true)
58619                     .classed('readonly', true);
58620             }
58621
58622
58623             dataEditor.datum = function(val) {
58624                 if (!arguments.length) return _datum;
58625                 _datum = val;
58626                 return this;
58627             };
58628
58629
58630             return dataEditor;
58631         }
58632
58633         function modeSelectData(context, selectedDatum) {
58634             var mode = {
58635                 id: 'select-data',
58636                 button: 'browse'
58637             };
58638
58639             var keybinding = utilKeybinding('select-data');
58640             var dataEditor = uiDataEditor(context);
58641
58642             var behaviors = [
58643                 behaviorBreathe(),
58644                 behaviorHover(context),
58645                 behaviorSelect(context),
58646                 behaviorLasso(context),
58647                 modeDragNode(context).behavior,
58648                 modeDragNote(context).behavior
58649             ];
58650
58651
58652             // class the data as selected, or return to browse mode if the data is gone
58653             function selectData(drawn) {
58654                 var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
58655
58656                 if (selection.empty()) {
58657                     // Return to browse mode if selected DOM elements have
58658                     // disappeared because the user moved them out of view..
58659                     var source = event && event.type === 'zoom' && event.sourceEvent;
58660                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
58661                         context.enter(modeBrowse(context));
58662                     }
58663                 } else {
58664                     selection.classed('selected', true);
58665                 }
58666             }
58667
58668
58669             function esc() {
58670                 if (d3_select('.combobox').size()) return;
58671                 context.enter(modeBrowse(context));
58672             }
58673
58674
58675             mode.zoomToSelected = function() {
58676                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58677                 context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
58678             };
58679
58680
58681             mode.enter = function() {
58682                 behaviors.forEach(context.install);
58683
58684                 keybinding
58685                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
58686                     .on('⎋', esc, true);
58687
58688                 d3_select(document)
58689                     .call(keybinding);
58690
58691                 selectData();
58692
58693                 var sidebar = context.ui().sidebar;
58694                 sidebar.show(dataEditor.datum(selectedDatum));
58695
58696                 // expand the sidebar, avoid obscuring the data if needed
58697                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58698                 sidebar.expand(sidebar.intersects(extent));
58699
58700                 context.map()
58701                     .on('drawn.select-data', selectData);
58702             };
58703
58704
58705             mode.exit = function() {
58706                 behaviors.forEach(context.uninstall);
58707
58708                 d3_select(document)
58709                     .call(keybinding.unbind);
58710
58711                 context.surface()
58712                     .selectAll('.layer-mapdata .selected')
58713                     .classed('selected hover', false);
58714
58715                 context.map()
58716                     .on('drawn.select-data', null);
58717
58718                 context.ui().sidebar
58719                     .hide();
58720             };
58721
58722
58723             return mode;
58724         }
58725
58726         function uiImproveOsmComments() {
58727             var _error;
58728
58729
58730             function errorComments(selection) {
58731                 // make the div immediately so it appears above the buttons
58732                 var comments = selection.selectAll('.comments-container')
58733                     .data([0]);
58734
58735                 comments = comments.enter()
58736                     .append('div')
58737                     .attr('class', 'comments-container')
58738                     .merge(comments);
58739
58740                 // must retrieve comments from API before they can be displayed
58741                 services$1.improveOSM.getComments(_error, function(err, d) {
58742                     if (!d.comments) { return; } // nothing to do here
58743
58744                     var commentEnter = comments.selectAll('.comment')
58745                         .data(d.comments)
58746                         .enter()
58747                         .append('div')
58748                         .attr('class', 'comment');
58749
58750                     commentEnter
58751                         .append('div')
58752                         .attr('class', 'comment-avatar')
58753                         .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
58754
58755                     var mainEnter = commentEnter
58756                         .append('div')
58757                         .attr('class', 'comment-main');
58758
58759                     var metadataEnter = mainEnter
58760                         .append('div')
58761                         .attr('class', 'comment-metadata');
58762
58763                     metadataEnter
58764                         .append('div')
58765                         .attr('class', 'comment-author')
58766                         .each(function(d) {
58767                             var selection = d3_select(this);
58768                             var osm = services$1.osm;
58769                             if (osm && d.username) {
58770                                 selection = selection
58771                                     .append('a')
58772                                     .attr('class', 'comment-author-link')
58773                                     .attr('href', osm.userURL(d.username))
58774                                     .attr('tabindex', -1)
58775                                     .attr('target', '_blank');
58776                             }
58777                             selection
58778                                 .text(function(d) { return d.username; });
58779                         });
58780
58781                     metadataEnter
58782                         .append('div')
58783                         .attr('class', 'comment-date')
58784                         .text(function(d) {
58785                             return t('note.status.commented', { when: localeDateString(d.timestamp) });
58786                         });
58787
58788                     mainEnter
58789                         .append('div')
58790                         .attr('class', 'comment-text')
58791                         .append('p')
58792                         .text(function(d) { return d.text; });
58793                 });
58794             }
58795
58796             function localeDateString(s) {
58797                 if (!s) return null;
58798                 var detected = utilDetect();
58799                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58800                 var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
58801                 if (isNaN(d.getTime())) return null;
58802                 return d.toLocaleDateString(detected.locale, options);
58803             }
58804
58805             errorComments.error = function(val) {
58806                 if (!arguments.length) return _error;
58807                 _error = val;
58808                 return errorComments;
58809             };
58810
58811             return errorComments;
58812         }
58813
58814         function uiImproveOsmDetails(context) {
58815             var _error;
58816
58817
58818             function errorDetail(d) {
58819                 var unknown = t('inspector.unknown');
58820
58821                 if (!d) return unknown;
58822
58823                 if (d.desc) return d.desc;
58824
58825                 var errorType = d.error_key;
58826                 var et = en.QA.improveOSM.error_types[errorType];
58827
58828                 var detail;
58829                 if (et && et.description) {
58830                     detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
58831                 } else {
58832                     detail = unknown;
58833                 }
58834
58835                 return detail;
58836             }
58837
58838
58839             function improveOsmDetails(selection) {
58840                 var details = selection.selectAll('.error-details')
58841                     .data(
58842                         (_error ? [_error] : []),
58843                         function(d) { return d.id + '-' + (d.status || 0); }
58844                     );
58845
58846                 details.exit()
58847                     .remove();
58848
58849                 var detailsEnter = details.enter()
58850                     .append('div')
58851                     .attr('class', 'error-details error-details-container');
58852
58853
58854                 // description
58855                 var descriptionEnter = detailsEnter
58856                     .append('div')
58857                     .attr('class', 'error-details-description');
58858
58859                 descriptionEnter
58860                     .append('h4')
58861                     .text(function() { return t('QA.keepRight.detail_description'); });
58862
58863                 descriptionEnter
58864                     .append('div')
58865                     .attr('class', 'error-details-description-text')
58866                     .html(errorDetail);
58867
58868                 // If there are entity links in the error message..
58869                 var relatedEntities = [];
58870                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
58871                     .each(function() {
58872                         var link = d3_select(this);
58873                         var isObjectLink = link.classed('error_object_link');
58874                         var entityID = isObjectLink ?
58875                             (utilEntityRoot(_error.object_type) + _error.object_id)
58876                             : this.textContent;
58877                         var entity = context.hasEntity(entityID);
58878
58879                         relatedEntities.push(entityID);
58880
58881                         // Add click handler
58882                         link
58883                             .on('mouseover', function() {
58884                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
58885                                     .classed('hover', true);
58886                             })
58887                             .on('mouseout', function() {
58888                                 context.surface().selectAll('.hover')
58889                                     .classed('hover', false);
58890                             })
58891                             .on('click', function() {
58892                                 event.preventDefault();
58893                                 var osmlayer = context.layers().layer('osm');
58894                                 if (!osmlayer.enabled()) {
58895                                     osmlayer.enabled(true);
58896                                 }
58897
58898                                 context.map().centerZoom(_error.loc, 20);
58899
58900                                 if (entity) {
58901                                     context.enter(modeSelect(context, [entityID]));
58902                                 } else {
58903                                     context.loadEntity(entityID, function() {
58904                                         context.enter(modeSelect(context, [entityID]));
58905                                     });
58906                                 }
58907                             });
58908
58909                         // Replace with friendly name if possible
58910                         // (The entity may not yet be loaded into the graph)
58911                         if (entity) {
58912                             var name = utilDisplayName(entity);  // try to use common name
58913
58914                             if (!name && !isObjectLink) {
58915                                 var preset = context.presets().match(entity, context.graph());
58916                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
58917                             }
58918
58919                             if (name) {
58920                                 this.innerText = name;
58921                             }
58922                         }
58923                     });
58924
58925                 // Don't hide entities related to this error - #5880
58926                 context.features().forceVisible(relatedEntities);
58927             }
58928
58929
58930             improveOsmDetails.error = function(val) {
58931                 if (!arguments.length) return _error;
58932                 _error = val;
58933                 return improveOsmDetails;
58934             };
58935
58936
58937             return improveOsmDetails;
58938         }
58939
58940         function uiImproveOsmHeader() {
58941             var _error;
58942
58943
58944             function errorTitle(d) {
58945                 var unknown = t('inspector.unknown');
58946
58947                 if (!d) return unknown;
58948                 var errorType = d.error_key;
58949                 var et = en.QA.improveOSM.error_types[errorType];
58950
58951                 if (et && et.title) {
58952                     return t('QA.improveOSM.error_types.' + errorType + '.title');
58953                 } else {
58954                     return unknown;
58955                 }
58956             }
58957
58958
58959             function improveOsmHeader(selection) {
58960                 var header = selection.selectAll('.error-header')
58961                     .data(
58962                         (_error ? [_error] : []),
58963                         function(d) { return d.id + '-' + (d.status || 0); }
58964                     );
58965
58966                 header.exit()
58967                     .remove();
58968
58969                 var headerEnter = header.enter()
58970                     .append('div')
58971                     .attr('class', 'error-header');
58972
58973                 var iconEnter = headerEnter
58974                     .append('div')
58975                     .attr('class', 'error-header-icon')
58976                     .classed('new', function(d) { return d.id < 0; });
58977
58978                 var svgEnter = iconEnter
58979                     .append('svg')
58980                     .attr('width', '20px')
58981                     .attr('height', '30px')
58982                     .attr('viewbox', '0 0 20 30')
58983                     .attr('class', function(d) {
58984                         return [
58985                             'preset-icon-28',
58986                             'qa_error',
58987                             d.service,
58988                             'error_id-' + d.id,
58989                             'error_type-' + d.error_type,
58990                             'category-' + d.category
58991                         ].join(' ');
58992                     });
58993
58994                 svgEnter
58995                     .append('polygon')
58996                     .attr('fill', 'currentColor')
58997                     .attr('class', 'qa_error-fill')
58998                     .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');
58999
59000                 svgEnter
59001                     .append('use')
59002                     .attr('class', 'icon-annotation')
59003                     .attr('width', '11px')
59004                     .attr('height', '11px')
59005                     .attr('transform', 'translate(4.5, 7)')
59006                     .attr('xlink:href', function(d) {
59007                         var picon = d.icon;
59008
59009                         if (!picon) {
59010                             return '';
59011                         } else {
59012                             var isMaki = /^maki-/.test(picon);
59013                             return '#' + picon + (isMaki ? '-11' : '');
59014                         }
59015                     });
59016
59017                 headerEnter
59018                     .append('div')
59019                     .attr('class', 'error-header-label')
59020                     .text(errorTitle);
59021             }
59022
59023
59024             improveOsmHeader.error = function(val) {
59025                 if (!arguments.length) return _error;
59026                 _error = val;
59027                 return improveOsmHeader;
59028             };
59029
59030
59031             return improveOsmHeader;
59032         }
59033
59034         function uiImproveOsmEditor(context) {
59035             var dispatch$1 = dispatch('change');
59036             var errorDetails = uiImproveOsmDetails(context);
59037             var errorComments = uiImproveOsmComments();
59038             var errorHeader = uiImproveOsmHeader();
59039             var quickLinks = uiQuickLinks();
59040
59041             var _error;
59042
59043
59044             function improveOsmEditor(selection) {
59045                 // quick links
59046                 var choices = [{
59047                     id: 'zoom_to',
59048                     label: 'inspector.zoom_to.title',
59049                     tooltip: function() {
59050                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59051                     },
59052                     click: function zoomTo() {
59053                         context.mode().zoomToSelected();
59054                     }
59055                 }];
59056
59057
59058                 var header = selection.selectAll('.header')
59059                     .data([0]);
59060
59061                 var headerEnter = header.enter()
59062                     .append('div')
59063                     .attr('class', 'header fillL');
59064
59065                 headerEnter
59066                     .append('button')
59067                     .attr('class', 'fr error-editor-close')
59068                     .on('click', function() {
59069                         context.enter(modeBrowse(context));
59070                     })
59071                     .call(svgIcon('#iD-icon-close'));
59072
59073                 headerEnter
59074                     .append('h3')
59075                     .text(t('QA.improveOSM.title'));
59076
59077
59078                 var body = selection.selectAll('.body')
59079                     .data([0]);
59080
59081                 body = body.enter()
59082                     .append('div')
59083                     .attr('class', 'body')
59084                     .merge(body);
59085
59086                 var editor = body.selectAll('.error-editor')
59087                     .data([0]);
59088
59089                 editor.enter()
59090                     .append('div')
59091                     .attr('class', 'modal-section error-editor')
59092                     .merge(editor)
59093                     .call(errorHeader.error(_error))
59094                     .call(quickLinks.choices(choices))
59095                     .call(errorDetails.error(_error))
59096                     .call(errorComments.error(_error))
59097                     .call(improveOsmSaveSection);
59098             }
59099
59100             function improveOsmSaveSection(selection) {
59101                 var isSelected = (_error && _error.id === context.selectedErrorID());
59102                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59103                 var saveSection = selection.selectAll('.error-save')
59104                     .data(
59105                         (isShown ? [_error] : []),
59106                         function(d) { return d.id + '-' + (d.status || 0); }
59107                     );
59108
59109                 // exit
59110                 saveSection.exit()
59111                     .remove();
59112
59113                 // enter
59114                 var saveSectionEnter = saveSection.enter()
59115                     .append('div')
59116                     .attr('class', 'error-save save-section cf');
59117
59118                 saveSectionEnter
59119                     .append('h4')
59120                     .attr('class', '.error-save-header')
59121                     .text(t('note.newComment'));
59122
59123                 saveSectionEnter
59124                     .append('textarea')
59125                     .attr('class', 'new-comment-input')
59126                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59127                     .attr('maxlength', 1000)
59128                     .property('value', function(d) { return d.newComment; })
59129                     .call(utilNoAuto)
59130                     .on('input', changeInput)
59131                     .on('blur', changeInput);
59132
59133                 // update
59134                 saveSection = saveSectionEnter
59135                     .merge(saveSection)
59136                     .call(errorSaveButtons);
59137
59138                 function changeInput() {
59139                     var input = d3_select(this);
59140                     var val = input.property('value').trim();
59141
59142                     if (val === '') {
59143                         val = undefined;
59144                     }
59145
59146                     // store the unsaved comment with the error itself
59147                     _error = _error.update({ newComment: val });
59148
59149                     var errorService = services$1.improveOSM;
59150                     if (errorService) {
59151                         errorService.replaceError(_error);
59152                     }
59153
59154                     saveSection
59155                         .call(errorSaveButtons);
59156                 }
59157             }
59158
59159             function errorSaveButtons(selection) {
59160                 var isSelected = (_error && _error.id === context.selectedErrorID());
59161                 var buttonSection = selection.selectAll('.buttons')
59162                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59163
59164                 // exit
59165                 buttonSection.exit()
59166                     .remove();
59167
59168                 // enter
59169                 var buttonEnter = buttonSection.enter()
59170                     .append('div')
59171                     .attr('class', 'buttons');
59172
59173                 buttonEnter
59174                     .append('button')
59175                     .attr('class', 'button comment-button action')
59176                     .text(t('QA.keepRight.save_comment'));
59177
59178                 buttonEnter
59179                     .append('button')
59180                     .attr('class', 'button close-button action');
59181
59182                 buttonEnter
59183                     .append('button')
59184                     .attr('class', 'button ignore-button action');
59185
59186
59187                 // update
59188                 buttonSection = buttonSection
59189                     .merge(buttonEnter);
59190
59191                 buttonSection.select('.comment-button')
59192                     .attr('disabled', function(d) {
59193                         return d.newComment === undefined ? true : null;
59194                     })
59195                     .on('click.comment', function(d) {
59196                         this.blur();    // avoid keeping focus on the button - #4641
59197                         var errorService = services$1.improveOSM;
59198                         if (errorService) {
59199                             errorService.postUpdate(d, function(err, error) {
59200                                 dispatch$1.call('change', error);
59201                             });
59202                         }
59203                     });
59204
59205                 buttonSection.select('.close-button')
59206                     .text(function(d) {
59207                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59208                         return t('QA.keepRight.close' + andComment);
59209                     })
59210                     .on('click.close', function(d) {
59211                         this.blur();    // avoid keeping focus on the button - #4641
59212                         var errorService = services$1.improveOSM;
59213                         if (errorService) {
59214                             d.newStatus = 'SOLVED';
59215                             errorService.postUpdate(d, function(err, error) {
59216                                 dispatch$1.call('change', error);
59217                             });
59218                         }
59219                     });
59220
59221                 buttonSection.select('.ignore-button')
59222                     .text(function(d) {
59223                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59224                         return t('QA.keepRight.ignore' + andComment);
59225                     })
59226                     .on('click.ignore', function(d) {
59227                         this.blur();    // avoid keeping focus on the button - #4641
59228                         var errorService = services$1.improveOSM;
59229                         if (errorService) {
59230                             d.newStatus = 'INVALID';
59231                             errorService.postUpdate(d, function(err, error) {
59232                                 dispatch$1.call('change', error);
59233                             });
59234                         }
59235                     });
59236             }
59237
59238             improveOsmEditor.error = function(val) {
59239                 if (!arguments.length) return _error;
59240                 _error = val;
59241                 return improveOsmEditor;
59242             };
59243
59244
59245             return utilRebind(improveOsmEditor, dispatch$1, 'on');
59246         }
59247
59248         function uiKeepRightDetails(context) {
59249             var _error;
59250
59251
59252             function errorDetail(d) {
59253                 var unknown = t('inspector.unknown');
59254
59255                 if (!d) return unknown;
59256                 var errorType = d.error_type;
59257                 var parentErrorType = d.parent_error_type;
59258
59259                 var et = en.QA.keepRight.errorTypes[errorType];
59260                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59261
59262                 var detail;
59263                 if (et && et.description) {
59264                     detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
59265                 } else if (pt && pt.description) {
59266                     detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
59267                 } else {
59268                     detail = unknown;
59269                 }
59270
59271                 return detail;
59272             }
59273
59274
59275             function keepRightDetails(selection) {
59276                 var details = selection.selectAll('.error-details')
59277                     .data(
59278                         (_error ? [_error] : []),
59279                         function(d) { return d.id + '-' + (d.status || 0); }
59280                     );
59281
59282                 details.exit()
59283                     .remove();
59284
59285                 var detailsEnter = details.enter()
59286                     .append('div')
59287                     .attr('class', 'error-details error-details-container');
59288
59289
59290                 // description
59291                 var descriptionEnter = detailsEnter
59292                     .append('div')
59293                     .attr('class', 'error-details-description');
59294
59295                 descriptionEnter
59296                     .append('h4')
59297                     .text(function() { return t('QA.keepRight.detail_description'); });
59298
59299                 descriptionEnter
59300                     .append('div')
59301                     .attr('class', 'error-details-description-text')
59302                     .html(errorDetail);
59303
59304                 // If there are entity links in the error message..
59305                 var relatedEntities = [];
59306                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59307                     .each(function() {
59308                         var link = d3_select(this);
59309                         var isObjectLink = link.classed('error_object_link');
59310                         var entityID = isObjectLink ?
59311                             (utilEntityRoot(_error.object_type) + _error.object_id)
59312                             : this.textContent;
59313                         var entity = context.hasEntity(entityID);
59314
59315                         relatedEntities.push(entityID);
59316
59317                         // Add click handler
59318                         link
59319                             .on('mouseover', function() {
59320                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59321                                     .classed('hover', true);
59322                             })
59323                             .on('mouseout', function() {
59324                                 context.surface().selectAll('.hover')
59325                                     .classed('hover', false);
59326                             })
59327                             .on('click', function() {
59328                                 event.preventDefault();
59329                                 var osmlayer = context.layers().layer('osm');
59330                                 if (!osmlayer.enabled()) {
59331                                     osmlayer.enabled(true);
59332                                 }
59333
59334                                 context.map().centerZoomEase(_error.loc, 20);
59335
59336                                 if (entity) {
59337                                     context.enter(modeSelect(context, [entityID]));
59338                                 } else {
59339                                     context.loadEntity(entityID, function() {
59340                                         context.enter(modeSelect(context, [entityID]));
59341                                     });
59342                                 }
59343                             });
59344
59345                         // Replace with friendly name if possible
59346                         // (The entity may not yet be loaded into the graph)
59347                         if (entity) {
59348                             var name = utilDisplayName(entity);  // try to use common name
59349
59350                             if (!name && !isObjectLink) {
59351                                 var preset = context.presets().match(entity, context.graph());
59352                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59353                             }
59354
59355                             if (name) {
59356                                 this.innerText = name;
59357                             }
59358                         }
59359                     });
59360
59361                 // Don't hide entities related to this error - #5880
59362                 context.features().forceVisible(relatedEntities);
59363             }
59364
59365
59366             keepRightDetails.error = function(val) {
59367                 if (!arguments.length) return _error;
59368                 _error = val;
59369                 return keepRightDetails;
59370             };
59371
59372
59373             return keepRightDetails;
59374         }
59375
59376         function uiKeepRightHeader() {
59377             var _error;
59378
59379
59380             function errorTitle(d) {
59381                 var unknown = t('inspector.unknown');
59382
59383                 if (!d) return unknown;
59384                 var errorType = d.error_type;
59385                 var parentErrorType = d.parent_error_type;
59386
59387                 var et = en.QA.keepRight.errorTypes[errorType];
59388                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59389
59390                 if (et && et.title) {
59391                     return t('QA.keepRight.errorTypes.' + errorType + '.title');
59392                 } else if (pt && pt.title) {
59393                     return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
59394                 } else {
59395                     return unknown;
59396                 }
59397             }
59398
59399
59400             function keepRightHeader(selection) {
59401                 var header = selection.selectAll('.error-header')
59402                     .data(
59403                         (_error ? [_error] : []),
59404                         function(d) { return d.id + '-' + (d.status || 0); }
59405                     );
59406
59407                 header.exit()
59408                     .remove();
59409
59410                 var headerEnter = header.enter()
59411                     .append('div')
59412                     .attr('class', 'error-header');
59413
59414                 var iconEnter = headerEnter
59415                     .append('div')
59416                     .attr('class', 'error-header-icon')
59417                     .classed('new', function(d) { return d.id < 0; });
59418
59419                 iconEnter
59420                     .append('div')
59421                     .attr('class', function(d) {
59422                         return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
59423                     })
59424                     .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
59425
59426                 headerEnter
59427                     .append('div')
59428                     .attr('class', 'error-header-label')
59429                     .text(errorTitle);
59430             }
59431
59432
59433             keepRightHeader.error = function(val) {
59434                 if (!arguments.length) return _error;
59435                 _error = val;
59436                 return keepRightHeader;
59437             };
59438
59439
59440             return keepRightHeader;
59441         }
59442
59443         function uiViewOnKeepRight() {
59444             var _error;   // a keepright error
59445
59446
59447             function viewOnKeepRight(selection) {
59448                 var url;
59449                 if (services$1.keepRight && (_error instanceof qaError)) {
59450                     url = services$1.keepRight.errorURL(_error);
59451                 }
59452
59453                 var link = selection.selectAll('.view-on-keepRight')
59454                     .data(url ? [url] : []);
59455
59456                 // exit
59457                 link.exit()
59458                     .remove();
59459
59460                 // enter
59461                 var linkEnter = link.enter()
59462                     .append('a')
59463                     .attr('class', 'view-on-keepRight')
59464                     .attr('target', '_blank')
59465                     .attr('href', function(d) { return d; })
59466                     .call(svgIcon('#iD-icon-out-link', 'inline'));
59467
59468                 linkEnter
59469                     .append('span')
59470                     .text(t('inspector.view_on_keepRight'));
59471             }
59472
59473
59474             viewOnKeepRight.what = function(val) {
59475                 if (!arguments.length) return _error;
59476                 _error = val;
59477                 return viewOnKeepRight;
59478             };
59479
59480             return viewOnKeepRight;
59481         }
59482
59483         function uiKeepRightEditor(context) {
59484             var dispatch$1 = dispatch('change');
59485             var keepRightDetails = uiKeepRightDetails(context);
59486             var keepRightHeader = uiKeepRightHeader();
59487             var quickLinks = uiQuickLinks();
59488
59489             var _error;
59490
59491
59492             function keepRightEditor(selection) {
59493                 // quick links
59494                 var choices = [{
59495                     id: 'zoom_to',
59496                     label: 'inspector.zoom_to.title',
59497                     tooltip: function() {
59498                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59499                     },
59500                     click: function zoomTo() {
59501                         context.mode().zoomToSelected();
59502                     }
59503                 }];
59504
59505
59506                 var header = selection.selectAll('.header')
59507                     .data([0]);
59508
59509                 var headerEnter = header.enter()
59510                     .append('div')
59511                     .attr('class', 'header fillL');
59512
59513                 headerEnter
59514                     .append('button')
59515                     .attr('class', 'fr error-editor-close')
59516                     .on('click', function() {
59517                         context.enter(modeBrowse(context));
59518                     })
59519                     .call(svgIcon('#iD-icon-close'));
59520
59521                 headerEnter
59522                     .append('h3')
59523                     .text(t('QA.keepRight.title'));
59524
59525
59526                 var body = selection.selectAll('.body')
59527                     .data([0]);
59528
59529                 body = body.enter()
59530                     .append('div')
59531                     .attr('class', 'body')
59532                     .merge(body);
59533
59534                 var editor = body.selectAll('.error-editor')
59535                     .data([0]);
59536
59537                 editor.enter()
59538                     .append('div')
59539                     .attr('class', 'modal-section error-editor')
59540                     .merge(editor)
59541                     .call(keepRightHeader.error(_error))
59542                     .call(quickLinks.choices(choices))
59543                     .call(keepRightDetails.error(_error))
59544                     .call(keepRightSaveSection);
59545
59546
59547                 var footer = selection.selectAll('.footer')
59548                     .data([0]);
59549
59550                 footer.enter()
59551                     .append('div')
59552                     .attr('class', 'footer')
59553                     .merge(footer)
59554                     .call(uiViewOnKeepRight().what(_error));
59555             }
59556
59557
59558             function keepRightSaveSection(selection) {
59559                 var isSelected = (_error && _error.id === context.selectedErrorID());
59560                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59561                 var saveSection = selection.selectAll('.error-save')
59562                     .data(
59563                         (isShown ? [_error] : []),
59564                         function(d) { return d.id + '-' + (d.status || 0); }
59565                     );
59566
59567                 // exit
59568                 saveSection.exit()
59569                     .remove();
59570
59571                 // enter
59572                 var saveSectionEnter = saveSection.enter()
59573                     .append('div')
59574                     .attr('class', 'error-save save-section cf');
59575
59576                 saveSectionEnter
59577                     .append('h4')
59578                     .attr('class', '.error-save-header')
59579                     .text(t('QA.keepRight.comment'));
59580
59581                 saveSectionEnter
59582                     .append('textarea')
59583                     .attr('class', 'new-comment-input')
59584                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59585                     .attr('maxlength', 1000)
59586                     .property('value', function(d) { return d.newComment || d.comment; })
59587                     .call(utilNoAuto)
59588                     .on('input', changeInput)
59589                     .on('blur', changeInput);
59590
59591                 // update
59592                 saveSection = saveSectionEnter
59593                     .merge(saveSection)
59594                     .call(keepRightSaveButtons);
59595
59596
59597                 function changeInput() {
59598                     var input = d3_select(this);
59599                     var val = input.property('value').trim();
59600
59601                     if (val === _error.comment) {
59602                         val = undefined;
59603                     }
59604
59605                     // store the unsaved comment with the error itself
59606                     _error = _error.update({ newComment: val });
59607
59608                     var keepRight = services$1.keepRight;
59609                     if (keepRight) {
59610                         keepRight.replaceError(_error);  // update keepright cache
59611                     }
59612
59613                     saveSection
59614                         .call(keepRightSaveButtons);
59615                 }
59616             }
59617
59618
59619             function keepRightSaveButtons(selection) {
59620                 var isSelected = (_error && _error.id === context.selectedErrorID());
59621                 var buttonSection = selection.selectAll('.buttons')
59622                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59623
59624                 // exit
59625                 buttonSection.exit()
59626                     .remove();
59627
59628                 // enter
59629                 var buttonEnter = buttonSection.enter()
59630                     .append('div')
59631                     .attr('class', 'buttons');
59632
59633                 buttonEnter
59634                     .append('button')
59635                     .attr('class', 'button comment-button action')
59636                     .text(t('QA.keepRight.save_comment'));
59637
59638                 buttonEnter
59639                     .append('button')
59640                     .attr('class', 'button close-button action');
59641
59642                 buttonEnter
59643                     .append('button')
59644                     .attr('class', 'button ignore-button action');
59645
59646
59647                 // update
59648                 buttonSection = buttonSection
59649                     .merge(buttonEnter);
59650
59651                 buttonSection.select('.comment-button')   // select and propagate data
59652                     .attr('disabled', function(d) {
59653                         return d.newComment === undefined ? true : null;
59654                     })
59655                     .on('click.comment', function(d) {
59656                         this.blur();    // avoid keeping focus on the button - #4641
59657                         var keepRight = services$1.keepRight;
59658                         if (keepRight) {
59659                             keepRight.postKeepRightUpdate(d, function(err, error) {
59660                                 dispatch$1.call('change', error);
59661                             });
59662                         }
59663                     });
59664
59665                 buttonSection.select('.close-button')   // select and propagate data
59666                     .text(function(d) {
59667                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59668                         return t('QA.keepRight.close' + andComment);
59669                     })
59670                     .on('click.close', function(d) {
59671                         this.blur();    // avoid keeping focus on the button - #4641
59672                         var keepRight = services$1.keepRight;
59673                         if (keepRight) {
59674                             d.state = 'ignore_t';   // ignore temporarily (error fixed)
59675                             keepRight.postKeepRightUpdate(d, function(err, error) {
59676                                 dispatch$1.call('change', error);
59677                             });
59678                         }
59679                     });
59680
59681                 buttonSection.select('.ignore-button')   // select and propagate data
59682                     .text(function(d) {
59683                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59684                         return t('QA.keepRight.ignore' + andComment);
59685                     })
59686                     .on('click.ignore', function(d) {
59687                         this.blur();    // avoid keeping focus on the button - #4641
59688                         var keepRight = services$1.keepRight;
59689                         if (keepRight) {
59690                             d.state = 'ignore';   // ignore permanently (false positive)
59691                             keepRight.postKeepRightUpdate(d, function(err, error) {
59692                                 dispatch$1.call('change', error);
59693                             });
59694                         }
59695                     });
59696             }
59697
59698
59699             keepRightEditor.error = function(val) {
59700                 if (!arguments.length) return _error;
59701                 _error = val;
59702                 return keepRightEditor;
59703             };
59704
59705
59706             return utilRebind(keepRightEditor, dispatch$1, 'on');
59707         }
59708
59709         function modeSelectError(context, selectedErrorID, selectedErrorService) {
59710             var mode = {
59711                 id: 'select-error',
59712                 button: 'browse'
59713             };
59714
59715             var keybinding = utilKeybinding('select-error');
59716
59717             var errorService = services$1[selectedErrorService];
59718             var errorEditor;
59719             switch (selectedErrorService) {
59720                 case 'improveOSM':
59721                     errorEditor = uiImproveOsmEditor(context)
59722                     .on('change', function() {
59723                         context.map().pan([0,0]);  // trigger a redraw
59724                         var error = checkSelectedID();
59725                         if (!error) return;
59726                         context.ui().sidebar
59727                             .show(errorEditor.error(error));
59728                     });
59729                     break;
59730                 case 'keepRight':
59731                     errorEditor = uiKeepRightEditor(context)
59732                     .on('change', function() {
59733                         context.map().pan([0,0]);  // trigger a redraw
59734                         var error = checkSelectedID();
59735                         if (!error) return;
59736                         context.ui().sidebar
59737                             .show(errorEditor.error(error));
59738                     });
59739                     break;
59740             }
59741
59742
59743             var behaviors = [
59744                 behaviorBreathe(),
59745                 behaviorHover(context),
59746                 behaviorSelect(context),
59747                 behaviorLasso(context),
59748                 modeDragNode(context).behavior,
59749                 modeDragNote(context).behavior
59750             ];
59751
59752
59753             function checkSelectedID() {
59754                 if (!errorService) return;
59755                 var error = errorService.getError(selectedErrorID);
59756                 if (!error) {
59757                     context.enter(modeBrowse(context));
59758                 }
59759                 return error;
59760             }
59761
59762
59763             mode.zoomToSelected = function() {
59764                 if (!errorService) return;
59765                 var error = errorService.getError(selectedErrorID);
59766                 if (error) {
59767                     context.map().centerZoomEase(error.loc, 20);
59768                 }
59769             };
59770
59771
59772             mode.enter = function() {
59773                 var error = checkSelectedID();
59774                 if (!error) return;
59775
59776                 behaviors.forEach(context.install);
59777                 keybinding
59778                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
59779                     .on('⎋', esc, true);
59780
59781                 d3_select(document)
59782                     .call(keybinding);
59783
59784                 selectError();
59785
59786                 var sidebar = context.ui().sidebar;
59787                 sidebar.show(errorEditor.error(error));
59788
59789                 context.map()
59790                     .on('drawn.select-error', selectError);
59791
59792
59793                 // class the error as selected, or return to browse mode if the error is gone
59794                 function selectError(drawn) {
59795                     if (!checkSelectedID()) return;
59796
59797                     var selection = context.surface()
59798                         .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
59799
59800                     if (selection.empty()) {
59801                         // Return to browse mode if selected DOM elements have
59802                         // disappeared because the user moved them out of view..
59803                         var source = event && event.type === 'zoom' && event.sourceEvent;
59804                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
59805                             context.enter(modeBrowse(context));
59806                         }
59807
59808                     } else {
59809                         selection
59810                             .classed('selected', true);
59811
59812                         context.selectedErrorID(selectedErrorID);
59813                     }
59814                 }
59815
59816                 function esc() {
59817                     if (d3_select('.combobox').size()) return;
59818                     context.enter(modeBrowse(context));
59819                 }
59820             };
59821
59822
59823             mode.exit = function() {
59824                 behaviors.forEach(context.uninstall);
59825
59826                 d3_select(document)
59827                     .call(keybinding.unbind);
59828
59829                 context.surface()
59830                     .selectAll('.qa_error.selected')
59831                     .classed('selected hover', false);
59832
59833                 context.map()
59834                     .on('drawn.select-error', null);
59835
59836                 context.ui().sidebar
59837                     .hide();
59838
59839                 context.selectedErrorID(null);
59840                 context.features().forceVisible([]);
59841             };
59842
59843
59844             return mode;
59845         }
59846
59847         function behaviorSelect(context) {
59848             // legacy option to show menu on every click
59849             var isShowAlways = +context.storage('edit-menu-show-always') === 1;
59850             var tolerance = 4;
59851             var _lastMouse = null;
59852             var _suppressMenu = true;
59853             var _p1 = null;
59854
59855
59856             function point() {
59857                 return d3_mouse(context.container().node());
59858             }
59859
59860
59861             function keydown() {
59862                 var e = event;
59863                 if (e && e.shiftKey) {
59864                     context.surface()
59865                         .classed('behavior-multiselect', true);
59866                 }
59867
59868                 if (e && e.keyCode === 93) {  // context menu
59869                     e.preventDefault();
59870                     e.stopPropagation();
59871                 }
59872             }
59873
59874
59875             function keyup() {
59876                 var e = event;
59877                 if (!e || !e.shiftKey) {
59878                     context.surface()
59879                         .classed('behavior-multiselect', false);
59880                 }
59881
59882
59883                 if (e && e.keyCode === 93) {  // context menu
59884                     e.preventDefault();
59885                     e.stopPropagation();
59886                     contextmenu();
59887                 }
59888             }
59889
59890
59891             function mousedown() {
59892                 if (!_p1) {
59893                     _p1 = point();
59894                 }
59895                 d3_select(window)
59896                     .on('mouseup.select', mouseup, true);
59897
59898                 _suppressMenu = !isShowAlways;
59899             }
59900
59901
59902             function mousemove() {
59903                 if (event) {
59904                     _lastMouse = event;
59905                 }
59906             }
59907
59908
59909             function mouseup() {
59910                 click();
59911             }
59912
59913
59914             function contextmenu() {
59915                 var e = event;
59916                 e.preventDefault();
59917                 e.stopPropagation();
59918
59919                 if (!+e.clientX && !+e.clientY) {
59920                     if (_lastMouse) {
59921                         e.sourceEvent = _lastMouse;
59922                     } else {
59923                         return;
59924                     }
59925                 }
59926
59927                 if (!_p1) {
59928                     _p1 = point();
59929                 }
59930                 _suppressMenu = false;
59931                 click();
59932             }
59933
59934
59935             function click() {
59936                 d3_select(window)
59937                     .on('mouseup.select', null, true);
59938
59939                 if (!_p1) return;
59940                 var p2 = point();
59941                 var dist = geoVecLength(_p1, p2);
59942                 _p1 = null;
59943                 if (dist > tolerance) return;
59944
59945                 // Defer processing the click,
59946                 // because this click may trigger a blur event,
59947                 // and the blur event may trigger a tag change,
59948                 // and we really want that tag change to go to the already selected entity
59949                 // and not the one that we are about to select with the click  #6028, #5878
59950                 // (Be very careful entering modeSelect anywhere that might also blur a field!)
59951                 var datum = event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
59952                 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
59953                 window.setTimeout(function() {
59954                     processClick(datum, isMultiselect);
59955                 }, 20);  // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).
59956             }
59957
59958
59959             function processClick(datum, isMultiselect) {
59960                 var mode = context.mode();
59961
59962                 var entity = datum && datum.properties && datum.properties.entity;
59963                 if (entity) datum = entity;
59964
59965                 if (datum && datum.type === 'midpoint') {
59966                     datum = datum.parents[0];
59967                 }
59968
59969                 if (datum instanceof osmEntity) {    // clicked an entity..
59970                     var selectedIDs = context.selectedIDs();
59971                     context.selectedNoteID(null);
59972                     context.selectedErrorID(null);
59973
59974                     if (!isMultiselect) {
59975                         if (selectedIDs.length > 1 && (!_suppressMenu && !isShowAlways)) {
59976                             // multiple things already selected, just show the menu...
59977                             mode.suppressMenu(false).reselect();
59978                         } else {
59979                             // select a single thing..
59980                             context.enter(modeSelect(context, [datum.id]).suppressMenu(_suppressMenu));
59981                         }
59982
59983                     } else {
59984                         if (selectedIDs.indexOf(datum.id) !== -1) {
59985                             // clicked entity is already in the selectedIDs list..
59986                             if (!_suppressMenu && !isShowAlways) {
59987                                 // don't deselect clicked entity, just show the menu.
59988                                 mode.suppressMenu(false).reselect();
59989                             } else {
59990                                 // deselect clicked entity, then reenter select mode or return to browse mode..
59991                                 selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
59992                                 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
59993                             }
59994                         } else {
59995                             // clicked entity is not in the selected list, add it..
59996                             selectedIDs = selectedIDs.concat([datum.id]);
59997                             context.enter(modeSelect(context, selectedIDs).suppressMenu(_suppressMenu));
59998                         }
59999                     }
60000
60001                 } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
60002                     context
60003                         .selectedNoteID(null)
60004                         .enter(modeSelectData(context, datum));
60005
60006                 } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
60007                     context
60008                         .selectedNoteID(datum.id)
60009                         .enter(modeSelectNote(context, datum.id));
60010
60011                 } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
60012                     context
60013                         .selectedErrorID(datum.id)
60014                         .enter(modeSelectError(context, datum.id, datum.service));
60015
60016                 } else {    // clicked nothing..
60017                     context.selectedNoteID(null);
60018                     context.selectedErrorID(null);
60019                     if (!isMultiselect && mode.id !== 'browse') {
60020                         context.enter(modeBrowse(context));
60021                     }
60022                 }
60023
60024                 // reset for next time..
60025                 _suppressMenu = true;
60026             }
60027
60028
60029             function behavior(selection) {
60030                 _lastMouse = null;
60031                 _suppressMenu = true;
60032                 _p1 = null;
60033
60034                 d3_select(window)
60035                     .on('keydown.select', keydown)
60036                     .on('keyup.select', keyup)
60037                     .on('contextmenu.select-window', function() {
60038                         // Edge and IE really like to show the contextmenu on the
60039                         // menubar when user presses a keyboard menu button
60040                         // even after we've already preventdefaulted the key event.
60041                         var e = event;
60042                         if (+e.clientX === 0 && +e.clientY === 0) {
60043                             event.preventDefault();
60044                             event.stopPropagation();
60045                         }
60046                     });
60047
60048                 selection
60049                     .on('mousedown.select', mousedown)
60050                     .on('mousemove.select', mousemove)
60051                     .on('contextmenu.select', contextmenu);
60052
60053                 if (event && event.shiftKey) {
60054                     context.surface()
60055                         .classed('behavior-multiselect', true);
60056                 }
60057             }
60058
60059
60060             behavior.off = function(selection) {
60061                 d3_select(window)
60062                     .on('keydown.select', null)
60063                     .on('keyup.select', null)
60064                     .on('contextmenu.select-window', null)
60065                     .on('mouseup.select', null, true);
60066
60067                 selection
60068                     .on('mousedown.select', null)
60069                     .on('mousemove.select', null)
60070                     .on('contextmenu.select', null);
60071
60072                 context.surface()
60073                     .classed('behavior-multiselect', false);
60074             };
60075
60076
60077             return behavior;
60078         }
60079
60080         function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
60081
60082             var origWay = context.entity(wayID);
60083
60084             var annotation = t((origWay.isDegenerate() ?
60085                 'operations.start.annotation.' :
60086                 'operations.continue.annotation.') + context.geometry(wayID)
60087             );
60088
60089             var behavior = behaviorDraw(context);
60090             behavior.hover().initialNodeID(index ? origWay.nodes[index] :
60091                 (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
60092
60093             var _tempEdits = 0;
60094
60095             var end = osmNode({ loc: context.map().mouseCoordinates() });
60096
60097             // Push an annotated state for undo to return back to.
60098             // We must make sure to remove this edit later.
60099             context.pauseChangeDispatch();
60100             context.perform(actionNoop(), annotation);
60101             _tempEdits++;
60102
60103             // Add the drawing node to the graph.
60104             // We must make sure to remove this edit later.
60105             context.perform(_actionAddDrawNode());
60106             _tempEdits++;
60107             context.resumeChangeDispatch();
60108
60109
60110             function keydown() {
60111                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60112                     if (context.surface().classed('nope')) {
60113                         context.surface()
60114                             .classed('nope-suppressed', true);
60115                     }
60116                     context.surface()
60117                         .classed('nope', false)
60118                         .classed('nope-disabled', true);
60119                 }
60120             }
60121
60122
60123             function keyup() {
60124                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60125                     if (context.surface().classed('nope-suppressed')) {
60126                         context.surface()
60127                             .classed('nope', true);
60128                     }
60129                     context.surface()
60130                         .classed('nope-suppressed', false)
60131                         .classed('nope-disabled', false);
60132                 }
60133             }
60134
60135
60136             function allowsVertex(d) {
60137                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
60138             }
60139
60140
60141             // related code
60142             // - `mode/drag_node.js`     `doMode()`
60143             // - `behavior/draw.js`      `click()`
60144             // - `behavior/draw_way.js`  `move()`
60145             function move(datum) {
60146                 context.surface().classed('nope-disabled', event.altKey);
60147
60148                 var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
60149                 var targetNodes = datum && datum.properties && datum.properties.nodes;
60150                 var loc = context.map().mouseCoordinates();
60151
60152                 if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
60153                     loc = targetLoc;
60154
60155                 } else if (targetNodes) {   // snap to way - a line target with `.nodes`
60156                     var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
60157                     if (choice) {
60158                         loc = choice.loc;
60159                     }
60160                 }
60161
60162                 context.replace(actionMoveNode(end.id, loc));
60163                 end = context.entity(end.id);
60164                 checkGeometry(false);
60165             }
60166
60167
60168             // Check whether this edit causes the geometry to break.
60169             // If so, class the surface with a nope cursor.
60170             // `finishDraw` - Only checks the relevant line segments if finishing drawing
60171             function checkGeometry(finishDraw) {
60172                 var nopeDisabled = context.surface().classed('nope-disabled');
60173                 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
60174
60175                 if (nopeDisabled) {
60176                     context.surface()
60177                         .classed('nope', false)
60178                         .classed('nope-suppressed', isInvalid);
60179                 } else {
60180                     context.surface()
60181                         .classed('nope', isInvalid)
60182                         .classed('nope-suppressed', false);
60183                 }
60184             }
60185
60186
60187             function isInvalidGeometry(entity, graph, finishDraw) {
60188                 var parents = graph.parentWays(entity);
60189
60190                 for (var i = 0; i < parents.length; i++) {
60191                     var parent = parents[i];
60192                     var nodes = graph.childNodes(parent).slice();  // shallow copy
60193
60194                     if (origWay.isClosed()) { // Check if Area
60195                         if (finishDraw) {
60196                             if (nodes.length < 3) return false;
60197                             nodes.splice(-2, 1);
60198                             entity = nodes[nodes.length-2];
60199                         } else {
60200                             nodes.pop();
60201                         }
60202                     } else { // Line
60203                         if (finishDraw) {
60204                             nodes.pop();
60205                         }
60206                     }
60207
60208                     if (geoHasSelfIntersections(nodes, entity.id)) {
60209                         return true;
60210                     }
60211                 }
60212
60213                 return false;
60214             }
60215
60216
60217             function undone() {
60218                 context.pauseChangeDispatch();
60219                 // Undo popped the history back to the initial annotated no-op edit.
60220                 _tempEdits = 0;     // We will deal with the temp edits here
60221                 context.pop(1);     // Remove initial no-op edit
60222
60223                 if (context.graph() === baselineGraph) {    // We've undone back to the beginning
60224                     // baselineGraph may be behind startGraph if this way was added rather than continued
60225                     resetToStartGraph();
60226                     context.resumeChangeDispatch();
60227                     context.enter(modeSelect(context, [wayID]));
60228                 } else {
60229                     // Remove whatever segment was drawn previously and continue drawing
60230                     context.pop(1);
60231                     context.resumeChangeDispatch();
60232                     context.enter(mode);
60233                 }
60234             }
60235
60236
60237             function setActiveElements() {
60238                 context.surface().selectAll('.' + end.id)
60239                     .classed('active', true);
60240             }
60241
60242
60243             function resetToStartGraph() {
60244                 while (context.graph() !== startGraph) {
60245                     context.pop();
60246                 }
60247             }
60248
60249
60250             var drawWay = function(surface) {
60251                 behavior
60252                     .on('move', move)
60253                     .on('click', drawWay.add)
60254                     .on('clickWay', drawWay.addWay)
60255                     .on('clickNode', drawWay.addNode)
60256                     .on('undo', context.undo)
60257                     .on('cancel', drawWay.cancel)
60258                     .on('finish', drawWay.finish);
60259
60260                 d3_select(window)
60261                     .on('keydown.drawWay', keydown)
60262                     .on('keyup.drawWay', keyup);
60263
60264                 context.map()
60265                     .dblclickEnable(false)
60266                     .on('drawn.draw', setActiveElements);
60267
60268                 setActiveElements();
60269
60270                 surface.call(behavior);
60271
60272                 context.history()
60273                     .on('undone.draw', undone);
60274             };
60275
60276
60277             drawWay.off = function(surface) {
60278                 // Drawing was interrupted unexpectedly.
60279                 // This can happen if the user changes modes,
60280                 // clicks geolocate button, a hashchange event occurs, etc.
60281                 if (_tempEdits) {
60282                     context.pauseChangeDispatch();
60283                     context.pop(_tempEdits);
60284                     resetToStartGraph();
60285                     context.resumeChangeDispatch();
60286                 }
60287
60288                 context.map()
60289                     .on('drawn.draw', null);
60290
60291                 surface.call(behavior.off)
60292                     .selectAll('.active')
60293                     .classed('active', false);
60294
60295                 surface
60296                     .classed('nope', false)
60297                     .classed('nope-suppressed', false)
60298                     .classed('nope-disabled', false);
60299
60300                 d3_select(window)
60301                     .on('keydown.hover', null)
60302                     .on('keyup.hover', null);
60303
60304                 context.history()
60305                     .on('undone.draw', null);
60306             };
60307
60308
60309             function _actionAddDrawNode() {
60310                 return function(graph) {
60311                     return graph
60312                         .replace(end)
60313                         .replace(origWay.addNode(end.id, index));
60314                 };
60315             }
60316
60317
60318             function _actionReplaceDrawNode(newNode) {
60319                 return function(graph) {
60320                     return graph
60321                         .replace(origWay.addNode(newNode.id, index))
60322                         .remove(end);
60323                 };
60324             }
60325
60326
60327             // Accept the current position of the drawing node and continue drawing.
60328             drawWay.add = function(loc, d) {
60329                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60330                     return;   // can't click here
60331                 }
60332
60333                 context.pauseChangeDispatch();
60334                 context.pop(_tempEdits);
60335                 _tempEdits = 0;
60336
60337                 context.perform(
60338                     _actionAddDrawNode(),
60339                     annotation
60340                 );
60341
60342                 context.resumeChangeDispatch();
60343                 checkGeometry(false);   // finishDraw = false
60344                 context.enter(mode);
60345             };
60346
60347
60348             // Connect the way to an existing way.
60349             drawWay.addWay = function(loc, edge, d) {
60350                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60351                     return;   // can't click here
60352                 }
60353
60354                 context.pauseChangeDispatch();
60355                 context.pop(_tempEdits);
60356                 _tempEdits = 0;
60357
60358                 context.perform(
60359                     _actionAddDrawNode(),
60360                     actionAddMidpoint({ loc: loc, edge: edge }, end),
60361                     annotation
60362                 );
60363
60364                 context.resumeChangeDispatch();
60365                 checkGeometry(false);   // finishDraw = false
60366                 context.enter(mode);
60367             };
60368
60369
60370             // Connect the way to an existing node and continue drawing.
60371             drawWay.addNode = function(node, d) {
60372                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60373                     return;   // can't click here
60374                 }
60375
60376                 context.pauseChangeDispatch();
60377                 context.pop(_tempEdits);
60378                 _tempEdits = 0;
60379
60380                 context.perform(
60381                     _actionReplaceDrawNode(node),
60382                     annotation
60383                 );
60384
60385                 context.resumeChangeDispatch();
60386                 checkGeometry(false);   // finishDraw = false
60387                 context.enter(mode);
60388             };
60389
60390
60391             // Finish the draw operation, removing the temporary edits.
60392             // If the way has enough nodes to be valid, it's selected.
60393             // Otherwise, delete everything and return to browse mode.
60394             drawWay.finish = function() {
60395                 checkGeometry(true);   // finishDraw = true
60396                 if (context.surface().classed('nope')) {
60397                     return;   // can't click here
60398                 }
60399
60400                 context.pauseChangeDispatch();
60401                 context.pop(_tempEdits);
60402                 _tempEdits = 0;
60403
60404                 var way = context.hasEntity(wayID);
60405                 if (!way || way.isDegenerate()) {
60406                     drawWay.cancel();
60407                     return;
60408                 }
60409
60410                 context.resumeChangeDispatch();
60411
60412                 window.setTimeout(function() {
60413                     context.map().dblclickEnable(true);
60414                 }, 1000);
60415
60416                 var isNewFeature = !mode.isContinuing;
60417                 context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
60418             };
60419
60420
60421             // Cancel the draw operation, delete everything, and return to browse mode.
60422             drawWay.cancel = function() {
60423                 context.pauseChangeDispatch();
60424                 context.pop(_tempEdits);
60425                 _tempEdits = 0;
60426
60427                 resetToStartGraph();
60428                 context.resumeChangeDispatch();
60429
60430                 window.setTimeout(function() {
60431                     context.map().dblclickEnable(true);
60432                 }, 1000);
60433
60434                 context.surface()
60435                     .classed('nope', false)
60436                     .classed('nope-disabled', false)
60437                     .classed('nope-suppressed', false);
60438
60439                 context.enter(modeBrowse(context));
60440             };
60441
60442
60443             drawWay.activeID = function() {
60444                 if (!arguments.length) return end.id;
60445                 // no assign
60446                 return drawWay;
60447             };
60448
60449
60450             drawWay.tail = function(text) {
60451                 behavior.tail(text);
60452                 return drawWay;
60453             };
60454
60455
60456             return drawWay;
60457         }
60458
60459         function modeDrawLine(context, wayID, startGraph, baselineGraph, button, affix, continuing) {
60460             var mode = {
60461                 button: button,
60462                 id: 'draw-line'
60463             };
60464
60465             var behavior;
60466
60467             mode.wayID = wayID;
60468
60469             mode.isContinuing = continuing;
60470
60471             mode.enter = function() {
60472                 var way = context.entity(wayID);
60473                 var index = (affix === 'prefix') ? 0 : undefined;
60474                 var headID = (affix === 'prefix') ? way.first() : way.last();
60475
60476                 behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60477                     .tail(t('modes.draw_line.tail'));
60478
60479                 var addNode = behavior.addNode;
60480                 behavior.addNode = function(node, d) {
60481                     if (node.id === headID) {
60482                         behavior.finish();
60483                     } else {
60484                         addNode(node, d);
60485                     }
60486                 };
60487
60488                 context.install(behavior);
60489             };
60490
60491
60492             mode.exit = function() {
60493                 context.uninstall(behavior);
60494             };
60495
60496
60497             mode.selectedIDs = function() {
60498                 return [wayID];
60499             };
60500
60501
60502             mode.activeID = function() {
60503                 return (behavior && behavior.activeID()) || [];
60504             };
60505
60506             return mode;
60507         }
60508
60509         function operationContinue(selectedIDs, context) {
60510             var graph = context.graph();
60511             var entities = selectedIDs.map(function(id) { return graph.entity(id); });
60512             var geometries = Object.assign(
60513                 { line: [], vertex: [] },
60514                 utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
60515             );
60516             var vertex = geometries.vertex[0];
60517
60518
60519             function candidateWays() {
60520                 return graph.parentWays(vertex).filter(function(parent) {
60521                     return parent.geometry(graph) === 'line' &&
60522                         !parent.isClosed() &&
60523                         parent.affix(vertex.id) &&
60524                         (geometries.line.length === 0 || geometries.line[0] === parent);
60525                 });
60526             }
60527
60528
60529             var operation = function() {
60530                 var candidate = candidateWays()[0];
60531                 context.enter(
60532                     modeDrawLine(context, candidate.id, context.graph(), context.graph(), 'line', candidate.affix(vertex.id), true)
60533                 );
60534             };
60535
60536
60537             operation.available = function() {
60538                 return geometries.vertex.length === 1 &&
60539                     geometries.line.length <= 1 &&
60540                     !context.features().hasHiddenConnections(vertex, context.graph());
60541             };
60542
60543
60544             operation.disabled = function() {
60545                 var candidates = candidateWays();
60546                 if (candidates.length === 0) {
60547                     return 'not_eligible';
60548                 } else if (candidates.length > 1) {
60549                     return 'multiple';
60550                 }
60551
60552                 return false;
60553             };
60554
60555
60556             operation.tooltip = function() {
60557                 var disable = operation.disabled();
60558                 return disable ?
60559                     t('operations.continue.' + disable) :
60560                     t('operations.continue.description');
60561             };
60562
60563
60564             operation.annotation = function() {
60565                 return t('operations.continue.annotation.line');
60566             };
60567
60568
60569             operation.id = 'continue';
60570             operation.keys = [t('operations.continue.key')];
60571             operation.title = t('operations.continue.title');
60572             operation.behavior = behaviorOperation(context).which(operation);
60573
60574             return operation;
60575         }
60576
60577         function operationDisconnect(selectedIDs, context) {
60578             var vertexIDs = [];
60579             var wayIDs = [];
60580             var otherIDs = [];
60581             var actions = [];
60582
60583             selectedIDs.forEach(function(id) {
60584                 if (context.geometry(id) === 'vertex') {
60585                     vertexIDs.push(id);
60586                 } else if (context.entity(id).type === 'way'){
60587                     wayIDs.push(id);
60588                 } else {
60589                     otherIDs.push(id);
60590                 }
60591             });
60592
60593             var disconnectingWayID = (vertexIDs.length === 0 && wayIDs.length === 1 && wayIDs[0]);
60594             var extent, nodes, coords;
60595
60596             if (disconnectingWayID) {   // disconnecting a way
60597                 var way = context.entity(disconnectingWayID);
60598                 extent = way.extent(context.graph());
60599                 nodes = utilGetAllNodes([disconnectingWayID], context.graph());
60600                 coords = nodes.map(function(n) { return n.loc; });
60601
60602                 way.nodes.forEach(function(vertexID) {
60603                     var action = actionDisconnect(vertexID).limitWays(wayIDs);
60604                     if (action.disabled(context.graph()) !== 'not_connected') {
60605                         actions.push(action);
60606                     }
60607                 });
60608
60609             } else {    // disconnecting a vertex
60610                 vertexIDs.forEach(function(vertexID) {
60611                     var action = actionDisconnect(vertexID);
60612
60613                     if (wayIDs.length > 0) {
60614                         var waysIDsForVertex = wayIDs.filter(function(wayID) {
60615                             var way = context.entity(wayID);
60616                             return way.nodes.indexOf(vertexID) !== -1;
60617                         });
60618                         action.limitWays(waysIDsForVertex);
60619                     }
60620                     actions.push(action);
60621                 });
60622             }
60623
60624
60625             var operation = function() {
60626                 context.perform(function(graph) {
60627                     return actions.reduce(function(graph, action) { return action(graph); }, graph);
60628                 }, operation.annotation());
60629
60630                 context.validator().validate();
60631             };
60632
60633
60634             operation.available = function() {
60635                 if (actions.length === 0) return false;
60636                 if (otherIDs.length !== 0) return false;
60637
60638                 if (vertexIDs.length !== 0 && wayIDs.length !== 0 && !wayIDs.every(function(wayID) {
60639                     return vertexIDs.some(function(vertexID) {
60640                         var way = context.entity(wayID);
60641                         return way.nodes.indexOf(vertexID) !== -1;
60642                     });
60643                 })) return false;
60644
60645                 return true;
60646             };
60647
60648
60649             operation.disabled = function() {
60650                 var reason;
60651                 for (var actionIndex in actions) {
60652                     reason = actions[actionIndex].disabled(context.graph());
60653                     if (reason) return reason;
60654                 }
60655
60656                 if (disconnectingWayID && extent.percentContainedIn(context.extent()) < 0.8) {
60657                     return 'too_large.single';
60658                 } else if (disconnectingWayID && someMissing()) {
60659                     return 'not_downloaded';
60660                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
60661                     return 'connected_to_hidden';
60662                 }
60663
60664                 return false;
60665
60666
60667                 function someMissing() {
60668                     if (context.inIntro()) return false;
60669                     var osm = context.connection();
60670                     if (osm) {
60671                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
60672                         if (missing.length) {
60673                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
60674                             return true;
60675                         }
60676                     }
60677                     return false;
60678                 }
60679             };
60680
60681
60682             operation.tooltip = function() {
60683                 var disable = operation.disabled();
60684                 if (disable) {
60685                     return t('operations.disconnect.' + disable);
60686                 }
60687                 if (disconnectingWayID) {
60688                     return t('operations.disconnect.' + context.geometry(disconnectingWayID) + '.description');
60689                 }
60690                 return t('operations.disconnect.description');
60691             };
60692
60693
60694             operation.annotation = function() {
60695                 return t('operations.disconnect.annotation');
60696             };
60697
60698
60699             operation.id = 'disconnect';
60700             operation.keys = [t('operations.disconnect.key')];
60701             operation.title = t('operations.disconnect.title');
60702             operation.behavior = behaviorOperation(context).which(operation);
60703
60704             return operation;
60705         }
60706
60707         function operationDowngrade(selectedIDs, context) {
60708             var affectedFeatureCount = 0;
60709             var downgradeType;
60710
60711             setDowngradeTypeForEntityIDs();
60712
60713             var multi = affectedFeatureCount === 1 ? 'single' : 'multiple';
60714
60715             function setDowngradeTypeForEntityIDs() {
60716                 for (var i in selectedIDs) {
60717                     var entityID = selectedIDs[i];
60718                     var type = downgradeTypeForEntityID(entityID);
60719                     if (type) {
60720                         affectedFeatureCount += 1;
60721                         if (downgradeType && type !== downgradeType) {
60722                             downgradeType = 'building_address';
60723                         } else {
60724                             downgradeType = type;
60725                         }
60726                     }
60727                 }
60728             }
60729
60730             function downgradeTypeForEntityID(entityID) {
60731                 var graph = context.graph();
60732                 var entity = graph.entity(entityID);
60733                 var preset = context.presets().match(entity, graph);
60734
60735                 if (preset.isFallback()) return null;
60736
60737                 if (entity.type === 'node' &&
60738                     preset.id !== 'address' &&
60739                     Object.keys(entity.tags).some(function(key) {
60740                         return key.match(/^addr:.{1,}/);
60741                     })) {
60742
60743                     return 'address';
60744                 }
60745                 if (entity.geometry(graph) === 'area' &&
60746                     entity.tags.building &&
60747                     !preset.tags.building) {
60748
60749                     return 'building';
60750                 }
60751
60752                 return null;
60753             }
60754
60755             var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
60756             var addressKeysToKeep = ['source'];
60757
60758             var operation = function () {
60759                 context.perform(function(graph) {
60760
60761                     for (var i in selectedIDs) {
60762                         var entityID = selectedIDs[i];
60763                         var type = downgradeTypeForEntityID(entityID);
60764                         if (!type) continue;
60765
60766                         var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
60767                         for (var key in tags) {
60768                             if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
60769                             if (type === 'building') {
60770                                 if (buildingKeysToKeep.indexOf(key) !== -1 ||
60771                                     key.match(/^building:.{1,}/) ||
60772                                     key.match(/^roof:.{1,}/)) continue;
60773                             }
60774                             // keep address tags for buildings too
60775                             if (key.match(/^addr:.{1,}/)) continue;
60776
60777                             delete tags[key];
60778                         }
60779                         graph = actionChangeTags(entityID, tags)(graph);
60780                     }
60781                     return graph;
60782                 }, operation.annotation());
60783
60784                 context.validator().validate();
60785
60786                 // refresh the select mode to enable the delete operation
60787                 context.enter(modeSelect(context, selectedIDs));
60788             };
60789
60790
60791             operation.available = function () {
60792                 return downgradeType;
60793             };
60794
60795
60796             operation.disabled = function () {
60797                 if (selectedIDs.some(hasWikidataTag)) {
60798                     return 'has_wikidata_tag';
60799                 }
60800                 return false;
60801
60802                 function hasWikidataTag(id) {
60803                     var entity = context.entity(id);
60804                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
60805                 }
60806             };
60807
60808
60809             operation.tooltip = function () {
60810                 var disable = operation.disabled();
60811                 return disable ?
60812                     t('operations.downgrade.' + disable + '.' + multi) :
60813                     t('operations.downgrade.description.' + downgradeType);
60814             };
60815
60816
60817             operation.annotation = function () {
60818                 var suffix;
60819                 if (downgradeType === 'building_address') {
60820                     suffix = 'multiple';
60821                 } else {
60822                     suffix = downgradeType + '.' + multi;
60823                 }
60824                 return t('operations.downgrade.annotation.' + suffix, { n: affectedFeatureCount});
60825             };
60826
60827
60828             operation.id = 'downgrade';
60829             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
60830             operation.title = t('operations.downgrade.title');
60831             operation.behavior = behaviorOperation(context).which(operation);
60832
60833
60834             return operation;
60835         }
60836
60837         function operationExtract(selectedIDs, context) {
60838             var entityID = selectedIDs.length && selectedIDs[0];
60839             var action = actionExtract(entityID, context.projection);
60840
60841             var geometry = entityID && context.geometry(entityID);
60842             var extent = geometry === 'area' && context.entity(entityID).extent(context.graph());
60843
60844
60845             var operation = function () {
60846                 context.perform(action);  // do the extract
60847                 context.validator().validate();
60848
60849                 var extractedNodeID = action.getExtractedNodeID();
60850
60851                 var mouse = context.map().mouseCoordinates();
60852                 if (mouse.some(isNaN)) {
60853                     enterMoveMode();
60854
60855                 } else {
60856                     // move detached node to the mouse location (transitioned)
60857                     context.perform(actionMoveNode(extractedNodeID, mouse));
60858
60859                     // after transition completes, put at final mouse location and enter move mode.
60860                     window.setTimeout(function() {
60861                         mouse = context.map().mouseCoordinates();
60862                         context.replace(actionMoveNode(extractedNodeID, mouse));
60863                         enterMoveMode();
60864                     }, 150);
60865                 }
60866
60867                 function enterMoveMode() {
60868                     var baseGraph = context.graph();
60869                     context.enter(modeMove(context, [extractedNodeID], baseGraph));
60870                 }
60871             };
60872
60873
60874             operation.available = function () {
60875                 if (selectedIDs.length !== 1) return false;
60876
60877                 var graph = context.graph();
60878                 var entity = graph.hasEntity(entityID);
60879                 if (!entity) return false;
60880
60881                 if (!entity.hasInterestingTags()) return false;
60882
60883                 if (geometry === 'area') {
60884                     var preset = context.presets().match(entity, graph);
60885                     return preset.geometry.indexOf('point') !== -1;
60886                 }
60887
60888                 return entity.type === 'node' && graph.parentWays(entity).length > 0;
60889             };
60890
60891
60892             operation.disabled = function () {
60893                 var reason = action.disabled(context.graph());
60894                 if (reason) {
60895                     return reason;
60896                 } else if (geometry === 'vertex' && selectedIDs.some(context.hasHiddenConnections)) {
60897                     return 'connected_to_hidden';
60898                 } else if (extent && extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
60899                     return 'too_large';
60900                 }
60901
60902                 return false;
60903             };
60904
60905
60906             operation.tooltip = function () {
60907                 var disableReason = operation.disabled();
60908                 if (disableReason) {
60909                     return t('operations.extract.' + disableReason + '.' + geometry + '.single',
60910                         { relation: context.presets().item('type/restriction').name() });
60911                 } else {
60912                     return t('operations.extract.description.' + geometry + '.single');
60913                 }
60914             };
60915
60916
60917             operation.annotation = function () {
60918                 return t('operations.extract.annotation.single');
60919             };
60920
60921
60922             operation.id = 'extract';
60923             operation.keys = [t('operations.extract.key')];
60924             operation.title = t('operations.extract.title');
60925             operation.behavior = behaviorOperation(context).which(operation);
60926
60927
60928             return operation;
60929         }
60930
60931         function operationMerge(selectedIDs, context) {
60932
60933             function updatePresetTags(newGraph, ids) {
60934                 var id = ids[0];
60935                 var newEntity = newGraph.hasEntity(id);
60936
60937                 if (!newEntity) return;
60938                 var newPreset = context.presets().match(newEntity, newGraph);
60939                 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
60940             }
60941
60942
60943             var join = actionJoin(selectedIDs);
60944             var merge = actionMerge(selectedIDs);
60945             var mergePolygon = actionMergePolygon(selectedIDs);
60946             var mergeNodes = actionMergeNodes(selectedIDs);
60947
60948
60949             var operation = function() {
60950                 var doUpdateTags;
60951                 var action;
60952
60953                 if (!join.disabled(context.graph())) {
60954                     doUpdateTags = false;
60955                     action = join;
60956                 } else if (!merge.disabled(context.graph())) {
60957                     doUpdateTags = true;
60958                     action = merge;
60959                 } else if (!mergePolygon.disabled(context.graph())) {
60960                     doUpdateTags = false;
60961                     action = mergePolygon;
60962                 } else {
60963                     doUpdateTags = true;
60964                     action = mergeNodes;
60965                 }
60966
60967                 context.perform(action, operation.annotation());
60968
60969                 var ids = selectedIDs.filter(function(id) {
60970                     var entity = context.hasEntity(id);
60971                     return entity && entity.type !== 'node';
60972                 });
60973
60974                 // if we merged tags, rematch preset to update tags if necessary (#3851)
60975                 if (doUpdateTags) {
60976                     updatePresetTags(context.graph(), ids);
60977                 }
60978
60979                 context.validator().validate();
60980                 context.enter(modeSelect(context, ids));
60981             };
60982
60983
60984             operation.available = function() {
60985                 return selectedIDs.length >= 2;
60986             };
60987
60988
60989             operation.disabled = function() {
60990                 return join.disabled(context.graph()) &&
60991                     merge.disabled(context.graph()) &&
60992                     mergePolygon.disabled(context.graph()) &&
60993                     mergeNodes.disabled(context.graph());
60994             };
60995
60996
60997             operation.tooltip = function() {
60998                 var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
60999                 var m = merge.disabled(context.graph());         // 'not_eligible'
61000                 var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
61001                 var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
61002
61003                 // disabled for one of various reasons
61004                 if (j && m && p && n) {
61005                     if (j === 'restriction' || n === 'restriction') {
61006                         return t('operations.merge.restriction',
61007                             { relation: context.presets().item('type/restriction').name() });
61008
61009                     } else if (p === 'incomplete_relation') {
61010                         return t('operations.merge.incomplete_relation');
61011
61012                     } else if (n === 'relation') {
61013                         return t('operations.merge.relation');
61014
61015                     } else {
61016                         return t('operations.merge.' + j);
61017                     }
61018
61019                 } else {
61020                     return t('operations.merge.description');
61021                 }
61022             };
61023
61024
61025             operation.annotation = function() {
61026                 return t('operations.merge.annotation', { n: selectedIDs.length });
61027             };
61028
61029
61030             operation.id = 'merge';
61031             operation.keys = [t('operations.merge.key')];
61032             operation.title = t('operations.merge.title');
61033             operation.behavior = behaviorOperation(context).which(operation);
61034
61035             return operation;
61036         }
61037
61038         function operationReverse(selectedIDs, context) {
61039             var entityID = selectedIDs[0];
61040
61041             var operation = function() {
61042                 context.perform(actionReverse(entityID), operation.annotation());
61043                 context.validator().validate();
61044             };
61045
61046
61047             operation.available = function() {
61048                 return selectedIDs.length === 1 && context.geometry(entityID) === 'line';
61049             };
61050
61051
61052             operation.disabled = function() {
61053                 return false;
61054             };
61055
61056
61057             operation.tooltip = function() {
61058                 return t('operations.reverse.description');
61059             };
61060
61061
61062             operation.annotation = function() {
61063                 return t('operations.reverse.annotation');
61064             };
61065
61066
61067             operation.id = 'reverse';
61068             operation.keys = [t('operations.reverse.key')];
61069             operation.title = t('operations.reverse.title');
61070             operation.behavior = behaviorOperation(context).which(operation);
61071
61072             return operation;
61073         }
61074
61075         function operationSplit(selectedIDs, context) {
61076             var vertices = selectedIDs
61077                 .filter(function(id) { return context.geometry(id) === 'vertex'; });
61078             var entityID = vertices[0];
61079             var action = actionSplit(entityID);
61080             var ways = [];
61081
61082             if (vertices.length === 1) {
61083                 if (entityID && selectedIDs.length > 1) {
61084                     var ids = selectedIDs.filter(function(id) { return id !== entityID; });
61085                     action.limitWays(ids);
61086                 }
61087                 ways = action.ways(context.graph());
61088             }
61089
61090
61091             var operation = function() {
61092                 var difference = context.perform(action, operation.annotation());
61093                 context.enter(modeSelect(context, difference.extantIDs()));
61094             };
61095
61096
61097             operation.available = function() {
61098                 return vertices.length === 1;
61099             };
61100
61101
61102             operation.disabled = function() {
61103                 var reason = action.disabled(context.graph());
61104                 if (reason) {
61105                     return reason;
61106                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61107                     return 'connected_to_hidden';
61108                 }
61109
61110                 return false;
61111             };
61112
61113
61114             operation.tooltip = function() {
61115                 var disable = operation.disabled();
61116                 if (disable) {
61117                     return t('operations.split.' + disable);
61118                 } else if (ways.length === 1) {
61119                     return t('operations.split.description.' + context.geometry(ways[0].id));
61120                 } else {
61121                     return t('operations.split.description.multiple');
61122                 }
61123             };
61124
61125
61126             operation.annotation = function() {
61127                 return ways.length === 1 ?
61128                     t('operations.split.annotation.' + context.geometry(ways[0].id)) :
61129                     t('operations.split.annotation.multiple', { n: ways.length });
61130             };
61131
61132
61133             operation.id = 'split';
61134             operation.keys = [t('operations.split.key')];
61135             operation.title = t('operations.split.title');
61136             operation.behavior = behaviorOperation(context).which(operation);
61137
61138             return operation;
61139         }
61140
61141         function operationStraighten(selectedIDs, context) {
61142             var wayIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'w'; });
61143             var nodeIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'n'; });
61144
61145             var nodes = utilGetAllNodes(selectedIDs, context.graph());
61146             var coords = nodes.map(function(n) { return n.loc; });
61147             var action = chooseAction();
61148             var geometry;
61149
61150
61151             function chooseAction() {
61152                 // straighten selected nodes
61153                 if (wayIDs.length === 0 && nodeIDs.length > 2) {
61154                     geometry = 'points';
61155                     return actionStraightenNodes(nodeIDs, context.projection);
61156
61157                 // straighten selected ways (possibly between range of 2 selected nodes)
61158                 } else if (wayIDs.length > 0 && (nodeIDs.length === 0 || nodeIDs.length === 2)) {
61159                     var startNodeIDs = [];
61160                     var endNodeIDs = [];
61161
61162                     for (var i = 0; i < selectedIDs.length; i++) {
61163                         var entity = context.entity(selectedIDs[i]);
61164                         if (entity.type === 'node') {
61165                             continue;
61166                         } else if (entity.type !== 'way' || entity.isClosed()) {
61167                             return false;  // exit early, can't straighten these
61168                         }
61169
61170                         startNodeIDs.push(entity.first());
61171                         endNodeIDs.push(entity.last());
61172                     }
61173
61174                     // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
61175                     startNodeIDs = startNodeIDs.filter(function(n) {
61176                         return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
61177                     });
61178                     endNodeIDs = endNodeIDs.filter(function(n) {
61179                         return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
61180                     });
61181
61182                     // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
61183                     if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
61184                         utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return false;
61185
61186                     // Ensure path contains at least 3 unique nodes
61187                     var wayNodeIDs = utilGetAllNodes(wayIDs, context.graph())
61188                         .map(function(node) { return node.id; });
61189                     if (wayNodeIDs.length <= 2) return false;
61190
61191                     // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
61192                     if (nodeIDs.length === 2 && (
61193                         wayNodeIDs.indexOf(nodeIDs[0]) === -1 || wayNodeIDs.indexOf(nodeIDs[1]) === -1
61194                     )) return false;
61195
61196                     geometry = 'line';
61197                     return actionStraightenWay(selectedIDs, context.projection);
61198                 }
61199
61200                 return false;
61201             }
61202
61203
61204             function operation() {
61205                 if (!action) return;
61206
61207                 context.perform(action, operation.annotation());
61208
61209                 window.setTimeout(function() {
61210                     context.validator().validate();
61211                 }, 300);  // after any transition
61212             }
61213
61214
61215             operation.available = function() {
61216                 return Boolean(action);
61217             };
61218
61219
61220             operation.disabled = function() {
61221                 var reason = action.disabled(context.graph());
61222                 if (reason) {
61223                     return reason;
61224                 } else if (someMissing()) {
61225                     return 'not_downloaded';
61226                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61227                     return 'connected_to_hidden';
61228                 }
61229
61230                 return false;
61231
61232
61233                 function someMissing() {
61234                     if (context.inIntro()) return false;
61235                     var osm = context.connection();
61236                     if (osm) {
61237                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
61238                         if (missing.length) {
61239                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
61240                             return true;
61241                         }
61242                     }
61243                     return false;
61244                 }
61245             };
61246
61247
61248             operation.tooltip = function() {
61249                 var disable = operation.disabled();
61250                 return disable ?
61251                     t('operations.straighten.' + disable) :
61252                     t('operations.straighten.description.' + geometry);
61253             };
61254
61255
61256             operation.annotation = function() {
61257                 return t('operations.straighten.annotation.' + geometry);
61258             };
61259
61260
61261             operation.id = 'straighten';
61262             operation.keys = [t('operations.straighten.key')];
61263             operation.title = t('operations.straighten.title');
61264             operation.behavior = behaviorOperation(context).which(operation);
61265
61266             return operation;
61267         }
61268
61269
61270
61271         var Operations = /*#__PURE__*/Object.freeze({
61272                 operationCircularize: operationCircularize,
61273                 operationContinue: operationContinue,
61274                 operationDelete: operationDelete,
61275                 operationDisconnect: operationDisconnect,
61276                 operationDowngrade: operationDowngrade,
61277                 operationExtract: operationExtract,
61278                 operationMerge: operationMerge,
61279                 operationMove: operationMove,
61280                 operationOrthogonalize: operationOrthogonalize,
61281                 operationReflectShort: operationReflectShort,
61282                 operationReflectLong: operationReflectLong,
61283                 operationReverse: operationReverse,
61284                 operationRotate: operationRotate,
61285                 operationSplit: operationSplit,
61286                 operationStraighten: operationStraighten
61287         });
61288
61289         function uiEditMenu(context, operations) {
61290             var menu;
61291             var center = [0, 0];
61292             var offset = [0, 0];
61293             var tooltip;
61294
61295             var p = 8;               // top padding
61296             var m = 4;               // top margin
61297             var h = 15;              // height of icon
61298             var vpBottomMargin = 45; // viewport bottom margin
61299             var vpSideMargin = 35;   // viewport side margin
61300             var buttonWidth = 44;
61301             var buttonHeight = (2 * p + h);
61302             var menuWidth = buttonWidth;
61303             var menuHeight = (2 * m) + operations.length * buttonHeight;
61304             var menuSideMargin = 10;
61305             var tooltipWidth = 200;
61306             var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
61307
61308
61309             var editMenu = function (selection) {
61310                 if (!operations.length) return;
61311
61312                 selection.node().parentNode.focus();
61313
61314                 var isRTL = textDirection === 'rtl';
61315                 var viewport = context.surfaceRect();
61316
61317                 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
61318                     // menu is going left-to-right and near right viewport edge, go left instead
61319                     isRTL = true;
61320                 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
61321                     // menu is going right-to-left and near left viewport edge, go right instead
61322                     isRTL = false;
61323                 }
61324
61325                 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
61326
61327                 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
61328                     // menu is near bottom viewport edge, shift upwards
61329                     offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
61330                 }
61331
61332                 var origin = geoVecAdd(center, offset);
61333
61334                 menu = selection
61335                     .append('g')
61336                     .attr('class', 'edit-menu')
61337                     .attr('transform', 'translate(' + origin + ')')
61338                     .attr('opacity', 0);
61339
61340                 menu
61341                     .transition()
61342                     .attr('opacity', 1);
61343
61344                 menu
61345                     .append('rect')
61346                     .attr('class', 'edit-menu-background')
61347                     .attr('x', 4)
61348                     .attr('rx', 4)
61349                     .attr('ry', 4)
61350                     .attr('width', menuWidth)
61351                     .attr('height', menuHeight)
61352                     .attr('stroke-linecap', 'round');
61353
61354
61355                 var buttons = menu.selectAll('.edit-menu-item')
61356                     .data(operations);
61357
61358                 // enter
61359                 var buttonsEnter = buttons.enter()
61360                     .append('g')
61361                     .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
61362                     .attr('transform', function(d, i) {
61363                         return 'translate(' + geoVecFloor([0, m + i * buttonHeight]).join(',') + ')';
61364                     });
61365
61366                 buttonsEnter
61367                     .append('rect')
61368                     .attr('x', 4)
61369                     .attr('width', buttonWidth)
61370                     .attr('height', buttonHeight)
61371                     .on('click', click)
61372                     .on('mousedown', mousedown)
61373                     .on('mouseover', mouseover)
61374                     .on('mouseout', mouseout);
61375
61376                 buttonsEnter
61377                     .append('use')
61378                     .attr('width', '20')
61379                     .attr('height', '20')
61380                     .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
61381                     .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
61382
61383                 // update
61384                 buttons = buttonsEnter
61385                     .merge(buttons)
61386                     .classed('disabled', function(d) { return d.disabled(); });
61387
61388
61389                 tooltip = d3_select('#id-container')
61390                     .append('div')
61391                     .attr('class', 'tooltip-inner edit-menu-tooltip');
61392
61393
61394                 function click(operation) {
61395                     event.stopPropagation();
61396                     if (operation.disabled()) return;
61397                     operation();
61398                     editMenu.close();
61399                 }
61400
61401                 function mousedown() {
61402                     event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
61403                 }
61404
61405                 function mouseover(d, i) {
61406                     var tipX, tipY;
61407
61408                     if (!isRTL) {
61409                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61410                     } else {
61411                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61412                     }
61413
61414                     if (tipX + tooltipWidth > viewport.right) {
61415                         // tip is going left-to-right and near right viewport edge, go left instead
61416                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61417                     } else if (tipX < viewport.left) {
61418                         // tip is going right-to-left and near left viewport edge, go right instead
61419                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61420                     }
61421
61422                     tipY = viewport.top + origin[1] + (i * buttonHeight);
61423                     if (tipY + tooltipHeight > viewport.bottom) {
61424                         // tip is near bottom viewport edge, shift upwards
61425                         tipY -= tipY + tooltipHeight - viewport.bottom;
61426                     }
61427
61428                     tooltip
61429                         .style('left', tipX + 'px')
61430                         .style('top', tipY + 'px')
61431                         .style('display', 'block')
61432                         .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
61433
61434                     // update disabled again, just in case tooltip and disabled state disagree
61435                     // https://github.com/openstreetmap/iD/issues/6296#issuecomment-489259027
61436                     d3_select(this.parentNode)
61437                         .classed('disabled', d.disabled());
61438
61439                 }
61440
61441                 function mouseout() {
61442                     tooltip.style('display', 'none');
61443                 }
61444             };
61445
61446
61447             editMenu.close = function () {
61448                 if (menu) {
61449                     menu
61450                         .style('pointer-events', 'none')
61451                         .transition()
61452                         .attr('opacity', 0)
61453                         .remove();
61454                 }
61455
61456                 if (tooltip) {
61457                     tooltip.remove();
61458                 }
61459             };
61460
61461
61462             editMenu.center = function(val) {
61463                 if (!arguments.length) return center;
61464                 center = val;
61465                 return editMenu;
61466             };
61467
61468
61469             return editMenu;
61470         }
61471
61472         function uiSelectionList(context, selectedIDs) {
61473
61474             function selectEntity(entity) {
61475                 context.enter(modeSelect(context, [entity.id]));
61476             }
61477
61478
61479             function deselectEntity(entity) {
61480                 event.stopPropagation();
61481                 var index = selectedIDs.indexOf(entity.id);
61482                 if (index > -1) {
61483                     selectedIDs.splice(index, 1);
61484                 }
61485                 context.enter(modeSelect(context, selectedIDs));
61486             }
61487
61488
61489             function selectionList(selection) {
61490                 selection.classed('selection-list-pane', true);
61491
61492                 var header = selection
61493                     .append('div')
61494                     .attr('class', 'header fillL cf');
61495
61496                 header
61497                     .append('h3')
61498                     .text(t('inspector.multiselect'));
61499
61500                 var listWrap = selection
61501                     .append('div')
61502                     .attr('class', 'inspector-body');
61503
61504                 var list = listWrap
61505                     .append('div')
61506                     .attr('class', 'feature-list cf');
61507
61508
61509                 context.history()
61510                     .on('change.selectionList', function(difference) {
61511                         if (difference) drawList();
61512                     });
61513
61514                 drawList();
61515
61516
61517                 function drawList() {
61518                     var entities = selectedIDs
61519                         .map(function(id) { return context.hasEntity(id); })
61520                         .filter(function(entity) { return entity; });
61521
61522                     var items = list.selectAll('.feature-list-item')
61523                         .data(entities, osmEntity.key);
61524
61525                     items.exit()
61526                         .remove();
61527
61528                     // Enter
61529                     var enter = items.enter()
61530                         .append('div')
61531                         .attr('class', 'feature-list-item')
61532                         .on('click', selectEntity);
61533
61534                     enter
61535                         .each(function(d) {
61536                             d3_select(this).on('mouseover', function() {
61537                                 utilHighlightEntities([d.id], true, context);
61538                             });
61539                             d3_select(this).on('mouseout', function() {
61540                                 utilHighlightEntities([d.id], false, context);
61541                             });
61542                         });
61543
61544                     var label = enter
61545                         .append('button')
61546                         .attr('class', 'label');
61547
61548                     enter
61549                         .append('button')
61550                         .attr('class', 'close')
61551                         .on('click', deselectEntity)
61552                         .call(svgIcon('#iD-icon-close'));
61553
61554                     label
61555                         .append('span')
61556                         .attr('class', 'entity-geom-icon')
61557                         .call(svgIcon('', 'pre-text'));
61558
61559                     label
61560                         .append('span')
61561                         .attr('class', 'entity-type');
61562
61563                     label
61564                         .append('span')
61565                         .attr('class', 'entity-name');
61566
61567                     // Update
61568                     items = items.merge(enter);
61569
61570                     items.selectAll('.entity-geom-icon use')
61571                         .attr('href', function() {
61572                             var entity = this.parentNode.parentNode.__data__;
61573                             return '#iD-icon-' + context.geometry(entity.id);
61574                         });
61575
61576                     items.selectAll('.entity-type')
61577                         .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
61578
61579                     items.selectAll('.entity-name')
61580                         .text(function(entity) { return utilDisplayName(entity); });
61581                 }
61582             }
61583
61584             return selectionList;
61585         }
61586
61587         function uiRadialMenu(context, operations) {
61588             var menu;
61589             var center = [0, 0];
61590             var tooltip;
61591
61592
61593             var radialMenu = function(selection) {
61594                 if (!operations.length) return;
61595
61596                 selection.node().parentNode.focus();
61597
61598                 function click(operation) {
61599                     event.stopPropagation();
61600                     if (operation.disabled()) return;
61601                     operation();
61602                     radialMenu.close();
61603                 }
61604
61605                 menu = selection
61606                     .append('g')
61607                     .attr('class', 'radial-menu')
61608                     .attr('transform', 'translate(' + center + ')')
61609                     .attr('opacity', 0);
61610
61611                 menu
61612                     .transition()
61613                     .attr('opacity', 1);
61614
61615                 var r = 50;
61616                 var a = Math.PI / 4;
61617                 var a0 = -Math.PI / 4;
61618                 var a1 = a0 + (operations.length - 1) * a;
61619
61620                 menu
61621                     .append('path')
61622                     .attr('class', 'radial-menu-background')
61623                     .attr('d', 'M' + r * Math.sin(a0) + ',' +
61624                                      r * Math.cos(a0) +
61625                               ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
61626                                      (r * Math.sin(a1) + 1e-3) + ',' +
61627                                      (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
61628                     .attr('stroke-width', 50)
61629                     .attr('stroke-linecap', 'round');
61630
61631                 var button = menu.selectAll()
61632                     .data(operations)
61633                     .enter()
61634                     .append('g')
61635                     .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
61636                     .classed('disabled', function(d) { return d.disabled(); })
61637                     .attr('transform', function(d, i) {
61638                         return 'translate(' + geoVecFloor([
61639                                 r * Math.sin(a0 + i * a),
61640                                 r * Math.cos(a0 + i * a)]).join(',') + ')';
61641                     });
61642
61643                 button
61644                     .append('circle')
61645                     .attr('r', 15)
61646                     .on('click', click)
61647                     .on('mousedown', mousedown)
61648                     .on('mouseover', mouseover)
61649                     .on('mouseout', mouseout);
61650
61651                 button
61652                     .append('use')
61653                     .attr('transform', 'translate(-10,-10)')
61654                     .attr('width', '20')
61655                     .attr('height', '20')
61656                     .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
61657
61658                 tooltip = d3_select(document.body)
61659                     .append('div')
61660                     .attr('class', 'tooltip-inner radial-menu-tooltip');
61661
61662                 function mousedown() {
61663                     event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
61664                 }
61665
61666                 function mouseover(d, i) {
61667                     var rect = context.surfaceRect();
61668                     var angle = a0 + i * a;
61669                     var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
61670                     var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
61671                     var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
61672                     var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
61673
61674                     tooltip
61675                         .style('top', null)
61676                         .style('left', null)
61677                         .style('bottom', null)
61678                         .style('right', null)
61679                         .style('display', 'block')
61680                         .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
61681
61682                     if (i === 0) {
61683                         tooltip
61684                             .style('right', right)
61685                             .style('top', top);
61686                     } else if (i >= 4) {
61687                         tooltip
61688                             .style('left', left)
61689                             .style('bottom', bottom);
61690                     } else {
61691                         tooltip
61692                             .style('left', left)
61693                             .style('top', top);
61694                     }
61695                 }
61696
61697                 function mouseout() {
61698                     tooltip.style('display', 'none');
61699                 }
61700             };
61701
61702
61703             radialMenu.close = function() {
61704                 if (menu) {
61705                     menu
61706                         .style('pointer-events', 'none')
61707                         .transition()
61708                         .attr('opacity', 0)
61709                         .remove();
61710                 }
61711
61712                 if (tooltip) {
61713                     tooltip.remove();
61714                 }
61715             };
61716
61717
61718             radialMenu.center = function(_) {
61719                 if (!arguments.length) return center;
61720                 center = _;
61721                 return radialMenu;
61722             };
61723
61724
61725             return radialMenu;
61726         }
61727
61728         var _relatedParent;
61729
61730
61731         function modeSelect(context, selectedIDs) {
61732             var mode = {
61733                 id: 'select',
61734                 button: 'browse'
61735             };
61736
61737             var keybinding = utilKeybinding('select');
61738             var behaviors = [
61739                 behaviorCopy(context),
61740                 behaviorPaste(context),
61741                 behaviorBreathe(),
61742                 behaviorHover(context),
61743                 behaviorSelect(context),
61744                 behaviorLasso(context),
61745                 modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
61746                 modeDragNote(context).behavior
61747             ];
61748             var editMenu;
61749             var _timeout = null;
61750             var _newFeature = false;
61751             var _suppressMenu = true;
61752             var _follow = false;
61753
61754
61755             var wrap = context.container()
61756                 .select('.inspector-wrap');
61757
61758
61759             function singular() {
61760                 if (selectedIDs && selectedIDs.length === 1) {
61761                     return context.hasEntity(selectedIDs[0]);
61762                 }
61763             }
61764
61765
61766             function checkSelectedIDs() {
61767                 var ids = [];
61768                 if (Array.isArray(selectedIDs)) {
61769                     ids = selectedIDs.filter(function(id) {
61770                         return context.hasEntity(id);
61771                     });
61772                 }
61773
61774                 if (ids.length) {
61775                     selectedIDs = ids;
61776                 } else {
61777                     context.enter(modeBrowse(context));
61778                 }
61779                 return !!ids.length;
61780             }
61781
61782
61783             // find the common parent ways for nextVertex, previousVertex
61784             function commonParents() {
61785                 var graph = context.graph();
61786                 var commonParents = [];
61787
61788                 for (var i = 0; i < selectedIDs.length; i++) {
61789                     var entity = context.hasEntity(selectedIDs[i]);
61790                     if (!entity || entity.geometry(graph) !== 'vertex') {
61791                         return [];  // selection includes some not vertexes
61792                     }
61793
61794                     var currParents = graph.parentWays(entity).map(function(w) { return w.id; });
61795                     if (!commonParents.length) {
61796                         commonParents = currParents;
61797                         continue;
61798                     }
61799
61800                     commonParents = utilArrayIntersection(commonParents, currParents);
61801                     if (!commonParents.length) {
61802                         return [];
61803                     }
61804                 }
61805
61806                 return commonParents;
61807             }
61808
61809
61810             function singularParent() {
61811                 var parents = commonParents();
61812                 if (!parents || parents.length === 0) {
61813                     _relatedParent = null;
61814                     return null;
61815                 }
61816
61817                 // relatedParent is used when we visit a vertex with multiple
61818                 // parents, and we want to remember which parent line we started on.
61819
61820                 if (parents.length === 1) {
61821                     _relatedParent = parents[0];  // remember this parent for later
61822                     return _relatedParent;
61823                 }
61824
61825                 if (parents.indexOf(_relatedParent) !== -1) {
61826                     return _relatedParent;   // prefer the previously seen parent
61827                 }
61828
61829                 return parents[0];
61830             }
61831
61832
61833             function closeMenu() {
61834                 if (editMenu) {
61835                     context.surface().call(editMenu.close);
61836                 }
61837             }
61838
61839
61840             function positionMenu() {
61841                 if (!editMenu) return;
61842
61843                 var entity = singular();
61844                 if (entity && context.geometry(entity.id) === 'relation') {
61845                     _suppressMenu = true;
61846                 } else {
61847                     var point = context.mouse();
61848                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
61849
61850                     if (point && geoPointInPolygon(point, viewport)) {
61851                         editMenu.center(point);
61852                     } else {
61853                         _suppressMenu = true;
61854                     }
61855                 }
61856             }
61857
61858
61859             function showMenu() {
61860                 closeMenu();
61861                 if (editMenu) {
61862                     context.surface().call(editMenu);
61863                 }
61864             }
61865
61866
61867             function toggleMenu() {
61868                 // deprecation warning - Radial Menu to be removed in iD v3
61869                 if (d3_select('.edit-menu, .radial-menu').empty()) {
61870                     positionMenu();
61871                     showMenu();
61872                 } else {
61873                     closeMenu();
61874                 }
61875             }
61876
61877
61878             mode.selectedIDs = function() {
61879                 return selectedIDs;
61880             };
61881
61882
61883             mode.zoomToSelected = function() {
61884                 var entity = singular();
61885                 if (entity) {
61886                     context.map().zoomToEase(entity);
61887                 }
61888             };
61889
61890
61891             mode.reselect = function() {
61892                 if (!checkSelectedIDs()) return;
61893
61894                 var surfaceNode = context.surface().node();
61895                 if (surfaceNode.focus) {   // FF doesn't support it
61896                     surfaceNode.focus();
61897                 }
61898
61899                 positionMenu();
61900                 if (!_suppressMenu) {
61901                     showMenu();
61902                 }
61903             };
61904
61905
61906             mode.newFeature = function(val) {
61907                 if (!arguments.length) return _newFeature;
61908                 _newFeature = val;
61909                 return mode;
61910             };
61911
61912
61913             mode.suppressMenu = function(val) {
61914                 if (!arguments.length) return _suppressMenu;
61915                 _suppressMenu = val;
61916                 return mode;
61917             };
61918
61919
61920             mode.follow = function(val) {
61921                 if (!arguments.length) return _follow;
61922                 _follow = val;
61923                 return mode;
61924             };
61925
61926
61927             mode.enter = function() {
61928                 if (!checkSelectedIDs()) return;
61929
61930                 context.features().forceVisible(selectedIDs);
61931
61932                 var operations = Object.values(Operations)
61933                     .map(function(o) { return o(selectedIDs, context); })
61934                     .filter(function(o) { return o.available() && o.id !== 'delete' && o.id !== 'downgrade'; });
61935
61936                 var downgradeOperation = operationDowngrade(selectedIDs, context);
61937                 // don't allow delete if downgrade is available
61938                 var lastOperation = !context.inIntro() && downgradeOperation.available() ? downgradeOperation : operationDelete(selectedIDs, context);
61939
61940                 // deprecation warning - Radial Menu to be removed in iD v3
61941                 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61942                 if (isRadialMenu) {
61943                     operations = operations.slice(0,7);
61944                     operations.unshift(lastOperation);
61945                 } else {
61946                     operations.push(lastOperation);
61947                 }
61948
61949                 operations.forEach(function(operation) {
61950                     if (operation.behavior) {
61951                         behaviors.push(operation.behavior);
61952                     }
61953                 });
61954
61955                 behaviors.forEach(context.install);
61956
61957                 keybinding
61958                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61959                     .on(['[', 'pgup'], previousVertex)
61960                     .on([']', 'pgdown'], nextVertex)
61961                     .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61962                     .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61963                     .on(['\\', 'pause'], nextParent)
61964                     .on('⎋', esc, true)
61965                     .on('space', toggleMenu);
61966
61967                 d3_select(document)
61968                     .call(keybinding);
61969
61970
61971                 // deprecation warning - Radial Menu to be removed in iD v3
61972                 editMenu = isRadialMenu
61973                     ? uiRadialMenu(context, operations)
61974                     : uiEditMenu(context, operations);
61975
61976                 context.ui().sidebar
61977                     .select(singular() ? singular().id : null, _newFeature);
61978
61979                 context.history()
61980                     .on('undone.select', update)
61981                     .on('redone.select', update);
61982
61983                 context.map()
61984                     .on('move.select', closeMenu)
61985                     .on('drawn.select', selectElements);
61986
61987                 context.surface()
61988                     .on('dblclick.select', dblclick);
61989
61990
61991                 selectElements();
61992
61993                 if (selectedIDs.length > 1) {
61994                     var entities = uiSelectionList(context, selectedIDs);
61995                     context.ui().sidebar.show(entities);
61996                 }
61997
61998                 if (_follow) {
61999                     var extent = geoExtent();
62000                     var graph = context.graph();
62001                     selectedIDs.forEach(function(id) {
62002                         var entity = context.entity(id);
62003                         extent._extend(entity.extent(graph));
62004                     });
62005
62006                     var loc = extent.center();
62007                     context.map().centerEase(loc);
62008                 } else if (singular() && singular().type === 'way') {
62009                     context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
62010                 }
62011
62012                 _timeout = window.setTimeout(function() {
62013                     positionMenu();
62014                     if (!_suppressMenu) {
62015                         showMenu();
62016                     }
62017                 }, 270);  /* after any centerEase completes */
62018
62019
62020                 function update() {
62021                     closeMenu();
62022                     checkSelectedIDs();
62023                 }
62024
62025
62026                 function dblclick() {
62027                     var target = d3_select(event.target);
62028
62029                     var datum = target.datum();
62030                     var entity = datum && datum.properties && datum.properties.entity;
62031                     if (!entity) return;
62032
62033                     if (entity instanceof osmWay && target.classed('target')) {
62034                         var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
62035                         var prev = entity.nodes[choice.index - 1];
62036                         var next = entity.nodes[choice.index];
62037
62038                         context.perform(
62039                             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
62040                             t('operations.add.annotation.vertex')
62041                         );
62042
62043                         event.preventDefault();
62044                         event.stopPropagation();
62045
62046                     } else if (entity.type === 'midpoint') {
62047                         context.perform(
62048                             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
62049                             t('operations.add.annotation.vertex'));
62050
62051                         event.preventDefault();
62052                         event.stopPropagation();
62053                     }
62054                 }
62055
62056
62057                 function selectElements(drawn) {
62058                     if (!checkSelectedIDs()) return;
62059
62060                     var surface = context.surface();
62061                     var entity = singular();
62062
62063                     if (entity && context.geometry(entity.id) === 'relation') {
62064                         _suppressMenu = true;
62065                         return;
62066                     }
62067
62068                     surface.selectAll('.related')
62069                         .classed('related', false);
62070
62071                     singularParent();
62072                     if (_relatedParent) {
62073                         surface.selectAll(utilEntitySelector([_relatedParent]))
62074                             .classed('related', true);
62075                     }
62076
62077                     var selection = context.surface()
62078                         .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
62079
62080                     if (selection.empty()) {
62081                         // Return to browse mode if selected DOM elements have
62082                         // disappeared because the user moved them out of view..
62083                         var source = event && event.type === 'zoom' && event.sourceEvent;
62084                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
62085                             context.enter(modeBrowse(context));
62086                         }
62087                     } else {
62088                         selection
62089                             .classed('selected', true);
62090                     }
62091                 }
62092
62093
62094                 function esc() {
62095                     if (d3_select('.combobox').size()) return;
62096                     context.enter(modeBrowse(context));
62097                 }
62098
62099
62100                 function firstVertex() {
62101                     event.preventDefault();
62102                     var entity = singular();
62103                     var parent = singularParent();
62104                     var way;
62105
62106                     if (entity && entity.type === 'way') {
62107                         way = entity;
62108                     } else if (parent) {
62109                         way = context.entity(parent);
62110                     }
62111
62112                     if (way) {
62113                         context.enter(
62114                             modeSelect(context, [way.first()]).follow(true)
62115                         );
62116                     }
62117                 }
62118
62119
62120                 function lastVertex() {
62121                     event.preventDefault();
62122                     var entity = singular();
62123                     var parent = singularParent();
62124                     var way;
62125
62126                     if (entity && entity.type === 'way') {
62127                         way = entity;
62128                     } else if (parent) {
62129                         way = context.entity(parent);
62130                     }
62131
62132                     if (way) {
62133                         context.enter(
62134                             modeSelect(context, [way.last()]).follow(true)
62135                         );
62136                     }
62137                 }
62138
62139
62140                 function previousVertex() {
62141                     event.preventDefault();
62142                     var parent = singularParent();
62143                     if (!parent) return;
62144
62145                     var way = context.entity(parent);
62146                     var length = way.nodes.length;
62147                     var curr = way.nodes.indexOf(selectedIDs[0]);
62148                     var index = -1;
62149
62150                     if (curr > 0) {
62151                         index = curr - 1;
62152                     } else if (way.isClosed()) {
62153                         index = length - 2;
62154                     }
62155
62156                     if (index !== -1) {
62157                         context.enter(
62158                             modeSelect(context, [way.nodes[index]]).follow(true)
62159                         );
62160                     }
62161                 }
62162
62163
62164                 function nextVertex() {
62165                     event.preventDefault();
62166                     var parent = singularParent();
62167                     if (!parent) return;
62168
62169                     var way = context.entity(parent);
62170                     var length = way.nodes.length;
62171                     var curr = way.nodes.indexOf(selectedIDs[0]);
62172                     var index = -1;
62173
62174                     if (curr < length - 1) {
62175                         index = curr + 1;
62176                     } else if (way.isClosed()) {
62177                         index = 0;
62178                     }
62179
62180                     if (index !== -1) {
62181                         context.enter(
62182                             modeSelect(context, [way.nodes[index]]).follow(true)
62183                         );
62184                     }
62185                 }
62186
62187
62188                 function nextParent() {
62189                     event.preventDefault();
62190                     var parents = commonParents();
62191                     if (!parents || parents.length < 2) return;
62192
62193                     var index = parents.indexOf(_relatedParent);
62194                     if (index < 0 || index > parents.length - 2) {
62195                         _relatedParent = parents[0];
62196                     } else {
62197                         _relatedParent = parents[index + 1];
62198                     }
62199
62200                     var surface = context.surface();
62201                     surface.selectAll('.related')
62202                         .classed('related', false);
62203
62204                     if (_relatedParent) {
62205                         surface.selectAll(utilEntitySelector([_relatedParent]))
62206                             .classed('related', true);
62207                     }
62208                 }
62209             };
62210
62211
62212             mode.exit = function() {
62213                 if (_timeout) window.clearTimeout(_timeout);
62214
62215                 behaviors.forEach(context.uninstall);
62216
62217                 d3_select(document)
62218                     .call(keybinding.unbind);
62219
62220                 closeMenu();
62221                 editMenu = undefined;
62222
62223                 context.history()
62224                     .on('undone.select', null)
62225                     .on('redone.select', null);
62226
62227                 var surface = context.surface();
62228
62229                 surface
62230                     .on('dblclick.select', null);
62231
62232                 surface
62233                     .selectAll('.selected')
62234                     .classed('selected', false);
62235
62236                 surface
62237                     .selectAll('.related')
62238                     .classed('related', false);
62239
62240                 context.map().on('drawn.select', null);
62241                 context.ui().sidebar.hide();
62242                 context.features().forceVisible([]);
62243
62244                 var entity = singular();
62245                 if (_newFeature && entity && entity.type === 'relation' &&
62246                     // no tags
62247                     Object.keys(entity.tags).length === 0 &&
62248                     // no parent relations
62249                     context.graph().parentRelations(entity).length === 0 &&
62250                     // no members or one member with no role
62251                     (entity.members.length === 0 || (entity.members.length === 1 && !entity.members[0].role))
62252                 ) {
62253                     // the user added this relation but didn't edit it at all, so just delete it
62254                     var deleteAction = actionDeleteRelation(entity.id, true /* don't delete untagged members */);
62255                     context.perform(deleteAction, t('operations.delete.annotation.relation'));
62256                 }
62257             };
62258
62259
62260             return mode;
62261         }
62262
62263         function uiLasso(context) {
62264             var group, polygon;
62265
62266             lasso.coordinates = [];
62267
62268             function lasso(selection) {
62269                 context.container()
62270                     .classed('lasso', true);
62271
62272                 group = selection
62273                     .append('g')
62274                     .attr('class', 'lasso hide');
62275
62276                 polygon = group
62277                     .append('path')
62278                     .attr('class', 'lasso-path');
62279
62280                 group
62281                     .call(uiToggle(true));
62282             }
62283
62284
62285             function draw() {
62286                 if (polygon) {
62287                     polygon.data([lasso.coordinates])
62288                         .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
62289                 }
62290             }
62291
62292
62293             lasso.extent = function () {
62294                 return lasso.coordinates.reduce(function(extent, point) {
62295                     return extent.extend(geoExtent(point));
62296                 }, geoExtent());
62297             };
62298
62299
62300             lasso.p = function(_) {
62301                 if (!arguments.length) return lasso;
62302                 lasso.coordinates.push(_);
62303                 draw();
62304                 return lasso;
62305             };
62306
62307
62308             lasso.close = function() {
62309                 if (group) {
62310                     group.call(uiToggle(false, function() {
62311                         d3_select(this).remove();
62312                     }));
62313                 }
62314                 context.container().classed('lasso', false);
62315             };
62316
62317
62318             return lasso;
62319         }
62320
62321         function behaviorLasso(context) {
62322
62323             var behavior = function(selection) {
62324                 var lasso;
62325
62326
62327                 function mousedown() {
62328                     var button = 0;  // left
62329                     if (event.button === button && event.shiftKey === true) {
62330                         lasso = null;
62331
62332                         d3_select(window)
62333                             .on('mousemove.lasso', mousemove)
62334                             .on('mouseup.lasso', mouseup);
62335
62336                         event.stopPropagation();
62337                     }
62338                 }
62339
62340
62341                 function mousemove() {
62342                     if (!lasso) {
62343                         lasso = uiLasso(context);
62344                         context.surface().call(lasso);
62345                     }
62346
62347                     lasso.p(context.mouse());
62348                 }
62349
62350
62351                 function normalize(a, b) {
62352                     return [
62353                         [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62354                         [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
62355                     ];
62356                 }
62357
62358
62359                 function lassoed() {
62360                     if (!lasso) return [];
62361
62362                     var graph = context.graph();
62363                     var bounds = lasso.extent().map(context.projection.invert);
62364                     var extent = geoExtent(normalize(bounds[0], bounds[1]));
62365
62366                     var intersects = context.intersects(extent).filter(function(entity) {
62367                         return entity.type === 'node' &&
62368                             geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62369                             !context.features().isHidden(entity, graph, entity.geometry(graph));
62370                     });
62371
62372                     return intersects.map(function(entity) { return entity.id; });
62373                 }
62374
62375
62376                 function mouseup() {
62377                     d3_select(window)
62378                         .on('mousemove.lasso', null)
62379                         .on('mouseup.lasso', null);
62380
62381                     if (!lasso) return;
62382
62383                     var ids = lassoed();
62384                     lasso.close();
62385
62386                     if (ids.length) {
62387                         context.enter(modeSelect(context, ids));
62388                     }
62389                 }
62390
62391                 selection
62392                     .on('mousedown.lasso', mousedown);
62393             };
62394
62395
62396             behavior.off = function(selection) {
62397                 selection.on('mousedown.lasso', null);
62398             };
62399
62400
62401             return behavior;
62402         }
62403
62404         function modeBrowse(context) {
62405             var mode = {
62406                 button: 'browse',
62407                 id: 'browse',
62408                 title: t('modes.browse.title'),
62409                 description: t('modes.browse.description')
62410             }, sidebar;
62411
62412             var behaviors = [
62413                 behaviorPaste(context),
62414                 behaviorHover(context).on('hover', context.ui().sidebar.hover),
62415                 behaviorSelect(context),
62416                 behaviorLasso(context),
62417                 modeDragNode(context).behavior,
62418                 modeDragNote(context).behavior
62419             ];
62420
62421
62422             mode.enter = function() {
62423                 behaviors.forEach(context.install);
62424
62425                 // Get focus on the body.
62426                 if (document.activeElement && document.activeElement.blur) {
62427                     document.activeElement.blur();
62428                 }
62429
62430                 if (sidebar) {
62431                     context.ui().sidebar.show(sidebar);
62432                 } else {
62433                     context.ui().sidebar.select(null);
62434                 }
62435             };
62436
62437
62438             mode.exit = function() {
62439                 context.ui().sidebar.hover.cancel();
62440                 behaviors.forEach(context.uninstall);
62441
62442                 if (sidebar) {
62443                     context.ui().sidebar.hide();
62444                 }
62445             };
62446
62447
62448             mode.sidebar = function(_) {
62449                 if (!arguments.length) return sidebar;
62450                 sidebar = _;
62451                 return mode;
62452             };
62453
62454
62455             return mode;
62456         }
62457
62458         function behaviorAddWay(context) {
62459             var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
62460             var draw = behaviorDraw(context);
62461
62462             function behavior(surface) {
62463                 draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
62464                     .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
62465                     .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
62466                     .on('cancel', behavior.cancel)
62467                     .on('finish', behavior.cancel);
62468
62469                 context.map()
62470                     .dblclickEnable(false);
62471
62472                 surface.call(draw);
62473             }
62474
62475
62476             behavior.off = function(surface) {
62477                 surface.call(draw.off);
62478             };
62479
62480
62481             behavior.cancel = function() {
62482                 window.setTimeout(function() {
62483                     context.map().dblclickEnable(true);
62484                 }, 1000);
62485
62486                 context.enter(modeBrowse(context));
62487             };
62488
62489
62490             behavior.tail = function(text) {
62491                 draw.tail(text);
62492                 return behavior;
62493             };
62494
62495
62496             return utilRebind(behavior, dispatch$1, 'on');
62497         }
62498
62499         function behaviorHash(context) {
62500             var s0 = null; // cached window.location.hash
62501             var lat = 90 - 1e-8; // allowable latitude range
62502
62503
62504             var parser = function(map, s) {
62505                 var q = utilStringQs(s);
62506                 var args = (q.map || '').split('/').map(Number);
62507
62508                 if (args.length < 3 || args.some(isNaN)) {
62509                     return true; // replace bogus hash
62510
62511                 } else if (s !== formatter(map).slice(1)) {   // hash has changed
62512                     var mode = context.mode();
62513                     var dist = geoSphericalDistance(map.center(), [args[2], args[1]]);
62514                     var maxdist = 500;
62515
62516                     // Don't allow the hash location to change too much while drawing
62517                     // This can happen if the user accidently hit the back button.  #3996
62518                     if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62519                         context.enter(modeBrowse(context));
62520                     }
62521
62522                     map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62523                 }
62524             };
62525
62526
62527             var formatter = function(map) {
62528                 var center = map.center();
62529                 var zoom = map.zoom();
62530                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62531                 var q = utilObjectOmit(utilStringQs(window.location.hash.substring(1)),
62532                     ['comment', 'source', 'hashtags', 'walkthrough']
62533                 );
62534                 var newParams = {};
62535
62536                 delete q.id;
62537                 var selected = context.selectedIDs().filter(function(id) {
62538                     return !context.entity(id).isNew();
62539                 });
62540                 if (selected.length) {
62541                     newParams.id = selected.join(',');
62542                 }
62543
62544                 newParams.map = zoom.toFixed(2) +
62545                     '/' + center[1].toFixed(precision) +
62546                     '/' + center[0].toFixed(precision);
62547
62548                 return '#' + utilQsString(Object.assign(q, newParams), true);
62549             };
62550
62551
62552             function update() {
62553                 if (context.inIntro()) return;
62554                 var s1 = formatter(context.map());
62555                 if (s0 !== s1) {
62556                     window.location.replace(s0 = s1);  // don't recenter the map!
62557                 }
62558             }
62559
62560
62561             var throttledUpdate = throttle(update, 500);
62562
62563
62564             function hashchange() {
62565                 if (window.location.hash === s0) return;  // ignore spurious hashchange events
62566                 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62567                     update(); // replace bogus hash
62568                 }
62569             }
62570
62571
62572             function behavior() {
62573                 context.map()
62574                     .on('move.hash', throttledUpdate);
62575
62576                 context
62577                     .on('enter.hash', throttledUpdate);
62578
62579                 d3_select(window)
62580                     .on('hashchange.hash', hashchange);
62581
62582                 if (window.location.hash) {
62583                     var q = utilStringQs(window.location.hash.substring(1));
62584
62585                     if (q.id) {
62586                         context.zoomToEntity(q.id.split(',')[0], !q.map);
62587                     }
62588
62589                     if (q.comment) {
62590                         context.storage('comment', q.comment);
62591                         context.storage('commentDate', Date.now());
62592                     }
62593
62594                     if (q.source) {
62595                         context.storage('source', q.source);
62596                         context.storage('commentDate', Date.now());
62597                     }
62598
62599                     if (q.hashtags) {
62600                         context.storage('hashtags', q.hashtags);
62601                     }
62602
62603                     if (q.walkthrough === 'true') {
62604                         behavior.startWalkthrough = true;
62605                     }
62606
62607                     hashchange();
62608
62609                     if (q.map) {
62610                         behavior.hadHash = true;
62611                     }
62612                 }
62613             }
62614
62615
62616             behavior.off = function() {
62617                 throttledUpdate.cancel();
62618
62619                 context.map()
62620                     .on('move.hash', null);
62621
62622                 context
62623                     .on('enter.hash', null);
62624
62625                 d3_select(window)
62626                     .on('hashchange.hash', null);
62627
62628                 window.location.hash = '';
62629             };
62630
62631
62632             return behavior;
62633         }
62634
62635         /*
62636             iD.coreDifference represents the difference between two graphs.
62637             It knows how to calculate the set of entities that were
62638             created, modified, or deleted, and also contains the logic
62639             for recursively extending a difference to the complete set
62640             of entities that will require a redraw, taking into account
62641             child and parent relationships.
62642          */
62643         function coreDifference(base, head) {
62644             var _changes = {};
62645             var _didChange = {};  // 'addition', 'deletion', 'geometry', 'properties'
62646             var _diff = {};
62647
62648             function checkEntityID(id) {
62649                 var h = head.entities[id];
62650                 var b = base.entities[id];
62651
62652                 if (h === b) return;
62653                 if (_changes[id]) return;
62654
62655                 if (!h && b) {
62656                     _changes[id] = { base: b, head: h };
62657                     _didChange.deletion = true;
62658                     return;
62659                 }
62660                 if (h && !b) {
62661                     _changes[id] = { base: b, head: h };
62662                     _didChange.addition = true;
62663                     return;
62664                 }
62665
62666                 if (h && b) {
62667                     if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
62668                         _changes[id] = { base: b, head: h };
62669                         _didChange.geometry = true;
62670                         _didChange.properties = true;
62671                         return;
62672                     }
62673                     if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
62674                         _changes[id] = { base: b, head: h };
62675                         _didChange.geometry = true;
62676                     }
62677                     if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
62678                         _changes[id] = { base: b, head: h };
62679                         _didChange.geometry = true;
62680                     }
62681                     if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
62682                         _changes[id] = { base: b, head: h };
62683                         _didChange.properties = true;
62684                     }
62685                 }
62686             }
62687
62688             Object.keys(head.entities).forEach(checkEntityID);
62689             Object.keys(base.entities).forEach(checkEntityID);
62690
62691
62692             _diff.length = function length() {
62693                 return Object.keys(_changes).length;
62694             };
62695
62696
62697             _diff.changes = function changes() {
62698                 return _changes;
62699             };
62700
62701             _diff.didChange = _didChange;
62702
62703
62704             // pass true to include affected relation members
62705             _diff.extantIDs = function extantIDs(includeRelMembers) {
62706                 var result = new Set();
62707                 Object.keys(_changes).forEach(function(id) {
62708                     if (_changes[id].head) {
62709                         result.add(id);
62710                     }
62711
62712                     var h = _changes[id].head;
62713                     var b = _changes[id].base;
62714                     var entity = h || b;
62715
62716                     if (includeRelMembers && entity.type === 'relation') {
62717                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62718                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62719                         utilArrayUnion(mh, mb).forEach(function(memberID) {
62720                             if (head.hasEntity(memberID)) {
62721                                 result.add(memberID);
62722                             }
62723                         });
62724                     }
62725                 });
62726
62727                 return Array.from(result);
62728             };
62729
62730
62731             _diff.modified = function modified() {
62732                 var result = [];
62733                 Object.values(_changes).forEach(function(change) {
62734                     if (change.base && change.head) {
62735                         result.push(change.head);
62736                     }
62737                 });
62738                 return result;
62739             };
62740
62741
62742             _diff.created = function created() {
62743                 var result = [];
62744                 Object.values(_changes).forEach(function(change) {
62745                     if (!change.base && change.head) {
62746                         result.push(change.head);
62747                     }
62748                 });
62749                 return result;
62750             };
62751
62752
62753             _diff.deleted = function deleted() {
62754                 var result = [];
62755                 Object.values(_changes).forEach(function(change) {
62756                     if (change.base && !change.head) {
62757                         result.push(change.base);
62758                     }
62759                 });
62760                 return result;
62761             };
62762
62763
62764             _diff.summary = function summary() {
62765                 var relevant = {};
62766
62767                 var keys = Object.keys(_changes);
62768                 for (var i = 0; i < keys.length; i++) {
62769                     var change = _changes[keys[i]];
62770
62771                     if (change.head && change.head.geometry(head) !== 'vertex') {
62772                         addEntity(change.head, head, change.base ? 'modified' : 'created');
62773
62774                     } else if (change.base && change.base.geometry(base) !== 'vertex') {
62775                         addEntity(change.base, base, 'deleted');
62776
62777                     } else if (change.base && change.head) { // modified vertex
62778                         var moved    = !fastDeepEqual(change.base.loc,  change.head.loc);
62779                         var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
62780
62781                         if (moved) {
62782                             addParents(change.head);
62783                         }
62784
62785                         if (retagged || (moved && change.head.hasInterestingTags())) {
62786                             addEntity(change.head, head, 'modified');
62787                         }
62788
62789                     } else if (change.head && change.head.hasInterestingTags()) { // created vertex
62790                         addEntity(change.head, head, 'created');
62791
62792                     } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
62793                         addEntity(change.base, base, 'deleted');
62794                     }
62795                 }
62796
62797                 return Object.values(relevant);
62798
62799
62800                 function addEntity(entity, graph, changeType) {
62801                     relevant[entity.id] = {
62802                         entity: entity,
62803                         graph: graph,
62804                         changeType: changeType
62805                     };
62806                 }
62807
62808                 function addParents(entity) {
62809                     var parents = head.parentWays(entity);
62810                     for (var j = parents.length - 1; j >= 0; j--) {
62811                         var parent = parents[j];
62812                         if (!(parent.id in relevant)) {
62813                             addEntity(parent, head, 'modified');
62814                         }
62815                     }
62816                 }
62817             };
62818
62819
62820             // returns complete set of entities that require a redraw
62821             //  (optionally within given `extent`)
62822             _diff.complete = function complete(extent) {
62823                 var result = {};
62824                 var id, change;
62825
62826                 for (id in _changes) {
62827                     change = _changes[id];
62828
62829                     var h = change.head;
62830                     var b = change.base;
62831                     var entity = h || b;
62832                     var i;
62833
62834                     if (extent &&
62835                         (!h || !h.intersects(extent, head)) &&
62836                         (!b || !b.intersects(extent, base)))
62837                         continue;
62838
62839                     result[id] = h;
62840
62841                     if (entity.type === 'way') {
62842                         var nh = h ? h.nodes : [];
62843                         var nb = b ? b.nodes : [];
62844                         var diff;
62845
62846                         diff = utilArrayDifference(nh, nb);
62847                         for (i = 0; i < diff.length; i++) {
62848                             result[diff[i]] = head.hasEntity(diff[i]);
62849                         }
62850
62851                         diff = utilArrayDifference(nb, nh);
62852                         for (i = 0; i < diff.length; i++) {
62853                             result[diff[i]] = head.hasEntity(diff[i]);
62854                         }
62855                     }
62856
62857                     if (entity.type === 'relation' && entity.isMultipolygon()) {
62858                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62859                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62860                         var ids = utilArrayUnion(mh, mb);
62861                         for (i = 0; i < ids.length; i++) {
62862                             var member = head.hasEntity(ids[i]);
62863                             if (!member) continue;   // not downloaded
62864                             if (extent && !member.intersects(extent, head)) continue;   // not visible
62865                             result[ids[i]] = member;
62866                         }
62867                     }
62868
62869                     addParents(head.parentWays(entity), result);
62870                     addParents(head.parentRelations(entity), result);
62871                 }
62872
62873                 return result;
62874
62875
62876                 function addParents(parents, result) {
62877                     for (var i = 0; i < parents.length; i++) {
62878                         var parent = parents[i];
62879                         if (parent.id in result) continue;
62880
62881                         result[parent.id] = parent;
62882                         addParents(head.parentRelations(parent), result);
62883                     }
62884                 }
62885             };
62886
62887
62888             return _diff;
62889         }
62890
62891         function coreTree(head) {
62892             var rtree = rbush_1();
62893             var bboxes = {};
62894             var tree = {};
62895
62896
62897             function entityBBox(entity) {
62898                 var bbox = entity.extent(head).bbox();
62899                 bbox.id = entity.id;
62900                 bboxes[entity.id] = bbox;
62901                 return bbox;
62902             }
62903
62904
62905             function updateParents(entity, insertions, memo) {
62906                 head.parentWays(entity).forEach(function(way) {
62907                     if (bboxes[way.id]) {
62908                         rtree.remove(bboxes[way.id]);
62909                         insertions[way.id] = way;
62910                     }
62911                     updateParents(way, insertions, memo);
62912                 });
62913
62914                 head.parentRelations(entity).forEach(function(relation) {
62915                     if (memo[entity.id]) return;
62916                     memo[entity.id] = true;
62917                     if (bboxes[relation.id]) {
62918                         rtree.remove(bboxes[relation.id]);
62919                         insertions[relation.id] = relation;
62920                     }
62921                     updateParents(relation, insertions, memo);
62922                 });
62923             }
62924
62925
62926             tree.rebase = function(entities, force) {
62927                 var insertions = {};
62928
62929                 for (var i = 0; i < entities.length; i++) {
62930                     var entity = entities[i];
62931                     if (!entity.visible) continue;
62932
62933                     if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
62934                         if (!force) {
62935                             continue;
62936                         } else if (bboxes[entity.id]) {
62937                             rtree.remove(bboxes[entity.id]);
62938                         }
62939                     }
62940
62941                     insertions[entity.id] = entity;
62942                     updateParents(entity, insertions, {});
62943                 }
62944
62945                 rtree.load(Object.values(insertions).map(entityBBox));
62946
62947                 return tree;
62948             };
62949
62950
62951             tree.intersects = function(extent, graph) {
62952                 if (graph !== head) {
62953                     var diff = coreDifference(head, graph);
62954                     var changed = diff.didChange;
62955
62956                     if (changed.addition || changed.deletion || changed.geometry) {
62957                         var insertions = {};
62958                         head = graph;
62959
62960                         if (changed.deletion) {
62961                             diff.deleted().forEach(function(entity) {
62962                                 rtree.remove(bboxes[entity.id]);
62963                                 delete bboxes[entity.id];
62964                             });
62965                         }
62966
62967                         if (changed.geometry) {
62968                             diff.modified().forEach(function(entity) {
62969                                 rtree.remove(bboxes[entity.id]);
62970                                 insertions[entity.id] = entity;
62971                                 updateParents(entity, insertions, {});
62972                             });
62973                         }
62974
62975                         if (changed.addition) {
62976                             diff.created().forEach(function(entity) {
62977                                 insertions[entity.id] = entity;
62978                             });
62979                         }
62980
62981                         rtree.load(Object.values(insertions).map(entityBBox));
62982                     }
62983                 }
62984
62985                 return rtree.search(extent.bbox())
62986                     .map(function(bbox) { return graph.entity(bbox.id); });
62987             };
62988
62989
62990             return tree;
62991         }
62992
62993         function uiModal(selection, blocking) {
62994             var keybinding = utilKeybinding('modal');
62995             var previous = selection.select('div.modal');
62996             var animate = previous.empty();
62997
62998             previous.transition()
62999                 .duration(200)
63000                 .style('opacity', 0)
63001                 .remove();
63002
63003             var shaded = selection
63004                 .append('div')
63005                 .attr('class', 'shaded')
63006                 .style('opacity', 0);
63007
63008             shaded.close = function() {
63009                 shaded
63010                     .transition()
63011                     .duration(200)
63012                     .style('opacity',0)
63013                     .remove();
63014
63015                 modal
63016                     .transition()
63017                     .duration(200)
63018                     .style('top','0px');
63019
63020                 d3_select(document)
63021                     .call(keybinding.unbind);
63022             };
63023
63024
63025             var modal = shaded
63026                 .append('div')
63027                 .attr('class', 'modal fillL');
63028
63029             if (!blocking) {
63030                 shaded.on('click.remove-modal', function() {
63031                     if (event.target === this) {
63032                         shaded.close();
63033                     }
63034                 });
63035
63036                 modal.append('button')
63037                     .attr('class', 'close')
63038                     .on('click', shaded.close)
63039                     .call(svgIcon('#iD-icon-close'));
63040
63041                 keybinding
63042                     .on('⌫', shaded.close)
63043                     .on('⎋', shaded.close);
63044
63045                 d3_select(document)
63046                     .call(keybinding);
63047             }
63048
63049             modal
63050                 .append('div')
63051                 .attr('class', 'content');
63052
63053             if (animate) {
63054                 shaded.transition().style('opacity', 1);
63055             } else {
63056                 shaded.style('opacity', 1);
63057             }
63058
63059
63060             return shaded;
63061         }
63062
63063         function uiLoading(context) {
63064             var _modalSelection = d3_select(null);
63065             var _message = '';
63066             var _blocking = false;
63067
63068
63069             var loading = function(selection) {
63070                 _modalSelection = uiModal(selection, _blocking);
63071
63072                 var loadertext = _modalSelection.select('.content')
63073                     .classed('loading-modal', true)
63074                     .append('div')
63075                     .attr('class', 'modal-section fillL');
63076
63077                 loadertext
63078                     .append('img')
63079                     .attr('class', 'loader')
63080                     .attr('src', context.imagePath('loader-white.gif'));
63081
63082                 loadertext
63083                     .append('h3')
63084                     .text(_message);
63085
63086                 _modalSelection.select('button.close')
63087                     .attr('class', 'hide');
63088
63089                 return loading;
63090             };
63091
63092
63093             loading.message = function(_) {
63094                 if (!arguments.length) return _message;
63095                 _message = _;
63096                 return loading;
63097             };
63098
63099
63100             loading.blocking = function(_) {
63101                 if (!arguments.length) return _blocking;
63102                 _blocking = _;
63103                 return loading;
63104             };
63105
63106
63107             loading.close = function() {
63108                 _modalSelection.remove();
63109             };
63110
63111
63112             return loading;
63113         }
63114
63115         function coreHistory(context) {
63116             var dispatch$1 = dispatch('change', 'merge', 'restore', 'undone', 'redone');
63117             var lock = utilSessionMutex('lock');
63118             var duration = 150;
63119             var _imageryUsed = [];
63120             var _photoOverlaysUsed = [];
63121             var _checkpoints = {};
63122             var _pausedGraph;
63123             var _stack;
63124             var _index;
63125             var _tree;
63126
63127
63128             // internal _act, accepts list of actions and eased time
63129             function _act(actions, t) {
63130                 actions = Array.prototype.slice.call(actions);
63131
63132                 var annotation;
63133                 if (typeof actions[actions.length - 1] !== 'function') {
63134                     annotation = actions.pop();
63135                 }
63136
63137                 var graph = _stack[_index].graph;
63138                 for (var i = 0; i < actions.length; i++) {
63139                     graph = actions[i](graph, t);
63140                 }
63141
63142                 return {
63143                     graph: graph,
63144                     annotation: annotation,
63145                     imageryUsed: _imageryUsed,
63146                     photoOverlaysUsed: _photoOverlaysUsed,
63147                     transform: context.projection.transform(),
63148                     selectedIDs: context.selectedIDs()
63149                 };
63150             }
63151
63152
63153             // internal _perform with eased time
63154             function _perform(args, t) {
63155                 var previous = _stack[_index].graph;
63156                 _stack = _stack.slice(0, _index + 1);
63157                 var actionResult = _act(args, t);
63158                 _stack.push(actionResult);
63159                 _index++;
63160                 return change(previous);
63161             }
63162
63163
63164             // internal _replace with eased time
63165             function _replace(args, t) {
63166                 var previous = _stack[_index].graph;
63167                 // assert(_index == _stack.length - 1)
63168                 var actionResult = _act(args, t);
63169                 _stack[_index] = actionResult;
63170                 return change(previous);
63171             }
63172
63173
63174             // internal _overwrite with eased time
63175             function _overwrite(args, t) {
63176                 var previous = _stack[_index].graph;
63177                 if (_index > 0) {
63178                     _index--;
63179                     _stack.pop();
63180                 }
63181                 _stack = _stack.slice(0, _index + 1);
63182                 var actionResult = _act(args, t);
63183                 _stack.push(actionResult);
63184                 _index++;
63185                 return change(previous);
63186             }
63187
63188
63189             // determine difference and dispatch a change event
63190             function change(previous) {
63191                 var difference = coreDifference(previous, history.graph());
63192                 if (!_pausedGraph) {
63193                     dispatch$1.call('change', this, difference);
63194                 }
63195                 return difference;
63196             }
63197
63198
63199             // iD uses namespaced keys so multiple installations do not conflict
63200             function getKey(n) {
63201                 return 'iD_' + window.location.origin + '_' + n;
63202             }
63203
63204
63205             var history = {
63206
63207                 graph: function() {
63208                     return _stack[_index].graph;
63209                 },
63210
63211
63212                 tree: function() {
63213                     return _tree;
63214                 },
63215
63216
63217                 base: function() {
63218                     return _stack[0].graph;
63219                 },
63220
63221
63222                 merge: function(entities, extent) {
63223                     var stack = _stack.map(function(state) { return state.graph; });
63224                     _stack[0].graph.rebase(entities, stack, false);
63225                     _tree.rebase(entities, false);
63226
63227                     dispatch$1.call('merge', this, entities);
63228                 },
63229
63230
63231                 perform: function() {
63232                     // complete any transition already in progress
63233                     d3_select(document).interrupt('history.perform');
63234
63235                     var transitionable = false;
63236                     var action0 = arguments[0];
63237
63238                     if (arguments.length === 1 ||
63239                         (arguments.length === 2 && (typeof arguments[1] !== 'function'))) {
63240                         transitionable = !!action0.transitionable;
63241                     }
63242
63243                     if (transitionable) {
63244                         var origArguments = arguments;
63245                         d3_select(document)
63246                             .transition('history.perform')
63247                             .duration(duration)
63248                             .ease(linear$1)
63249                             .tween('history.tween', function() {
63250                                 return function(t) {
63251                                     if (t < 1) _overwrite([action0], t);
63252                                 };
63253                             })
63254                             .on('start', function() {
63255                                 _perform([action0], 0);
63256                             })
63257                             .on('end interrupt', function() {
63258                                 _overwrite(origArguments, 1);
63259                             });
63260
63261                     } else {
63262                         return _perform(arguments);
63263                     }
63264                 },
63265
63266
63267                 replace: function() {
63268                     d3_select(document).interrupt('history.perform');
63269                     return _replace(arguments, 1);
63270                 },
63271
63272
63273                 // Same as calling pop and then perform
63274                 overwrite: function() {
63275                     d3_select(document).interrupt('history.perform');
63276                     return _overwrite(arguments, 1);
63277                 },
63278
63279
63280                 pop: function(n) {
63281                     d3_select(document).interrupt('history.perform');
63282
63283                     var previous = _stack[_index].graph;
63284                     if (isNaN(+n) || +n < 0) {
63285                         n = 1;
63286                     }
63287                     while (n-- > 0 && _index > 0) {
63288                         _index--;
63289                         _stack.pop();
63290                     }
63291                     return change(previous);
63292                 },
63293
63294
63295                 // Back to the previous annotated state or _index = 0.
63296                 undo: function() {
63297                     d3_select(document).interrupt('history.perform');
63298
63299                     var previousStack = _stack[_index];
63300                     var previous = previousStack.graph;
63301                     while (_index > 0) {
63302                         _index--;
63303                         if (_stack[_index].annotation) break;
63304                     }
63305
63306                     dispatch$1.call('undone', this, _stack[_index], previousStack);
63307                     return change(previous);
63308                 },
63309
63310
63311                 // Forward to the next annotated state.
63312                 redo: function() {
63313                     d3_select(document).interrupt('history.perform');
63314
63315                     var previousStack = _stack[_index];
63316                     var previous = previousStack.graph;
63317                     var tryIndex = _index;
63318                     while (tryIndex < _stack.length - 1) {
63319                         tryIndex++;
63320                         if (_stack[tryIndex].annotation) {
63321                             _index = tryIndex;
63322                             dispatch$1.call('redone', this, _stack[_index], previousStack);
63323                             break;
63324                         }
63325                     }
63326
63327                     return change(previous);
63328                 },
63329
63330
63331                 pauseChangeDispatch: function() {
63332                     if (!_pausedGraph) {
63333                         _pausedGraph = _stack[_index].graph;
63334                     }
63335                 },
63336
63337
63338                 resumeChangeDispatch: function() {
63339                     if (_pausedGraph) {
63340                         var previous = _pausedGraph;
63341                         _pausedGraph = null;
63342                         return change(previous);
63343                     }
63344                 },
63345
63346
63347                 undoAnnotation: function() {
63348                     var i = _index;
63349                     while (i >= 0) {
63350                         if (_stack[i].annotation) return _stack[i].annotation;
63351                         i--;
63352                     }
63353                 },
63354
63355
63356                 redoAnnotation: function() {
63357                     var i = _index + 1;
63358                     while (i <= _stack.length - 1) {
63359                         if (_stack[i].annotation) return _stack[i].annotation;
63360                         i++;
63361                     }
63362                 },
63363
63364
63365                 intersects: function(extent) {
63366                     return _tree.intersects(extent, _stack[_index].graph);
63367                 },
63368
63369
63370                 difference: function() {
63371                     var base = _stack[0].graph;
63372                     var head = _stack[_index].graph;
63373                     return coreDifference(base, head);
63374                 },
63375
63376
63377                 changes: function(action) {
63378                     var base = _stack[0].graph;
63379                     var head = _stack[_index].graph;
63380
63381                     if (action) {
63382                         head = action(head);
63383                     }
63384
63385                     var difference = coreDifference(base, head);
63386
63387                     return {
63388                         modified: difference.modified(),
63389                         created: difference.created(),
63390                         deleted: difference.deleted()
63391                     };
63392                 },
63393
63394
63395                 hasChanges: function() {
63396                     return this.difference().length() > 0;
63397                 },
63398
63399
63400                 imageryUsed: function(sources) {
63401                     if (sources) {
63402                         _imageryUsed = sources;
63403                         return history;
63404                     } else {
63405                         var s = new Set();
63406                         _stack.slice(1, _index + 1).forEach(function(state) {
63407                             state.imageryUsed.forEach(function(source) {
63408                                 if (source !== 'Custom') {
63409                                     s.add(source);
63410                                 }
63411                             });
63412                         });
63413                         return Array.from(s);
63414                     }
63415                 },
63416
63417
63418                 photoOverlaysUsed: function(sources) {
63419                     if (sources) {
63420                         _photoOverlaysUsed = sources;
63421                         return history;
63422                     } else {
63423                         var s = new Set();
63424                         _stack.slice(1, _index + 1).forEach(function(state) {
63425                             if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
63426                                 state.photoOverlaysUsed.forEach(function(photoOverlay) {
63427                                     s.add(photoOverlay);
63428                                 });
63429                             }
63430                         });
63431                         return Array.from(s);
63432                     }
63433                 },
63434
63435
63436                 // save the current history state
63437                 checkpoint: function(key) {
63438                     _checkpoints[key] = {
63439                         stack: _stack,
63440                         index: _index
63441                     };
63442                     return history;
63443                 },
63444
63445
63446                 // restore history state to a given checkpoint or reset completely
63447                 reset: function(key) {
63448                     if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
63449                         _stack = _checkpoints[key].stack;
63450                         _index = _checkpoints[key].index;
63451                     } else {
63452                         _stack = [{graph: coreGraph()}];
63453                         _index = 0;
63454                         _tree = coreTree(_stack[0].graph);
63455                         _checkpoints = {};
63456                     }
63457                     dispatch$1.call('change');
63458                     return history;
63459                 },
63460
63461
63462                 // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
63463                 //
63464                 // To use it:
63465                 //  1. Start the walkthrough.
63466                 //  2. Get to a "free editing" tutorial step
63467                 //  3. Make your edits to the walkthrough map
63468                 //  4. In your browser dev console run:
63469                 //        `id.history().toIntroGraph()`
63470                 //  5. This outputs stringified JSON to the browser console
63471                 //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
63472                 toIntroGraph: function() {
63473                     var nextID = { n: 0, r: 0, w: 0 };
63474                     var permIDs = {};
63475                     var graph = this.graph();
63476                     var baseEntities = {};
63477
63478                     // clone base entities..
63479                     Object.values(graph.base().entities).forEach(function(entity) {
63480                         var copy = copyIntroEntity(entity);
63481                         baseEntities[copy.id] = copy;
63482                     });
63483
63484                     // replace base entities with head entities..
63485                     Object.keys(graph.entities).forEach(function(id) {
63486                         var entity = graph.entities[id];
63487                         if (entity) {
63488                             var copy = copyIntroEntity(entity);
63489                             baseEntities[copy.id] = copy;
63490                         } else {
63491                             delete baseEntities[id];
63492                         }
63493                     });
63494
63495                     // swap temporary for permanent ids..
63496                     Object.values(baseEntities).forEach(function(entity) {
63497                         if (Array.isArray(entity.nodes)) {
63498                             entity.nodes = entity.nodes.map(function(node) {
63499                                 return permIDs[node] || node;
63500                             });
63501                         }
63502                         if (Array.isArray(entity.members)) {
63503                             entity.members = entity.members.map(function(member) {
63504                                 member.id = permIDs[member.id] || member.id;
63505                                 return member;
63506                             });
63507                         }
63508                     });
63509
63510                     return JSON.stringify({ dataIntroGraph: baseEntities });
63511
63512
63513                     function copyIntroEntity(source) {
63514                         var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']);
63515
63516                         // Note: the copy is no longer an osmEntity, so it might not have `tags`
63517                         if (copy.tags && !Object.keys(copy.tags)) {
63518                             delete copy.tags;
63519                         }
63520
63521                         if (Array.isArray(copy.loc)) {
63522                             copy.loc[0] = +copy.loc[0].toFixed(6);
63523                             copy.loc[1] = +copy.loc[1].toFixed(6);
63524                         }
63525
63526                         var match = source.id.match(/([nrw])-\d*/);  // temporary id
63527                         if (match !== null) {
63528                             var nrw = match[1];
63529                             var permID;
63530                             do { permID = nrw + (++nextID[nrw]); }
63531                             while (baseEntities.hasOwnProperty(permID));
63532
63533                             copy.id = permIDs[source.id] = permID;
63534                         }
63535                         return copy;
63536                     }
63537                 },
63538
63539
63540                 toJSON: function() {
63541                     if (!this.hasChanges()) return;
63542
63543                     var allEntities = {};
63544                     var baseEntities = {};
63545                     var base = _stack[0];
63546
63547                     var s = _stack.map(function(i) {
63548                         var modified = [];
63549                         var deleted = [];
63550
63551                         Object.keys(i.graph.entities).forEach(function(id) {
63552                             var entity = i.graph.entities[id];
63553                             if (entity) {
63554                                 var key = osmEntity.key(entity);
63555                                 allEntities[key] = entity;
63556                                 modified.push(key);
63557                             } else {
63558                                 deleted.push(id);
63559                             }
63560
63561                             // make sure that the originals of changed or deleted entities get merged
63562                             // into the base of the _stack after restoring the data from JSON.
63563                             if (id in base.graph.entities) {
63564                                 baseEntities[id] = base.graph.entities[id];
63565                             }
63566                             if (entity && entity.nodes) {
63567                                 // get originals of pre-existing child nodes
63568                                 entity.nodes.forEach(function(nodeID) {
63569                                     if (nodeID in base.graph.entities) {
63570                                         baseEntities[nodeID] = base.graph.entities[nodeID];
63571                                     }
63572                                 });
63573                             }
63574                             // get originals of parent entities too
63575                             var baseParents = base.graph._parentWays[id];
63576                             if (baseParents) {
63577                                 baseParents.forEach(function(parentID) {
63578                                     if (parentID in base.graph.entities) {
63579                                         baseEntities[parentID] = base.graph.entities[parentID];
63580                                     }
63581                                 });
63582                             }
63583                         });
63584
63585                         var x = {};
63586
63587                         if (modified.length) x.modified = modified;
63588                         if (deleted.length) x.deleted = deleted;
63589                         if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
63590                         if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
63591                         if (i.annotation) x.annotation = i.annotation;
63592                         if (i.transform) x.transform = i.transform;
63593                         if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
63594
63595                         return x;
63596                     });
63597
63598                     return JSON.stringify({
63599                         version: 3,
63600                         entities: Object.values(allEntities),
63601                         baseEntities: Object.values(baseEntities),
63602                         stack: s,
63603                         nextIDs: osmEntity.id.next,
63604                         index: _index
63605                     });
63606                 },
63607
63608
63609                 fromJSON: function(json, loadChildNodes) {
63610                     var h = JSON.parse(json);
63611                     var loadComplete = true;
63612
63613                     osmEntity.id.next = h.nextIDs;
63614                     _index = h.index;
63615
63616                     if (h.version === 2 || h.version === 3) {
63617                         var allEntities = {};
63618
63619                         h.entities.forEach(function(entity) {
63620                             allEntities[osmEntity.key(entity)] = osmEntity(entity);
63621                         });
63622
63623                         if (h.version === 3) {
63624                             // This merges originals for changed entities into the base of
63625                             // the _stack even if the current _stack doesn't have them (for
63626                             // example when iD has been restarted in a different region)
63627                             var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
63628                             var stack = _stack.map(function(state) { return state.graph; });
63629                             _stack[0].graph.rebase(baseEntities, stack, true);
63630                             _tree.rebase(baseEntities, true);
63631
63632                             // When we restore a modified way, we also need to fetch any missing
63633                             // childnodes that would normally have been downloaded with it.. #2142
63634                             if (loadChildNodes) {
63635                                 var osm = context.connection();
63636                                 var baseWays = baseEntities
63637                                     .filter(function(e) { return e.type === 'way'; });
63638                                 var nodeIDs = baseWays
63639                                     .reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []);
63640                                 var missing = nodeIDs
63641                                     .filter(function(n) { return !_stack[0].graph.hasEntity(n); });
63642
63643                                 if (missing.length && osm) {
63644                                     loadComplete = false;
63645                                     context.redrawEnable(false);
63646
63647                                     var loading = uiLoading(context).blocking(true);
63648                                     context.container().call(loading);
63649
63650                                     var childNodesLoaded = function(err, result) {
63651                                         if (!err) {
63652                                             var visibleGroups = utilArrayGroupBy(result.data, 'visible');
63653                                             var visibles = visibleGroups.true || [];      // alive nodes
63654                                             var invisibles = visibleGroups.false || [];   // deleted nodes
63655
63656                                             if (visibles.length) {
63657                                                 var visibleIDs = visibles.map(function(entity) { return entity.id; });
63658                                                 var stack = _stack.map(function(state) { return state.graph; });
63659                                                 missing = utilArrayDifference(missing, visibleIDs);
63660                                                 _stack[0].graph.rebase(visibles, stack, true);
63661                                                 _tree.rebase(visibles, true);
63662                                             }
63663
63664                                             // fetch older versions of nodes that were deleted..
63665                                             invisibles.forEach(function(entity) {
63666                                                 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
63667                                             });
63668                                         }
63669
63670                                         if (err || !missing.length) {
63671                                             loading.close();
63672                                             context.redrawEnable(true);
63673                                             dispatch$1.call('change');
63674                                             dispatch$1.call('restore', this);
63675                                         }
63676                                     };
63677
63678                                     osm.loadMultiple(missing, childNodesLoaded);
63679                                 }
63680                             }
63681                         }
63682
63683                         _stack = h.stack.map(function(d) {
63684                             var entities = {}, entity;
63685
63686                             if (d.modified) {
63687                                 d.modified.forEach(function(key) {
63688                                     entity = allEntities[key];
63689                                     entities[entity.id] = entity;
63690                                 });
63691                             }
63692
63693                             if (d.deleted) {
63694                                 d.deleted.forEach(function(id) {
63695                                     entities[id] = undefined;
63696                                 });
63697                             }
63698
63699                             return {
63700                                 graph: coreGraph(_stack[0].graph).load(entities),
63701                                 annotation: d.annotation,
63702                                 imageryUsed: d.imageryUsed,
63703                                 photoOverlaysUsed: d.photoOverlaysUsed,
63704                                 transform: d.transform,
63705                                 selectedIDs: d.selectedIDs
63706                             };
63707                         });
63708
63709                     } else { // original version
63710                         _stack = h.stack.map(function(d) {
63711                             var entities = {};
63712
63713                             for (var i in d.entities) {
63714                                 var entity = d.entities[i];
63715                                 entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
63716                             }
63717
63718                             d.graph = coreGraph(_stack[0].graph).load(entities);
63719                             return d;
63720                         });
63721                     }
63722
63723                     var transform = _stack[_index].transform;
63724                     if (transform) {
63725                         context.map().transformEase(transform, 0);   // 0 = immediate, no easing
63726                     }
63727
63728                     if (loadComplete) {
63729                         dispatch$1.call('change');
63730                         dispatch$1.call('restore', this);
63731                     }
63732
63733                     return history;
63734                 },
63735
63736
63737                 save: function() {
63738                     if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
63739                     return history;
63740                 },
63741
63742
63743                 clearSaved: function() {
63744                     context.debouncedSave.cancel();
63745                     if (lock.locked()) context.storage(getKey('saved_history'), null);
63746                     return history;
63747                 },
63748
63749
63750                 lock: function() {
63751                     return lock.lock();
63752                 },
63753
63754
63755                 unlock: function() {
63756                     lock.unlock();
63757                 },
63758
63759
63760                 // is iD not open in another window and it detects that
63761                 // there's a history stored in localStorage that's recoverable?
63762                 restorableChanges: function() {
63763                     return lock.locked() && !!context.storage(getKey('saved_history'));
63764                 },
63765
63766
63767                 // load history from a version stored in localStorage
63768                 restore: function() {
63769                     if (!lock.locked()) return;
63770
63771                     var json = context.storage(getKey('saved_history'));
63772                     if (json) history.fromJSON(json, true);
63773                 },
63774
63775
63776                 _getKey: getKey
63777
63778             };
63779
63780
63781             history.reset();
63782
63783             return utilRebind(history, dispatch$1, 'on');
63784         }
63785
63786         /**
63787          * Look for roads that can be connected to other roads with a short extension
63788          */
63789         function validationAlmostJunction(context) {
63790             var type = 'almost_junction';
63791
63792
63793             function isHighway(entity) {
63794                 return entity.type === 'way' &&
63795                     osmRoutableHighwayTagValues[entity.tags.highway];
63796             }
63797
63798             function isTaggedAsNotContinuing(node) {
63799                 return node.tags.noexit === 'yes' ||
63800                     node.tags.amenity === 'parking_entrance' ||
63801                     (node.tags.entrance && node.tags.entrance !== 'no');
63802             }
63803
63804
63805             var validation = function checkAlmostJunction(entity, graph) {
63806                 if (!isHighway(entity)) return [];
63807                 if (entity.isDegenerate()) return [];
63808
63809                 var tree = context.history().tree();
63810                 var issues = [];
63811
63812                 var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
63813                 extendableNodeInfos.forEach(function(extendableNodeInfo) {
63814                     var node = extendableNodeInfo.node;
63815                     var edgeHighway = graph.entity(extendableNodeInfo.wid);
63816
63817                     var fixes = [new validationIssueFix({
63818                         icon: 'iD-icon-abutment',
63819                         title: t('issues.fix.connect_features.title'),
63820                         onClick: function(context) {
63821                             var endNodeId = this.issue.entityIds[1];
63822                             var endNode = context.entity(endNodeId);
63823                             var targetEdge = this.issue.data.edge;
63824                             var crossLoc = this.issue.data.cross_loc;
63825                             var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
63826                             var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
63827
63828                             var annotation = t('issues.fix.connect_almost_junction.annotation');
63829                             // already a point nearby, just connect to that
63830                             if (closestNodeInfo.distance < 0.75) {
63831                                 context.perform(
63832                                     actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
63833                                     annotation
63834                                 );
63835                             // else add the end node to the edge way
63836                             } else {
63837                                 context.perform(
63838                                     actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
63839                                     annotation
63840                                 );
63841                             }
63842                         }
63843                     })];
63844
63845                     if (Object.keys(node.tags).length === 0) {
63846                         // node has no tags, suggest noexit fix
63847                         fixes.push(new validationIssueFix({
63848                             icon: 'maki-barrier',
63849                             title: t('issues.fix.tag_as_disconnected.title'),
63850                             onClick: function(context) {
63851                                 var nodeID = this.issue.entityIds[1];
63852                                 context.perform(
63853                                     actionChangeTags(nodeID, { noexit: 'yes' }),
63854                                     t('issues.fix.tag_as_disconnected.annotation')
63855                                 );
63856                             }
63857                         }));
63858                     }
63859
63860                     issues.push(new validationIssue({
63861                         type: type,
63862                         severity: 'warning',
63863                         message: function(context) {
63864                             var entity1 = context.hasEntity(this.entityIds[0]);
63865                             if (this.entityIds[0] === this.entityIds[2]) {
63866                                 return entity1 ? t('issues.almost_junction.self.message', {
63867                                     feature: utilDisplayLabel(entity1, context)
63868                                 }) : '';
63869                             } else {
63870                                 var entity2 = context.hasEntity(this.entityIds[2]);
63871                                 return (entity1 && entity2) ? t('issues.almost_junction.message', {
63872                                     feature: utilDisplayLabel(entity1, context),
63873                                     feature2: utilDisplayLabel(entity2, context)
63874                                 }) : '';
63875                             }
63876                         },
63877                         reference: showReference,
63878                         entityIds: [entity.id, node.id, edgeHighway.id],
63879                         loc: extendableNodeInfo.node.loc,
63880                         hash: JSON.stringify(extendableNodeInfo.node.loc),
63881                         data: {
63882                             edge: extendableNodeInfo.edge,
63883                             cross_loc: extendableNodeInfo.cross_loc
63884                         },
63885                         fixes: fixes
63886                     }));
63887                 });
63888
63889                 return issues;
63890
63891
63892                 function showReference(selection) {
63893                     selection.selectAll('.issue-reference')
63894                         .data([0])
63895                         .enter()
63896                         .append('div')
63897                         .attr('class', 'issue-reference')
63898                         .text(t('issues.almost_junction.highway-highway.reference'));
63899                 }
63900
63901
63902                 function isExtendableCandidate(node, way) {
63903                     // can not accurately test vertices on tiles not downloaded from osm - #5938
63904                     var osm = services$1.osm;
63905                     if (osm && !osm.isDataLoaded(node.loc)) {
63906                         return false;
63907                     }
63908                     if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
63909                         return false;
63910                     }
63911
63912                     var occurences = 0;
63913                     for (var index in way.nodes) {
63914                         if (way.nodes[index] === node.id) {
63915                             occurences += 1;
63916                             if (occurences > 1) {
63917                                 return false;
63918                             }
63919                         }
63920                     }
63921                     return true;
63922                 }
63923
63924
63925                 function findConnectableEndNodesByExtension(way) {
63926                     var results = [];
63927                     if (way.isClosed()) return results;
63928
63929                     var testNodes;
63930                     var indices = [0, way.nodes.length - 1];
63931                     indices.forEach(function(nodeIndex) {
63932                         var nodeID = way.nodes[nodeIndex];
63933                         var node = graph.entity(nodeID);
63934
63935                         if (!isExtendableCandidate(node, way)) return;
63936
63937                         var connectionInfo = canConnectByExtend(way, nodeIndex);
63938                         if (!connectionInfo) return;
63939
63940                         testNodes = graph.childNodes(way).slice();   // shallow copy
63941                         testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
63942
63943                         // don't flag issue if connecting the ways would cause self-intersection
63944                         if (geoHasSelfIntersections(testNodes, nodeID)) return;
63945
63946                         results.push(connectionInfo);
63947                     });
63948
63949                     return results;
63950                 }
63951
63952                 function hasTag(tags, key) {
63953                     return tags[key] !== undefined && tags[key] !== 'no';
63954                 }
63955
63956                 function canConnectWays(way, way2) {
63957
63958                     // allow self-connections
63959                     if (way.id === way2.id) return true;
63960
63961                     // if one is bridge or tunnel, both must be bridge or tunnel
63962                     if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
63963                         !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
63964                     if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
63965                         !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
63966
63967                     // must have equivalent layers and levels
63968                     var layer1 = way.tags.layer || '0',
63969                         layer2 = way2.tags.layer || '0';
63970                     if (layer1 !== layer2) return false;
63971
63972                     var level1 = way.tags.level || '0',
63973                         level2 = way2.tags.level || '0';
63974                     if (level1 !== level2) return false;
63975
63976                     return true;
63977                 }
63978
63979
63980                 function canConnectByExtend(way, endNodeIdx) {
63981                     var EXTEND_TH_METERS = 5;
63982                     var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
63983                     var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
63984                     var tipNode = graph.entity(tipNid);
63985                     var midNode = graph.entity(midNid);
63986                     var lon = tipNode.loc[0];
63987                     var lat = tipNode.loc[1];
63988                     var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
63989                     var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
63990                     var queryExtent = geoExtent([
63991                         [lon - lon_range, lat - lat_range],
63992                         [lon + lon_range, lat + lat_range]
63993                     ]);
63994
63995                     // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
63996                     var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
63997                     var t = EXTEND_TH_METERS / edgeLen + 1.0;
63998                     var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
63999
64000                     // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
64001                     var intersected = tree.intersects(queryExtent, graph);
64002                     for (var i = 0; i < intersected.length; i++) {
64003                         var way2 = intersected[i];
64004
64005                         if (!isHighway(way2)) continue;
64006
64007                         if (!canConnectWays(way, way2)) continue;
64008
64009                         for (var j = 0; j < way2.nodes.length - 1; j++) {
64010                             var nAid = way2.nodes[j],
64011                                 nBid = way2.nodes[j + 1];
64012
64013                             if (nAid === tipNid || nBid === tipNid) continue;
64014
64015                             var nA = graph.entity(nAid),
64016                                 nB = graph.entity(nBid);
64017                             var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
64018                             if (crossLoc) {
64019                                 return {
64020                                     node: tipNode,
64021                                     wid: way2.id,
64022                                     edge: [nA.id, nB.id],
64023                                     cross_loc: crossLoc
64024                                 };
64025                             }
64026                         }
64027                     }
64028                     return null;
64029                 }
64030             };
64031
64032             validation.type = type;
64033
64034             return validation;
64035         }
64036
64037         function validationCloseNodes(context) {
64038             var type = 'close_nodes';
64039
64040             var pointThresholdMeters = 0.2;
64041
64042             var defaultWayThresholdMeters = 0.2;
64043             // expect some features to be mapped with higher levels of detail
64044             var indoorThresholdMeters = 0.01;
64045             var buildingThresholdMeters = 0.05;
64046             var pathThresholdMeters = 0.1;
64047
64048             var validation = function(entity, graph) {
64049                 if (entity.type === 'node') {
64050                     return getIssuesForNode(entity);
64051                 } else if (entity.type === 'way') {
64052                     return getIssuesForWay(entity);
64053                 }
64054                 return [];
64055
64056                 function featureTypeForWay(way) {
64057
64058                     if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
64059                     if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
64060                     if ((way.tags.building && way.tags.building !== 'no') ||
64061                         (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
64062                     if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
64063
64064                     var parentRelations = graph.parentRelations(way);
64065                     for (var i in parentRelations) {
64066                         var relation = parentRelations[i];
64067
64068                         if (relation.tags.type === 'boundary') return 'boundary';
64069
64070                         if (relation.isMultipolygon()) {
64071                             if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
64072                             if ((relation.tags.building && relation.tags.building !== 'no') ||
64073                                 (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
64074                         }
64075                     }
64076
64077                     return 'other';
64078                 }
64079
64080                 function shouldCheckWay(way) {
64081
64082                     // don't flag issues where merging would create degenerate ways
64083                     if (way.nodes.length <= 2 ||
64084                         (way.isClosed() && way.nodes.length <= 4)) return false;
64085
64086                     var featureType = featureTypeForWay(way);
64087                     if (featureType === 'boundary') return false;
64088
64089                     var bbox = way.extent(graph).bbox();
64090                     var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
64091                     // don't flag close nodes in very small ways
64092                     if (hypotenuseMeters < 1.5) return false;
64093
64094                     return true;
64095                 }
64096
64097                 function getIssuesForWay(way) {
64098                     if (!shouldCheckWay(way)) return [];
64099
64100                     var issues = [],
64101                         nodes = graph.childNodes(way);
64102                     for (var i = 0; i < nodes.length - 1; i++) {
64103                         var node1 = nodes[i];
64104                         var node2 = nodes[i+1];
64105
64106                         var issue = getWayIssueIfAny(node1, node2, way);
64107                         if (issue) issues.push(issue);
64108                     }
64109                     return issues;
64110                 }
64111
64112                 function getIssuesForVertex(node, parentWays) {
64113                     var issues = [];
64114
64115                     function checkForCloseness(node1, node2, way) {
64116                         var issue = getWayIssueIfAny(node1, node2, way);
64117                         if (issue) issues.push(issue);
64118                     }
64119
64120                     for (var i = 0; i < parentWays.length; i++) {
64121                         var parentWay = parentWays[i];
64122
64123                         if (!shouldCheckWay(parentWay)) continue;
64124
64125                         var lastIndex = parentWay.nodes.length - 1;
64126                         for (var j = 0; j < parentWay.nodes.length; j++) {
64127                             if (j !== 0) {
64128                                 if (parentWay.nodes[j-1] === node.id) {
64129                                     checkForCloseness(node, graph.entity(parentWay.nodes[j]), parentWay);
64130                                 }
64131                             }
64132                             if (j !== lastIndex) {
64133                                 if (parentWay.nodes[j+1] === node.id) {
64134                                     checkForCloseness(graph.entity(parentWay.nodes[j]), node, parentWay);
64135                                 }
64136                             }
64137                         }
64138                     }
64139                     return issues;
64140                 }
64141
64142                 function getIssuesForDetachedPoint(node) {
64143
64144                     var issues = [];
64145
64146                     var lon = node.loc[0];
64147                     var lat = node.loc[1];
64148                     var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
64149                     var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
64150                     var queryExtent = geoExtent([
64151                         [lon - lon_range, lat - lat_range],
64152                         [lon + lon_range, lat + lat_range]
64153                     ]);
64154
64155                     var intersected = context.history().tree().intersects(queryExtent, graph);
64156                     for (var j = 0; j < intersected.length; j++) {
64157                         var nearby = intersected[j];
64158
64159                         if (nearby.id === node.id) continue;
64160                         if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') continue;
64161
64162                         if (nearby.loc === node.loc ||
64163                             geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
64164
64165                             issues.push(new validationIssue({
64166                                 type: type,
64167                                 severity: 'warning',
64168                                 message: function(context) {
64169                                     var entity = context.hasEntity(this.entityIds[0]),
64170                                         entity2 = context.hasEntity(this.entityIds[1]);
64171                                     return (entity && entity2) ? t('issues.close_nodes.detached.message', {
64172                                         feature: utilDisplayLabel(entity, context),
64173                                         feature2: utilDisplayLabel(entity2, context)
64174                                     }) : '';
64175                                 },
64176                                 reference: showReference,
64177                                 entityIds: [node.id, nearby.id],
64178                                 fixes: [
64179                                     new validationIssueFix({
64180                                         icon: 'iD-operation-disconnect',
64181                                         title: t('issues.fix.move_points_apart.title')
64182                                     })
64183                                 ]
64184                             }));
64185                         }
64186                     }
64187
64188                     return issues;
64189
64190                     function showReference(selection) {
64191                         var referenceText = t('issues.close_nodes.detached.reference');
64192                         selection.selectAll('.issue-reference')
64193                             .data([0])
64194                             .enter()
64195                             .append('div')
64196                             .attr('class', 'issue-reference')
64197                             .text(referenceText);
64198                     }
64199                 }
64200
64201                 function getIssuesForNode(node) {
64202                     var parentWays = graph.parentWays(node);
64203                     if (parentWays.length) {
64204                         return getIssuesForVertex(node, parentWays);
64205                     } else {
64206                         return getIssuesForDetachedPoint(node);
64207                     }
64208                 }
64209
64210                 function getWayIssueIfAny(node1, node2, way) {
64211                     if (node1.id === node2.id ||
64212                         (node1.hasInterestingTags() && node2.hasInterestingTags())) {
64213                         return null;
64214                     }
64215
64216                     if (node1.loc !== node2.loc) {
64217
64218                         var featureType = featureTypeForWay(way);
64219                         var threshold = defaultWayThresholdMeters;
64220                         if (featureType === 'indoor') threshold = indoorThresholdMeters;
64221                         else if (featureType === 'building') threshold = buildingThresholdMeters;
64222                         else if (featureType === 'path') threshold = pathThresholdMeters;
64223
64224                         var distance = geoSphericalDistance(node1.loc, node2.loc);
64225                         if (distance > threshold) return null;
64226                     }
64227
64228                     return new validationIssue({
64229                         type: type,
64230                         severity: 'warning',
64231                         message: function(context) {
64232                             var entity = context.hasEntity(this.entityIds[0]);
64233                             return entity ? t('issues.close_nodes.message', { way: utilDisplayLabel(entity, context) }) : '';
64234                         },
64235                         reference: showReference,
64236                         entityIds: [way.id, node1.id, node2.id],
64237                         loc: node1.loc,
64238                         fixes: [
64239                             new validationIssueFix({
64240                                 icon: 'iD-icon-plus',
64241                                 title: t('issues.fix.merge_points.title'),
64242                                 onClick: function(context) {
64243                                     var entityIds = this.issue.entityIds;
64244                                     var action = actionMergeNodes([entityIds[1], entityIds[2]]);
64245                                     context.perform(action, t('issues.fix.merge_close_vertices.annotation'));
64246                                 }
64247                             }),
64248                             new validationIssueFix({
64249                                 icon: 'iD-operation-disconnect',
64250                                 title: t('issues.fix.move_points_apart.title')
64251                             })
64252                         ]
64253                     });
64254
64255                     function showReference(selection) {
64256                         var referenceText = t('issues.close_nodes.reference');
64257                         selection.selectAll('.issue-reference')
64258                             .data([0])
64259                             .enter()
64260                             .append('div')
64261                             .attr('class', 'issue-reference')
64262                             .text(referenceText);
64263                     }
64264                 }
64265
64266             };
64267
64268
64269             validation.type = type;
64270
64271             return validation;
64272         }
64273
64274         function validationCrossingWays(context) {
64275             var type = 'crossing_ways';
64276
64277             /*
64278             Avoid duplicate work by cacheing issues. The same issues live under two paths.
64279             {
64280                 w-123: {
64281                     w-456: [{issue1}, {issue2}…]
64282                 },
64283                 w-456: {
64284                     w-123: [{issue1}, {issue2}…]
64285                 }
64286             }
64287             */
64288             var _issueCache = {};
64289
64290             // returns the way or its parent relation, whichever has a useful feature type
64291             function getFeatureWithFeatureTypeTagsForWay(way, graph) {
64292                 if (getFeatureTypeForTags(way.tags) === null) {
64293                     // if the way doesn't match a feature type, check its parent relations
64294                     var parentRels = graph.parentRelations(way);
64295                     for (var i = 0; i < parentRels.length; i++) {
64296                         var rel = parentRels[i];
64297                         if (getFeatureTypeForTags(rel.tags) !== null) {
64298                             return rel;
64299                         }
64300                     }
64301                 }
64302                 return way;
64303             }
64304
64305
64306             function hasTag(tags, key) {
64307                 return tags[key] !== undefined && tags[key] !== 'no';
64308             }
64309
64310             function tagsImplyIndoors(tags) {
64311                 return hasTag(tags, 'level') || tags.highway === 'corridor';
64312             }
64313
64314             function allowsStructures(featureType) {
64315                 return allowsBridge(featureType) || allowsTunnel(featureType);
64316             }
64317             function allowsBridge(featureType) {
64318                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64319             }
64320             function allowsTunnel(featureType) {
64321                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64322             }
64323             function canCover(featureType) {
64324                 return featureType === 'building';
64325             }
64326
64327
64328             function getFeatureTypeForCrossingCheck(way, graph) {
64329                 var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
64330                 return getFeatureTypeForTags(tags);
64331             }
64332
64333             // blacklist
64334             var ignoredBuildings = {
64335                 demolished: true, dismantled: true, proposed: true, razed: true
64336             };
64337
64338
64339             function getFeatureTypeForTags(tags) {
64340                 if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
64341
64342                 // don't check non-building areas
64343                 if (hasTag(tags, 'area')) return null;
64344
64345                 if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
64346                 if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
64347                 if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
64348
64349                 return null;
64350             }
64351
64352
64353             function isLegitCrossing(way1, featureType1, way2, featureType2) {
64354                 var tags1 = way1.tags;
64355                 var tags2 = way2.tags;
64356
64357                 // assume 0 by default
64358                 var level1 = tags1.level || '0';
64359                 var level2 = tags2.level || '0';
64360
64361                 if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
64362                     // assume features don't interact if they're indoor on different levels
64363                     return true;
64364                 }
64365
64366                 // assume 0 by default; don't use way.layer() since we account for structures here
64367                 var layer1 = tags1.layer || '0';
64368                 var layer2 = tags2.layer || '0';
64369
64370                 if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
64371                     if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
64372                     if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
64373                     // crossing bridges must use different layers
64374                     if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
64375                 } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
64376                 else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
64377
64378                 if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
64379                     if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
64380                     if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
64381                     // crossing tunnels must use different layers
64382                     if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
64383                 } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
64384                 else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
64385
64386                 if (canCover(featureType1) && canCover(featureType2)) {
64387                     if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
64388                     if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
64389                     // crossing covered features that can themselves cover must use different layers
64390                     if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
64391                 } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
64392                 else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
64393
64394                 // don't flag crossing waterways and pier/highways
64395                 if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
64396                 if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
64397
64398                 if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
64399                     // if no structures are applicable, the layers must be different
64400                     if (layer1 !== layer2) return true;
64401                 }
64402                 return false;
64403             }
64404
64405
64406             // highway values for which we shouldn't recommend connecting to waterways
64407             var highwaysDisallowingFords = {
64408                 motorway: true, motorway_link: true, trunk: true, trunk_link: true,
64409                 primary: true, primary_link: true, secondary: true, secondary_link: true
64410             };
64411             var nonCrossingHighways = { track: true };
64412
64413             function tagsForConnectionNodeIfAllowed(entity1, entity2) {
64414                 var featureType1 = getFeatureTypeForTags(entity1.tags);
64415                 var featureType2 = getFeatureTypeForTags(entity2.tags);
64416                 if (featureType1 === featureType2) {
64417                     if (featureType1 === 'highway') {
64418                         var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
64419                         var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
64420                         if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
64421                             // one feature is a path but not both
64422
64423                             var roadFeature = entity1IsPath ? entity2 : entity1;
64424                             if (nonCrossingHighways[roadFeature.tags.highway]) {
64425                                 // don't mark path connections with certain roads as crossings
64426                                 return {};
64427                             }
64428                             var pathFeature = entity1IsPath ? entity1 : entity2;
64429                             if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
64430                                 // if the path is a crossing, match the crossing type
64431                                 return { highway: 'crossing', crossing: pathFeature.tags.crossing };
64432                             }
64433                             // don't add a `crossing` subtag to ambiguous crossings
64434                             return { highway: 'crossing' };
64435                         }
64436                         return {};
64437                     }
64438                     if (featureType1 === 'waterway') return {};
64439                     if (featureType1 === 'railway') return {};
64440
64441                 } else {
64442                     var featureTypes = [featureType1, featureType2];
64443                     if (featureTypes.indexOf('highway') !== -1) {
64444                         if (featureTypes.indexOf('railway') !== -1) {
64445                             if (osmPathHighwayTagValues[entity1.tags.highway] ||
64446                                 osmPathHighwayTagValues[entity2.tags.highway]) {
64447                                 // path-rail connections use this tag
64448                                 return { railway: 'crossing' };
64449                             } else {
64450                                 // road-rail connections use this tag
64451                                 return { railway: 'level_crossing' };
64452                             }
64453                         }
64454
64455                         if (featureTypes.indexOf('waterway') !== -1) {
64456                             // do not allow fords on structures
64457                             if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
64458                             if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
64459
64460                             if (highwaysDisallowingFords[entity1.tags.highway] ||
64461                                 highwaysDisallowingFords[entity2.tags.highway]) {
64462                                 // do not allow fords on major highways
64463                                 return null;
64464                             }
64465                             return { ford: 'yes' };
64466                         }
64467                     }
64468                 }
64469                 return null;
64470             }
64471
64472
64473             function findCrossingsByWay(way1, graph, tree) {
64474                 var edgeCrossInfos = [];
64475                 if (way1.type !== 'way') return edgeCrossInfos;
64476
64477                 var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
64478                 if (way1FeatureType === null) return edgeCrossInfos;
64479
64480                 var checkedSingleCrossingWays = {};
64481
64482                 // declare vars ahead of time to reduce garbage collection
64483                 var i, j, nodeIndex;
64484                 var extent;
64485                 var n1, n2, nA, nB;
64486                 var segment1, segment2;
64487                 var oneOnly;
64488                 var intersected, way2, way2FeatureType, way2Nodes;
64489                 var way1Nodes = graph.childNodes(way1);
64490                 var comparedWays = {};
64491                 for (i = 0; i < way1Nodes.length - 1; i++) {
64492                     n1 = way1Nodes[i];
64493                     n2 = way1Nodes[i + 1];
64494                     extent = geoExtent([
64495                         [
64496                             Math.min(n1.loc[0], n2.loc[0]),
64497                             Math.min(n1.loc[1], n2.loc[1])
64498                         ],
64499                         [
64500                             Math.max(n1.loc[0], n2.loc[0]),
64501                             Math.max(n1.loc[1], n2.loc[1])
64502                         ]
64503                     ]);
64504
64505                     intersected = tree.intersects(extent, graph);
64506                     for (j = 0; j < intersected.length; j++) {
64507                         way2 = intersected[j];
64508
64509                         if (way2.type !== 'way') continue;
64510
64511                         // don't check for self-intersection in this validation
64512                         if (way2.id === way1.id) continue;
64513
64514                         // skip if this way was already checked and only one issue is needed
64515                         if (checkedSingleCrossingWays[way2.id]) continue;
64516
64517                         // don't re-check previously checked features
64518                         if (_issueCache[way1.id] && _issueCache[way1.id][way2.id]) continue;
64519
64520                         // mark this way as checked even if there are no crossings
64521                         comparedWays[way2.id] = true;
64522
64523                         // only check crossing highway, waterway, building, and railway
64524                         way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
64525                         if (way2FeatureType === null ||
64526                             isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
64527                             continue;
64528                         }
64529
64530                         // create only one issue for building crossings
64531                         oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
64532                         segment1 = [n1.loc, n2.loc];
64533
64534                         way2Nodes = graph.childNodes(way2);
64535                         for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
64536                             nA = way2Nodes[nodeIndex];
64537                             nB = way2Nodes[nodeIndex + 1];
64538                             if (nA.id === n1.id || nA.id === n2.id ||
64539                                 nB.id === n1.id || nB.id === n2.id) {
64540                                 // n1 or n2 is a connection node; skip
64541                                 continue;
64542                             }
64543                             segment2 = [nA.loc, nB.loc];
64544                             var point = geoLineIntersection(segment1, segment2);
64545                             if (point) {
64546                                 edgeCrossInfos.push({
64547                                     ways: [way1, way2],
64548                                     featureTypes: [way1FeatureType, way2FeatureType],
64549                                     edges: [[n1.id, n2.id], [nA.id, nB.id]],
64550                                     crossPoint: point
64551                                 });
64552                                 if (oneOnly) {
64553                                     checkedSingleCrossingWays[way2.id] = true;
64554                                     break;
64555                                 }
64556                             }
64557                         }
64558                     }
64559                 }
64560                 for (var way2ID in comparedWays) {
64561                     if (!_issueCache[way1.id]) _issueCache[way1.id] = {};
64562                     if (!_issueCache[way1.id][way2ID]) _issueCache[way1.id][way2ID] = [];
64563                     if (!_issueCache[way2ID]) _issueCache[way2ID] = {};
64564                     if (!_issueCache[way2ID][way1.id]) _issueCache[way2ID][way1.id] = [];
64565                 }
64566                 return edgeCrossInfos;
64567             }
64568
64569
64570             function waysToCheck(entity, graph) {
64571                 if (!getFeatureTypeForTags(entity.tags)) {
64572                     return [];
64573                 }
64574                 if (entity.type === 'way') {
64575                     return [entity];
64576                 } else if (entity.type === 'relation' &&
64577                     entity.isMultipolygon() &&
64578                     // only check multipolygons if they are buildings
64579                     hasTag(entity.tags, 'building')) {
64580                     return entity.members.reduce(function(array, member) {
64581                         if (member.type === 'way' &&
64582                             //(member.role === 'outer' || member.role === 'inner') &&
64583                             graph.hasEntity(member.id)) {
64584                             var entity = graph.entity(member.id);
64585                             array.push(entity);
64586                         }
64587                         return array;
64588                     }, []);
64589                 }
64590                 return [];
64591             }
64592
64593
64594             var validation = function checkCrossingWays(entity, graph) {
64595
64596                 var tree = context.history().tree();
64597
64598                 var ways = waysToCheck(entity, graph);
64599
64600                 var issues = [];
64601                 // declare these here to reduce garbage collection
64602                 var wayIndex, crossingIndex, key, crossings, crossing, issue;
64603                 for (wayIndex in ways) {
64604                     var way = ways[wayIndex];
64605                     crossings = findCrossingsByWay(way, graph, tree);
64606                     for (crossingIndex in crossings) {
64607                         crossing = crossings[crossingIndex];
64608                         var way2 = crossing.ways[1];
64609                         issue = createIssue(crossing, graph);
64610                         // cache the issues for each way
64611                         _issueCache[way.id][way2.id].push(issue);
64612                         _issueCache[way2.id][way.id].push(issue);
64613                     }
64614                     for (key in _issueCache[way.id]) {
64615                         issues = issues.concat(_issueCache[way.id][key]);
64616                     }
64617                 }
64618                 return issues;
64619             };
64620
64621
64622             function createIssue(crossing, graph) {
64623
64624                 // use the entities with the tags that define the feature type
64625                 var entities = crossing.ways.sort(function(entity1, entity2) {
64626                     var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
64627                     var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
64628                     if (type1 === type2) {
64629                         return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
64630                     } else if (type1 === 'waterway') {
64631                         return true;
64632                     } else if (type2 === 'waterway') {
64633                         return false;
64634                     }
64635                     return type1 < type2;
64636                 });
64637                 entities = entities.map(function(way) {
64638                     return getFeatureWithFeatureTypeTagsForWay(way, graph);
64639                 });
64640
64641                 var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
64642
64643                 var featureType1 = crossing.featureTypes[0];
64644                 var featureType2 = crossing.featureTypes[1];
64645
64646                 var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
64647                 var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
64648                                         allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
64649                 var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
64650                                         allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
64651
64652                 var crossingTypeID;
64653
64654                 if (isCrossingIndoors) {
64655                     crossingTypeID = 'indoor-indoor';
64656                 } else if (isCrossingTunnels) {
64657                     crossingTypeID = 'tunnel-tunnel';
64658                 } else if (isCrossingBridges) {
64659                     crossingTypeID = 'bridge-bridge';
64660                 } else {
64661                     crossingTypeID = crossing.featureTypes.sort().join('-');
64662                 }
64663                 if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
64664                     crossingTypeID += '_connectable';
64665                 }
64666
64667                 var fixes = [];
64668                 if (connectionTags) {
64669                     fixes.push(makeConnectWaysFix());
64670                 }
64671
64672                 var useFixIcon = 'iD-icon-layers';
64673                 var useFixID;
64674                 if (isCrossingIndoors) {
64675                     useFixID = 'use_different_levels';
64676                 } else if (isCrossingTunnels || isCrossingBridges) {
64677                     useFixID = 'use_different_layers';
64678                 // don't recommend bridges for waterways even though they're okay
64679                 } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
64680                         (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
64681                     useFixID = 'use_bridge_or_tunnel';
64682                     useFixIcon = 'maki-bridge';
64683                 } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
64684                     useFixID = 'use_tunnel';
64685                 } else {
64686                     useFixID = 'use_different_layers';
64687                 }
64688                 if (useFixID === 'use_different_layers') {
64689                     fixes.push(makeChangeLayerFix('higher'));
64690                     fixes.push(makeChangeLayerFix('lower'));
64691                 } else {
64692                     fixes.push(new validationIssueFix({
64693                         icon: useFixIcon,
64694                         title: t('issues.fix.' + useFixID + '.title')
64695                     }));
64696                 }
64697                 fixes.push(new validationIssueFix({
64698                     icon: 'iD-operation-move',
64699                     title: t('issues.fix.reposition_features.title')
64700                 }));
64701
64702                 return new validationIssue({
64703                     type: type,
64704                     severity: 'warning',
64705                     message: function(context) {
64706                         var entity1 = context.hasEntity(this.entityIds[0]),
64707                             entity2 = context.hasEntity(this.entityIds[1]);
64708                         return (entity1 && entity2) ? t('issues.crossing_ways.message', {
64709                             feature: utilDisplayLabel(entity1, context),
64710                             feature2: utilDisplayLabel(entity2, context)
64711                         }) : '';
64712                     },
64713                     reference: showReference,
64714                     entityIds: entities.map(function(entity) {
64715                         return entity.id;
64716                     }),
64717                     data: {
64718                         edges: crossing.edges,
64719                         connectionTags: connectionTags
64720                     },
64721                     // differentiate based on the loc since two ways can cross multiple times
64722                     hash: JSON.stringify(crossing.crossPoint) +
64723                         // if the edges change then so does the fix
64724                         JSON.stringify(crossing.edges) +
64725                         // ensure the correct connection tags are added in the fix
64726                         JSON.stringify(connectionTags),
64727                     loc: crossing.crossPoint,
64728                     fixes: fixes
64729                 });
64730
64731                 function showReference(selection) {
64732                     selection.selectAll('.issue-reference')
64733                         .data([0])
64734                         .enter()
64735                         .append('div')
64736                         .attr('class', 'issue-reference')
64737                         .text(t('issues.crossing_ways.' + crossingTypeID + '.reference'));
64738                 }
64739             }
64740
64741             function makeConnectWaysFix() {
64742                 return new validationIssueFix({
64743                     icon: 'iD-icon-crossing',
64744                     title: t('issues.fix.connect_features.title'),
64745                     onClick: function(context) {
64746                         var loc = this.issue.loc;
64747                         var connectionTags = this.issue.data.connectionTags;
64748                         var edges = this.issue.data.edges;
64749
64750                         context.perform(
64751                             function actionConnectCrossingWays(graph) {
64752                                 // create the new node for the points
64753                                 var node = osmNode({ loc: loc, tags: connectionTags });
64754                                 graph = graph.replace(node);
64755
64756                                 var nodesToMerge = [node.id];
64757                                 var mergeThresholdInMeters = 0.75;
64758
64759                                 edges.forEach(function(edge) {
64760                                     var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
64761                                     var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
64762                                     // if there is already a point nearby, use that
64763                                     if (closestNodeInfo.distance < mergeThresholdInMeters) {
64764                                         nodesToMerge.push(closestNodeInfo.node.id);
64765                                     // else add the new node to the way
64766                                     } else {
64767                                         graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
64768                                     }
64769                                 });
64770
64771                                 if (nodesToMerge.length > 1) {
64772                                     // if we're using nearby nodes, merge them with the new node
64773                                     graph = actionMergeNodes(nodesToMerge, loc)(graph);
64774                                 }
64775
64776                                 return graph;
64777                             },
64778                             t('issues.fix.connect_crossing_features.annotation')
64779                         );
64780                     }
64781                 });
64782             }
64783
64784             function makeChangeLayerFix(higherOrLower) {
64785                 return new validationIssueFix({
64786                     icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
64787                     title: t('issues.fix.tag_this_as_' + higherOrLower + '.title'),
64788                     onClick: function(context) {
64789
64790                         var mode = context.mode();
64791                         if (!mode || mode.id !== 'select') return;
64792
64793                         var selectedIDs = mode.selectedIDs();
64794                         if (selectedIDs.length !== 1) return;
64795
64796                         var selectedID = selectedIDs[0];
64797                         if (!this.issue.entityIds.some(function(entityId) {
64798                             return entityId === selectedID;
64799                         })) return;
64800
64801                         var entity = context.hasEntity(selectedID);
64802                         if (!entity) return;
64803
64804                         var tags = Object.assign({}, entity.tags);   // shallow copy
64805                         var layer = tags.layer && Number(tags.layer);
64806                         if (layer && !isNaN(layer)) {
64807                             if (higherOrLower === 'higher') {
64808                                 layer += 1;
64809                             } else {
64810                                 layer -= 1;
64811                             }
64812                         } else {
64813                             if (higherOrLower === 'higher') {
64814                                 layer = 1;
64815                             } else {
64816                                 layer = -1;
64817                             }
64818                         }
64819                         tags.layer = layer;
64820                         context.perform(
64821                             actionChangeTags(entity.id, tags),
64822                             t('operations.change_tags.annotation')
64823                         );
64824                     }
64825                 });
64826             }
64827
64828             validation.reset = function() {
64829                 _issueCache = {};
64830             };
64831
64832             validation.type = type;
64833
64834             return validation;
64835         }
64836
64837         function validationDisconnectedWay() {
64838             var type = 'disconnected_way';
64839
64840             function isTaggedAsHighway(entity) {
64841                 return osmRoutableHighwayTagValues[entity.tags.highway];
64842             }
64843
64844             var validation = function checkDisconnectedWay(entity, graph) {
64845
64846                 var routingIslandWays = routingIslandForEntity(entity);
64847                 if (!routingIslandWays) return [];
64848
64849                 var fixes = [];
64850
64851                 var isSingle = routingIslandWays.size === 1;
64852
64853                 if (isSingle) {
64854
64855                     if (entity.type === 'way' && !entity.isClosed()) {
64856                         var firstID = entity.first();
64857                         var lastID = entity.last();
64858
64859                         var first = graph.entity(firstID);
64860                         if (first.tags.noexit !== 'yes') {
64861                             fixes.push(new validationIssueFix({
64862                                 icon: 'iD-operation-continue-left',
64863                                 title: t('issues.fix.continue_from_start.title'),
64864                                 entityIds: [firstID],
64865                                 onClick: function(context) {
64866                                     var wayId = this.issue.entityIds[0];
64867                                     var way = context.entity(wayId);
64868                                     var vertexId = this.entityIds[0];
64869                                     var vertex = context.entity(vertexId);
64870                                     continueDrawing(way, vertex, context);
64871                                 }
64872                             }));
64873                         }
64874                         var last = graph.entity(lastID);
64875                         if (last.tags.noexit !== 'yes') {
64876                             fixes.push(new validationIssueFix({
64877                                 icon: 'iD-operation-continue',
64878                                 title: t('issues.fix.continue_from_end.title'),
64879                                 entityIds: [lastID],
64880                                 onClick: function(context) {
64881                                     var wayId = this.issue.entityIds[0];
64882                                     var way = context.entity(wayId);
64883                                     var vertexId = this.entityIds[0];
64884                                     var vertex = context.entity(vertexId);
64885                                     continueDrawing(way, vertex, context);
64886                                 }
64887                             }));
64888                         }
64889
64890                     } else {
64891                         fixes.push(new validationIssueFix({
64892                             title: t('issues.fix.connect_feature.title')
64893                         }));
64894                     }
64895
64896                     fixes.push(new validationIssueFix({
64897                         icon: 'iD-operation-delete',
64898                         title: t('issues.fix.delete_feature.title'),
64899                         entityIds: [entity.id],
64900                         onClick: function(context) {
64901                             var id = this.issue.entityIds[0];
64902                             var operation = operationDelete([id], context);
64903                             if (!operation.disabled()) {
64904                                 operation();
64905                             }
64906                         }
64907                     }));
64908                 } else {
64909                     fixes.push(new validationIssueFix({
64910                         title: t('issues.fix.connect_features.title')
64911                     }));
64912                 }
64913
64914                 return [new validationIssue({
64915                     type: type,
64916                     severity: 'warning',
64917                     message: function(context) {
64918                         if (this.entityIds.length === 1) {
64919                             var entity = context.hasEntity(this.entityIds[0]);
64920                             return entity ? t('issues.disconnected_way.highway.message', { highway: utilDisplayLabel(entity, context) }) : '';
64921                         }
64922                         return t('issues.disconnected_way.routable.message.multiple', { count: this.entityIds.length.toString() });
64923                     },
64924                     reference: showReference,
64925                     entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
64926                     fixes: fixes
64927                 })];
64928
64929
64930                 function showReference(selection) {
64931                     selection.selectAll('.issue-reference')
64932                         .data([0])
64933                         .enter()
64934                         .append('div')
64935                         .attr('class', 'issue-reference')
64936                         .text(t('issues.disconnected_way.routable.reference'));
64937                 }
64938
64939                 function routingIslandForEntity(entity) {
64940
64941                     if (entity.type !== 'way') return null;
64942
64943                     if (!isRoutableWay(entity, true)) return null;
64944
64945                     var waysToCheck = [entity];
64946                     var routingIsland = new Set([entity]);
64947
64948                     while (waysToCheck.length) {
64949                         var wayToCheck = waysToCheck.pop();
64950                         var childNodes = graph.childNodes(wayToCheck);
64951                         for (var i in childNodes) {
64952                             var vertex = childNodes[i];
64953                             var result = isConnectedVertex(vertex, routingIsland);
64954                             if (result === true) {
64955                                 return null;
64956                             } else if (result === false) {
64957                                 continue;
64958                             }
64959                             result.forEach(function(connectedWay) {
64960                                 if (!routingIsland.has(connectedWay)) {
64961                                     routingIsland.add(connectedWay);
64962                                     waysToCheck.push(connectedWay);
64963                                 }
64964                             });
64965                         }
64966                     }
64967
64968                     return routingIsland;
64969                 }
64970
64971                 function isConnectedVertex(vertex, routingIslandWays) {
64972                     // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
64973                     var osm = services$1.osm;
64974                     if (osm && !osm.isDataLoaded(vertex.loc)) return true;
64975
64976                     // entrances are considered connected
64977                     if (vertex.tags.entrance &&
64978                         vertex.tags.entrance !== 'no') return true;
64979                     if (vertex.tags.amenity === 'parking_entrance') return true;
64980
64981                     var parentsWays = graph.parentWays(vertex);
64982
64983                     // standalone vertex
64984                     if (parentsWays.length === 1) return false;
64985
64986                     var connectedWays = new Set();
64987
64988                     for (var i in parentsWays) {
64989                         var parentWay = parentsWays[i];
64990
64991                         // ignore any way we've already accounted for
64992                         if (routingIslandWays.has(parentWay)) continue;
64993
64994                         if (isRoutableWay(parentWay, false)) connectedWays.add(parentWay);
64995                     }
64996
64997                     if (connectedWays.size) return connectedWays;
64998
64999                     return false;
65000                 }
65001
65002                 function isRoutableWay(way, ignoreInnerWays) {
65003                     if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
65004
65005                     return graph.parentRelations(way).some(function(parentRelation) {
65006                         if (parentRelation.tags.type === 'route' &&
65007                             parentRelation.tags.route === 'ferry') return true;
65008
65009                         if (parentRelation.isMultipolygon() &&
65010                             isTaggedAsHighway(parentRelation) &&
65011                             (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
65012                     });
65013                 }
65014
65015             };
65016
65017             function continueDrawing(way, vertex, context) {
65018                 // make sure the vertex is actually visible and editable
65019                 var map = context.map();
65020                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65021                     map.zoomToEase(vertex);
65022                 }
65023
65024                 context.enter(
65025                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65026                 );
65027             }
65028
65029
65030             validation.type = type;
65031
65032             return validation;
65033         }
65034
65035         function validationFixmeTag(context) {
65036             var type = 'fixme_tag';
65037
65038
65039             var validation = function checkFixmeTag(entity) {
65040
65041                 if (!entity.tags.fixme) return [];
65042
65043                 // don't flag fixmes on features added by the user
65044                 if (entity.version === undefined) return [];
65045
65046                 if (entity.v !== undefined) {
65047                     var baseEntity = context.history().base().hasEntity(entity.id);
65048                     // don't flag fixmes added by the user on existing features
65049                     if (!baseEntity || !baseEntity.tags.fixme) return [];
65050                 }
65051
65052                 return [new validationIssue({
65053                     type: type,
65054                     severity: 'warning',
65055                     message: function(context) {
65056                         var entity = context.hasEntity(this.entityIds[0]);
65057                         return entity ? t('issues.fixme_tag.message', { feature: utilDisplayLabel(entity, context) }) : '';
65058                     },
65059                     reference: showReference,
65060                     entityIds: [entity.id]
65061                 })];
65062
65063                 function showReference(selection) {
65064                     selection.selectAll('.issue-reference')
65065                         .data([0])
65066                         .enter()
65067                         .append('div')
65068                         .attr('class', 'issue-reference')
65069                         .text(t('issues.fixme_tag.reference'));
65070                 }
65071             };
65072
65073             validation.type = type;
65074
65075             return validation;
65076         }
65077
65078         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.",operator:"ABN AMRO Group","operator:wikidata":"Q17061287","operator:wikipedia":"en:ABN AMRO Group"}},"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",operator:"Commonwealth Bank of Australia","operator:wikidata":"Q285328","operator:wikipedia":"en:Commonwealth 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",operator:"Access Bank Group","operator:wikidata":"Q4672420","operator:wikipedia":"en:Access Bank Group"}},"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",operator:"Hellenic Financial Stability Fund","operator:wikidata":"Q19903317","operator:wikipedia":"en:Hellenic Financial Stability Fund"}},"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",operator:"Argenta Group","operator:wikidata":"Q19604341"}},"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",operator:"Associated Banc-Corp"}},"amenity/bank|Attijariwafa Bank":{tags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank",operator:"Société Nationale d'Investissement","operator:en":"National Investment Company","operator:wikidata":"Q3488506","operator:wikipedia":"en:Société Nationale d'Investissement"}},"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",operator:"Grupo Aval","operator:en":"Aval Group","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"}},"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",operator:"Baden-Württembergischer Genossenschaftsverband","operator:en":"Baden-Württemberg Cooperative Association","operator:wikidata":"Q798896","operator:wikipedia":"de:Baden-Württembergischer Genossenschaftsverband"}},"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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Continental":{countryCodes:["pe"],tags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"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",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"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",operator:"Banco de Crédito del Perú","operator:en":"Credit Bank of Peru","operator:es":"Banco de Crédito del Perú","operator:wikidata":"Q4854124","operator:wikipedia":"es:Banco de Crédito del Perú"}},"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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl: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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"}},"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":{countryCodes:["ca","us"],matchNames:["bmo bank of montreal"],tags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"}},"amenity/bank|BMO Harris Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank",operator:"Bank of Montreal","operator:wikidata":"Q806693","operator:wikipedia":"en: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",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"en:BNP Paribas"}},"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|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",operator:"Groupe BPCE","operator:en":"BPCE Group","operator:fr":"Groupe BPCE","operator:wikidata":"Q806941","operator:wikipedia":"en:Groupe BPCE"}},"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:ed":"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",operator:"Landesbank Baden-Württemberg","operator:de":"Landesbank Baden-Württemberg","operator:en":"Baden-Württemberg Regional Bank","operator:wikidata":"Q451814","operator:wikipedia":"en:Landesbank Baden-Württemberg"}},"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",operator:"Citigroup","operator:wikidata":"Q219508","operator:wikipedia":"en:Citigroup"}},"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",operator:"Intesa Sanpaolo","operator:en":"Intesa St. Paul","operator:it":"Intesa Sanpaolo","operator:wikidata":"Q1343118","operator:wikipedia":"en:Intesa Sanpaolo"}},"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",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"}},"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",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"}},"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",operator:"Banco Popolare","operator:en":"Popular Bank","operator:it":"Banco Popolare","operator:wikidata":"Q806194","operator:wikipedia":"en:Banco Popolare"}},"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",operator:"Atlante","operator:en":"Atlas","operator:it":"Atlante","operator:wikidata":"Q25206459","operator:wikipedia":"en:Atlante (private equity fund)"}},"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ă",operator:"National Bank of Greece","operator:wikidata":"Q1816028","operator:wikipedia":"en:National Bank of Greece"}},"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",operator:"Grupo Aval","operator:en":"Aval Group","operator:pt":"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"}},"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",operator:"Grupo Elektra","operator:en":"Elektra Group","operator:es":"Grupo Elektra","operator:wikidata":"Q1142753","operator:wikipedia":"en:Grupo Elektra"}},"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",operator:"Falabella","operator:es":"Falabella","operator:wikidata":"Q1374824","operator:wikipedia":"en:S.A.C.I. 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",operator:"BIND Group"}},"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:["br"],tags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"}},"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",operator:"Popular, Inc.","operator:wikidata":"Q7229656","operator:wikipedia":"en:Popular, Inc."}},"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",operator:"Grupo Pichincha","operator:wikidata":"Q6440687","operator:wikipedia":"es:Grupo Pichincha"}},"amenity/bank|Banco Popular":{countryCodes:["us","vi"],matchNames:["popular"],tags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español",operator:"Banco Santander","operator:wikidata":"Q806215","operator:wikipedia":"en:Banco Santander"}},"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á",operator:"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"}},"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|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|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:["de","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 Bank":{tags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"}},"amenity/bank|EastWest Unibank":{countryCodes:["ph"],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",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~(Western USA)":{countryCodes:["us"],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 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",operator:"Fulton Financial Corporation","operator:wikidata":"Q5508431","operator:wikipedia":"en:Fulton Financial Corporation"}},"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":{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|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|Metrobank":{tags:{amenity:"bank",brand:"Metrobank",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|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",operator:"Banco de Oro","operator:wikidata":"Q4854129","operator:wikipedia":"en:Banco de Oro"}},"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":{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|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|Sampath Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"}},"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":{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|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:["ca","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|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":{nomatch:["amenity/fuel|United"],tags:{amenity:"bank",brand:"United Bank",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|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|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|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:{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 Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","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|东亚银行":{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|中国农业银行":{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|农业银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",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",operator:"nextbike","operator:wikidata":"Q2351279","operator:wikipedia":"de:Nextbike"}},"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|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|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|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é 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|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|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|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é","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's",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","peets coffee and 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|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|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:["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:{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"],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|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|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","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"}},"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シネマズ",operator:"株式会社 東急レクリエーション","operator:en":"Tokyu Recreation Co., Ltd.","operator:wikidata":"Q11527011","operator:wikipedia":"ja:東急レクリエーション"}},"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 and b","b and b theatres","b&b theaters"],tags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q835638","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"}},"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",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp"}},"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",operator:"株式会社松竹マルチプレックスシアターズ","operator:en":"Shochiku Multiplex Theatres, Ltd."}},"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シネマズ",operator:"TOHOシネマズ株式会社","operator:en":"TOHO CINEMAS LTD.",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":"イオンシネマ",operator:"イオンエンターテイメント株式会社","operator:en":"Aeon Entertainment Co., Ltd."}},"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":"ユナイテッド・シネマ",operator:"ユナイテッド・シネマ株式会社","operator:en":"UNITED CINEMAS CO., LTD."}},"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":"Q5207184","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|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/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|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"],matchNames:["western dental and orthodontics"],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|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","bruegger'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",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|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|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|CoCo壱番屋":{countryCodes:["cn","jp"],tags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya",takeaway:"yes"}},"amenity/fast_food|Cofix":{tags:{amenity:"fast_food",brand:"Cofix","brand:wikidata":"Q16132717","brand:wikipedia":"en:Cofix",name:"Cofix",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|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":{matchNames:["dominos"],tags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",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"],matchNames:["freddys frozen custard & steakburgers","freddys frozen custard and steakburgers"],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",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:["ca"],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|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"],matchNames:["hot head"],tags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",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"],matchNames:["jersey mikes"],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",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|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":{matchNames:["kentucky fried chicken"],tags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",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|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"],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|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"],matchNames:["moes "],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",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|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|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|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",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|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|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|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|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|Wahoo's Fish Taco":{countryCodes:["us"],matchNames:["wahoo's"],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",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",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 Пицца",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":"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|دجاج كنتاكي":{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:["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":"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":"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":"ドミノ・ピザ",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":"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:"日高屋",takeaway:"yes"}},"amenity/fast_food|松屋":{countryCodes:["cn","hk","jp","mo","sg","tw"],tags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya Foods",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:["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:lzh":"麥當勞","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:lzh":"麥當勞",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":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳",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|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":{nomatch:["shop/convenience|Carrefour Express","shop/supermarket|Carrefour"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour"}},"amenity/fuel|Carrefour Market":{nomatch:["shop/supermarket|Carrefour Market"],tags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe 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",operator:"Q1 Energie AG","operator:wikidata":"Q2121146","operator:wikipedia":"de:Q1 Energie"}},"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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"}},"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:"Татнефтепродукт",operator:"ТАИФ","operator:wikidata":"Q4448860","operator:wikipedia":"en:ТАИФ"}},"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/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":{matchNames:["ben and jerrys"],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|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|Ralph's Italian Ices":{countryCodes:["us"],matchNames:["ralphs famous italian ices & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","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|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|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/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|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/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",operator:"Apollo Hospitals","operator:wikidata":"Q4780321","operator:wikipedia":"en:Apollo Hospitals"}},"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":{matchNames:["cvs pharmacy"],nomatch:["shop/chemist|CVS"],tags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",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 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|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|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|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|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|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|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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"}},"amenity/pharmacy|Watsons":{nomatch:["shop/chemist|Watsons"],tags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group"}},"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|Живика":{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|Норма":{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|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|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",operator:"USPS","operator:wikidata":"Q668687"}},"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"],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",operator:"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":{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|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","ups store"],matchTags:["shop/copyshop"],tags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"}},"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",operator:"USPS","operator:wikidata":"Q668687"}},"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)":{countryCodes:[],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/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|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|Applebee's":{matchNames:["applebees bar & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill and bar"],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|BJ's":{countryCodes:["us"],matchNames:["bjs restaurant and brewhouse"],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 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"],matchNames:["buffalo wings and rings"],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":{matchNames:["chili's grill and bar"],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",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc."}},"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|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|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 & grill","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|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:"american",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|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|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|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 & schmick","mccormick & schmicks grill","mccormick and schmick","mccormick and schmick's"],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|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|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 company","noodles co"],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:"burger",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|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~(Branded)":{countryCodes:["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"],matchNames:["quaker steak and lube"],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|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|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|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|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:["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:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","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:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路"}},"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":"華屋与兵衛",operator:"株式会社ゼンショーホールディングス","operator:en":"Zensho Holdings Co., Ltd.","operator:ja":"株式会社ゼンショーホールディングス","operator:wikidata":"Q8069229","operator:wikipedia":"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/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/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|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|DHL Packstation":{countryCodes:["de"],matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"en:DHL Express",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",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"de:DHL",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|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:"dvd"}},"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",operator:"Posti Group","operator:wikidata":"Q843453","operator:wikipedia":"fi:Posti Group",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",operator:"Verkehrsverbund Oberelbe","operator:wikidata":"Q1426445","operator:wikipedia":"en:Verkehrsverbund Oberelbe",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":"コカ・コーラ",operator:"Coca Cola Japan Co., Ltd.","operator:wikidata":"Q11506438","operator:wikipedia":"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",operator:"Australian Red Cross Blood Service","operator:wikidata":"Q4824602","operator:wikipedia":"en:Australian Red Cross Blood Service",short_name:"Blood Service"}},"healthcare/clinic|ZoomCare":{countryCodes:["us"],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",operator:"AvalonBay Communities","operator:wikidata":"Q4827537","operator:wikipedia":"en:AvalonBay Communities",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"],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":{countryCodes:["au"],tags:{brand:"F45 Training","brand:wikidata":"Q64390973",leisure:"fitness_centre",name:"F45 Training"}},"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|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|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|Snap Fitness":{tags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"}},"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/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/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","brand:wikidata":"Q1526312","brand:wikipedia":"en:The 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":"Q295933","brand:wikipedia":"de:AOK Baden-Württemberg",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|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|Ростелеком":{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|中華電信":{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/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",operator:"Metcash","operator:wikidata":"Q23073728","operator:wikipedia":"en:Metcash",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",operator:"Pennsylvania Liquor Control Board","operator:wikidata":"Q7164000","operator:wikipedia":"en:Pennsylvania Liquor Control Board",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",operator:"Coles Group","operator:wikidata":"Q1339055","operator:wikipedia":"en:Coles Group",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|SAQ":{countryCodes:["ca"],tags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",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:"Винлаб",operator:"Белуга Групп","operator:wikidata":"Q4420254","operator:wikipedia":"ru:Белуга Групп",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|カクヤス":{countryCodes:["jp"],tags:{brand:"カクヤス","brand:ja":"カクヤス",name:"カクヤス","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|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|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|巴黎贝甜~(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|The Skin Bar at Ulta Beauty":{countryCodes:["us"],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|清心福全":{countryCodes:["tw"],tags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",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|サイクルベースあさひ":{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:["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|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|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|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",operator:"Genuine Parts Company","operator:wikidata":"Q5533818","operator:wikipedia":"en:Genuine Parts Company",shop:"car_parts"}},"shop/car_parts|Norauto":{tags:{brand:"Norauto",name:"Norauto",shop:"car_parts"}},"shop/car_parts|O'Reilly Auto Parts":{countryCodes:["us"],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",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",shop:"car_repair"}},"shop/car_repair|Sears Auto Center":{countryCodes:["mx","us"],tags:{brand:"Sears Auto Center",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 & auto service","tuffy tire & auto service center","tuffy tire & auto 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|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|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|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|ダイハツ":{countryCodes:["jp"],tags:{brand:"ダイハツ","brand:ja":"ダイハツ",name:"ダイハツ","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"],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|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/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":{nomatch:["amenity/pharmacy|Boots"],tags:{brand:"Boots",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":{nomatch:["amenity/pharmacy|CVS"],tags:{brand:"CVS",name:"CVS",shop:"chemist"}},"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",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",name:"Savers",shop:"chemist"}},"shop/chemist|Superdrug":{nomatch:["amenity/pharmacy|Superdrug"],tags:{brand:"Superdrug",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",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group",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|Godiva Chocolatier":{countryCodes:["us"],matchNames:["godiva"],tags:{brand:"Godiva Chocolatier","brand:wikidata":"Q931084","brand:wikipedia":"en:Godiva Chocolatier",name:"Godiva Chocolatier",shop:"chocolate"}},"shop/chocolate|Jeff de Bruges":{countryCodes:["cz","fr","gb"],tags:{brand:"Jeff de Bruges",name:"Jeff de Bruges",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/clothes|AOKI":{countryCodes:["jp"],tags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",operator:"株式会社AOKIホールディングス","operator:en":"AOKI Holdings Inc.",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":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",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","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",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|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","operator:wikidata":"Q5050852","operator:wikipedia":"en:Destination XL Group",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&g","dolce & gabana","dolce & gabanna","dolce & gabbanna","dolce and gabana","dolce and gabanna","dolce and gabbana","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|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",operator:"Edcon","operator:wikidata":"Q5335743","operator:wikipedia":"en:Edcon",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|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|Gant":{tags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"}},"shop/clothes|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|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"],matchNames:["janie and jack"],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",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|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|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|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",operator:"Ann Inc.","operator:wikidata":"Q4766699","operator:wikipedia":"en:Ann Inc.",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","operator:wikidata":"Q5370765","operator:wikipedia":"en:J.Crew",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|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|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":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"}},"shop/clothes|Motherhood Maternity":{countryCodes:["ca","us"],tags:{brand:"Motherhood Maternity",clothes:"maternity",name:"Motherhood Maternity",operator:"Destination Maternity","operator:wikipedia":"en:Destination 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","operator:wikidata":"Q28172489","operator:wikipedia":"en:Bestseller (company)",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|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",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",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|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",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",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",operator:"FNG Group","operator:wikidata":"Q15875120","operator:wikipedia":"nl:FNG Group",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",operator:"CBR Fashion Holding","operator:wikidata":"Q1022989","operator:wikipedia":"de:CBR Fashion Holding",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|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|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":{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|White House Black Market":{countryCodes:["ca","us"],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|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|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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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|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",operator:"Codifrance","operator:wikidata":"Q2981692","operator:wikipedia":"fr:Codifrance",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|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|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":{nomatch:["amenity/fuel|Royal Farms"],tags:{brand:"Royal Farms",name:"Royal Farms",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",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|Доброном":{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|Елена":{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|Мрія":{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|Фасоль":{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",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"en:Seven & I Holdings Co.",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":"ローソン・スリーエフ",operator:"株式会社エル・ティーエフ","operator:en":"L・TF Co., Ltd.",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|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","brand:wikipedia":"en:Michaels",name:"Michaels",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|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|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"],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"],matchNames:["lord and taylor"],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:["marks and spencer"],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",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",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"],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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en: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|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":{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|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",operator:"ElectronicPartner","operator:wikidata":"Q1326008","operator:wikipedia":"de:ElectronicPartner",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:["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|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","van cleef and arpels","van cleef and 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/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","ashley furniture homestore"],tags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",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"],matchNames:["crate and barrel"],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|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|İ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/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|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",operator:"Disney Consumer Products","operator:wikidata":"Q3030410","operator:wikipedia":"en:Disney Consumer Products and Interactive Media",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"],matchTags:["shop/stationery"],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|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|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"],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/hardware|220 вольт":{countryCodes:["by","ru","ua"],tags:{brand:"220 вольт",name:"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"],matchNames:["holland and barrett"],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/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:ja":"アニメイト",name:"アニメイト","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"],matchNames:["bed bath and beyond"],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|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|Claire's":{matchTags:["shop/clothes"],tags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",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",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",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",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",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|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 and company","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/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|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|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"],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"],tags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",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|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|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|Wind":{countryCodes:["it"],tags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",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|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|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/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/kiosk"],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",operator:"GrandVision","operator:wikidata":"Q15812731","operator:wikipedia":"nl:GrandVision",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",name:"Blacks","operator:wikidata":"Q4923333","operator:wikipedia":"en:Blacks Outdoor Retail",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",name:"Millets","operator:wikidata":"Q4923333","operator:wikipedia":"en:Blacks Outdoor Retail",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",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|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"],tags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"}},"shop/pawnbroker|Loombard":{countryCodes:["pl"],tags:{brand:"Loombard",name:"Loombard",shop:"pawnbroker"}},"shop/pawnbroker|M Lhuillier":{countryCodes:["ph"],tags:{brand:"M Lhuillier",name:"M Lhuillier",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",operator:"Petco","operator:wikidata":"Q7171798","operator:wikipedia":"en:Petco",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/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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",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|CCC":{tags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",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|Ecco":{tags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"}},"shop/shoes|FLO":{countryCodes:["al","tr"],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|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"],matchNames:["johnston and murphy"],tags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"}},"shop/shoes|Journeys":{countryCodes:["ca","us"],tags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",operator:"Genesco","operator:wikidata":"Q5532704","operator:wikipedia":"en:Genesco",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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",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|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",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",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|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",operator:"Wortmann Schuh-Holding","operator:wikidata":"Q1726079","operator:wikipedia":"de:Wortmann Schuh-Holding",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|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":"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|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",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|Papyrus":{countryCodes:["us"],tags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",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|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","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe 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",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour Contact":{countryCodes:["fr"],tags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour Market":{nomatch:["amenity/fuel|Carrefour Market"],tags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",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",operator:"Edeka","operator:wikidata":"Q701755","operator:wikipedia":"en:Edeka",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",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",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"],matchTags:["shop/greengrocer"],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","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",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|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 Market":{tags:{brand:"Fresh Market",name:"Fresh Market",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":{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|Iceland":{tags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",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|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","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados 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","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",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":{tags:{brand:"Mercator",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",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",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|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|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|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"],matchNames:["stop and shop"],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","operator:wikidata":"Q4975085","operator:wikipedia":"en:Brookshire Grocery Company",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|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"],tags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",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|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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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|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"],matchNames:["евроопт market"],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|Евроопт Super":{countryCodes:["by"],tags:{brand:"Евроопт Super",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|いなげや":{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: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: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":"ヨークマート",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"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 Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",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/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|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 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 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|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":{matchNames:["tui reisecenter"],tags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",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|Thomson":{countryCodes:["gb"],tags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",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/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|D10150":{tags:{brand:"D10150",name:"D10150",shop:"variety_store"}},"shop/variety_store|D9150":{tags:{brand:"D9150",name:"D9150",shop:"variety_store"}},"shop/variety_store|D9300":{countryCodes:["br"],tags:{brand:"D9300",name:"D9300",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|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|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",operator:"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",operator:"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",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",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":"コストコ",operator:"コストコホールセールジャパン株式会社","operator:en":"Costco Wholesale Japan Co., Ltd.",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 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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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 & suites","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",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hampton":{countryCodes:["us"],matchNames:["hampton inn & suites","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|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|Hyatt":{tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt Centric":{tags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt House":{countryCodes:["us"],tags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",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",operator:"Hyatt",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 & suites","la quinta inn and suites","la quinta inns & suites","la quinta inns and suites"],tags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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",operator:"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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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",operator:"Marriott International","operator:wikidata":"Q1141173","operator:wikipedia":"en:Marriott International",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|Travelodge":{tags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",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",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"}}};
65079         var brands$1 = {
65080         brands: brands
65081         };
65082
65083         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$"];
65084         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)$"];
65085         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(\\s(bar|shop))?$","^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"];
65086         var filters = {
65087         keepTags: keepTags,
65088         discardKeys: discardKeys,
65089         discardNames: discardNames
65090         };
65091
65092         // ES5 for iD, for now
65093
65094
65095         // remove spaces, punctuation, diacritics
65096         var simplify = function simplify(str) {
65097             return diacritics.remove(
65098                 str.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,'')
65099                     .toLowerCase()
65100             );
65101         };
65102
65103         // ES5 for iD, for now
65104
65105
65106         // toParts - split a name-suggestion-index key into parts
65107         // {
65108         //   kvnd:        "amenity/fast_food|Thaï Express~(North America)",
65109         //   kvn:         "amenity/fast_food|Thaï Express",
65110         //   kv:          "amenity/fast_food",
65111         //   k:           "amenity",
65112         //   v:           "fast_food",
65113         //   n:           "Thaï Express",
65114         //   d:           "(North America)",
65115         //   nsimple:     "thaiexpress",
65116         //   kvnnsimple:  "amenity/fast_food|thaiexpress"
65117         // }
65118         var to_parts = function toParts(kvnd) {
65119             var parts = {};
65120             parts.kvnd = kvnd;
65121
65122             var kvndparts = kvnd.split('~', 2);
65123             if (kvndparts.length > 1) parts.d = kvndparts[1];
65124
65125             parts.kvn = kvndparts[0];
65126             var kvnparts = parts.kvn.split('|', 2);
65127             if (kvnparts.length > 1) parts.n = kvnparts[1];
65128
65129             parts.kv = kvnparts[0];
65130             var kvparts = parts.kv.split('/', 2);
65131             parts.k = kvparts[0];
65132             parts.v = kvparts[1];
65133
65134             parts.nsimple = simplify(parts.n);
65135             parts.kvnsimple = parts.kv + '|' + parts.nsimple;
65136             return parts;
65137         };
65138
65139         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"],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"],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"],vending:["amenity/vending_machine","shop/vending_machine"],wholesale:["shop/supermarket","shop/wholesale"]};
65140         var match_groups = {
65141         matchGroups: matchGroups
65142         };
65143
65144         var match_groups$1 = /*#__PURE__*/Object.freeze({
65145                 matchGroups: matchGroups,
65146                 'default': match_groups
65147         });
65148
65149         var require$$0 = getCjsExportFromNamespace(match_groups$1);
65150
65151         // ES5 for iD, for now
65152
65153
65154
65155         var matchGroups$1 = require$$0.matchGroups;
65156
65157
65158         var matcher$1 = function() {
65159             var _warnings = [];    // array of match conflict pairs
65160             var _ambiguous = {};
65161             var _matchIndex = {};
65162             var matcher = {};
65163
65164             // Create an index of all the keys/simplenames for fast matching
65165             matcher.buildMatchIndex = function(brands) {
65166                 Object.keys(brands).forEach(function(kvnd) {
65167                     var obj = brands[kvnd];
65168                     var parts = to_parts(kvnd);
65169
65170                     if (obj.countryCodes) {
65171                         parts.countryCodes = obj.countryCodes.slice();  // copy
65172                     }
65173
65174                     var matchTags = (obj.matchTags || [])
65175                         .map(function(s) { return s.toLowerCase(); });
65176                     var matchNames = (obj.matchNames || [])
65177                         .concat(obj.tags.alt_name || [])        // #2732
65178                         .concat(obj.tags.official_name || [])   // #2732
65179                         .concat(obj.tags.short_name || [])      // #2732
65180                         .map(simplify);
65181                     var nomatches = (obj.nomatch || [])
65182                         .map(function(kvnd) { return to_parts(kvnd).kvnsimple; });
65183
65184                     var match_kv = [parts.kv].concat(matchTags);
65185                     var match_nsimple = [parts.nsimple].concat(matchNames);
65186
65187                     match_kv.forEach(function(kv) {
65188                         match_nsimple.forEach(function(nsimple) {
65189                             var test = kv + nsimple;
65190                             if (nomatches.some(function(s) { return s === test; })) {
65191                                 console.log('WARNING match/nomatch conflict for ' + test);
65192                                 return;
65193                             }
65194
65195                             if (parts.d) {
65196                                 // fixme: name collisions will overwrite the single entry (ok for now)
65197                                 if (!_ambiguous[kv]) _ambiguous[kv] = {};
65198                                 _ambiguous[kv][nsimple] = parts;
65199                             } else {
65200                                 // name collisions are a problem in matchIndex, warn if we detect it
65201                                 if (!_matchIndex[kv]) _matchIndex[kv] = {};
65202                                 var m = _matchIndex[kv][nsimple];
65203                                 if (m) {  // there already is a match for this
65204                                     _warnings.push([m.kvnd, kvnd + ' ("' + nsimple + '")']);
65205                                 } else {
65206                                     _matchIndex[kv][nsimple] = parts;
65207                                 }
65208                             }
65209                         });
65210                     });
65211                 });
65212             };
65213
65214
65215             // pass a `key`, `value`, `name` and return the best match,
65216             // `countryCode` optional (if supplied, must match that too)
65217             matcher.matchKVN = function(key, value, name, countryCode) {
65218                 return matcher.matchParts(to_parts(key + '/' + value + '|' + name), countryCode);
65219             };
65220
65221             // pass a parts object and return the best match,
65222             // `countryCode` optional (if supplied, must match that too)
65223             matcher.matchParts = function(parts, countryCode) {
65224                 var match = null;
65225                 var inGroup = false;
65226
65227                 // fixme: we currently return a single match for ambiguous
65228                 match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
65229                 if (match && matchesCountryCode(match)) return match;
65230
65231                 // try to return an exact match
65232                 match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
65233                 if (match && matchesCountryCode(match)) return match;
65234
65235                 // look in match groups
65236                 for (var mg in matchGroups$1) {
65237                     var matchGroup = matchGroups$1[mg];
65238                     match = null;
65239                     inGroup = false;
65240
65241                     for (var i = 0; i < matchGroup.length; i++) {
65242                         var otherkv = matchGroup[i].toLowerCase();
65243                         if (!inGroup) {
65244                             inGroup = (otherkv === parts.kv);
65245                         }
65246                         if (!match) {
65247                             // fixme: we currently return a single match for ambiguous
65248                             match = _ambiguous[otherkv] && _ambiguous[otherkv][parts.nsimple];
65249                         }
65250                         if (!match) {
65251                             match = _matchIndex[otherkv] && _matchIndex[otherkv][parts.nsimple];
65252                         }
65253
65254                         if (!matchesCountryCode(match)) {
65255                             match = null;
65256                         }
65257
65258                         if (inGroup && match) {
65259                             return match;
65260                         }
65261                     }
65262                 }
65263
65264                 return null;
65265
65266
65267                 function matchesCountryCode(match) {
65268                     if (!countryCode) return true;
65269                     if (!match.countryCodes) return true;
65270                     return (match.countryCodes.indexOf(countryCode) !== -1);
65271                 }
65272             };
65273
65274
65275             matcher.getWarnings = function() {
65276                 return _warnings;
65277             };
65278
65279
65280             return matcher;
65281         };
65282
65283         /* DATA */
65284
65285         function validationGenericName() {
65286             var type = 'generic_name';
65287
65288             // known list of generic names (e.g. "bar")
65289             var discardNamesRegexes = filters.discardNames.map(function(discardName) {
65290                 return new RegExp(discardName, 'i');
65291             });
65292
65293             var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
65294
65295             function isGenericName(entity) {
65296                 var name = entity.tags.name;
65297                 if (!name) return false;
65298                 name = name.toLowerCase();
65299
65300                 var i, key, val;
65301
65302                 // test if the name is just the key or tag value (e.g. "park")
65303                 for (i = 0; i < keysToTestForGenericValues.length; i++) {
65304                     key = keysToTestForGenericValues[i];
65305                     val = entity.tags[key];
65306                     if (val) {
65307                         val = val.toLowerCase();
65308                         if (key === name ||
65309                             val === name ||
65310                             key.replace(/\_/g, ' ') === name ||
65311                             val.replace(/\_/g, ' ') === name) {
65312                             return entity.tags.name;
65313                         }
65314                     }
65315                 }
65316
65317                 // test if the name is otherwise generic
65318                 for (i = 0; i < discardNamesRegexes.length; i++) {
65319                     if (discardNamesRegexes[i].test(name)) {
65320                         return entity.tags.name;
65321                     }
65322                 }
65323
65324                 return false;
65325             }
65326
65327
65328             var validation = function checkGenericName(entity) {
65329                 var generic = isGenericName(entity);
65330                 if (!generic) return [];
65331
65332                 return [new validationIssue({
65333                     type: type,
65334                     severity: 'warning',
65335                     message: function(context) {
65336                         var entity = context.hasEntity(this.entityIds[0]);
65337                         if (!entity) return '';
65338                         var preset = utilPreset(entity, context);
65339                         return t('issues.generic_name.message', { feature: preset.name(), name: generic });
65340                     },
65341                     reference: showReference,
65342                     entityIds: [entity.id],
65343                     hash: generic,
65344                     fixes: [
65345                         new validationIssueFix({
65346                             icon: 'iD-operation-delete',
65347                             title: t('issues.fix.remove_generic_name.title'),
65348                             onClick: function(context) {
65349                                 var entityId = this.issue.entityIds[0];
65350                                 var entity = context.entity(entityId);
65351                                 var tags = Object.assign({}, entity.tags);   // shallow copy
65352                                 delete tags.name;
65353                                 context.perform(
65354                                     actionChangeTags(entityId, tags),
65355                                     t('issues.fix.remove_generic_name.annotation')
65356                                 );
65357                             }
65358                         })
65359                     ]
65360                 })];
65361
65362
65363                 function showReference(selection) {
65364                     selection.selectAll('.issue-reference')
65365                         .data([0])
65366                         .enter()
65367                         .append('div')
65368                         .attr('class', 'issue-reference')
65369                         .text(t('issues.generic_name.reference'));
65370                 }
65371             };
65372
65373             validation.type = type;
65374
65375             return validation;
65376         }
65377
65378         function validationImpossibleOneway() {
65379             var type = 'impossible_oneway';
65380
65381             var validation = function checkImpossibleOneway(entity, graph) {
65382
65383                 if (entity.type !== 'way' || entity.geometry(graph) !== 'line') return [];
65384
65385                 if (entity.isClosed()) return [];
65386
65387                 if (!typeForWay(entity)) return [];
65388
65389                 if (!isOneway(entity)) return [];
65390
65391                 var firstIssues = issuesForNode(entity, entity.first());
65392                 var lastIssues = issuesForNode(entity, entity.last());
65393
65394                 return firstIssues.concat(lastIssues);
65395
65396                 function typeForWay(way) {
65397                     if (way.geometry(graph) !== 'line') return null;
65398
65399                     if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
65400                     if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
65401                     return null;
65402                 }
65403
65404                 function isOneway(way) {
65405                     if (way.tags.oneway === 'yes') return true;
65406                     if (way.tags.oneway) return false;
65407
65408                     for (var key in way.tags) {
65409                         if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
65410                             return true;
65411                         }
65412                     }
65413                     return false;
65414                 }
65415
65416                 function nodeOccursMoreThanOnce(way, nodeID) {
65417                     var occurences = 0;
65418                     for (var index in way.nodes) {
65419                         if (way.nodes[index] === nodeID) {
65420                             occurences += 1;
65421                             if (occurences > 1) return true;
65422                         }
65423                     }
65424                     return false;
65425                 }
65426
65427                 function isConnectedViaOtherTypes(way, node) {
65428
65429                     var wayType = typeForWay(way);
65430
65431                     if (wayType === 'highway') {
65432                         // entrances are considered connected
65433                         if (node.tags.entrance && node.tags.entrance !== 'no') return true;
65434                         if (node.tags.amenity === 'parking_entrance') return true;
65435                     } else if (wayType === 'waterway') {
65436                         if (node.id === way.first()) {
65437                             // multiple waterways may start at the same spring
65438                             if (node.tags.natural === 'spring') return true;
65439                         } else {
65440                             // multiple waterways may end at the same drain
65441                             if (node.tags.manhole === 'drain') return true;
65442                         }
65443                     }
65444
65445                     return graph.parentWays(node).some(function(parentWay) {
65446                         if (parentWay.id === way.id) return false;
65447
65448                         if (wayType === 'highway') {
65449
65450                             // allow connections to highway areas
65451                             if (parentWay.geometry(graph) === 'area' &&
65452                                 osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
65453
65454                             // count connections to ferry routes as connected
65455                             if (parentWay.tags.route === 'ferry') return true;
65456
65457                             return graph.parentRelations(parentWay).some(function(parentRelation) {
65458                                 if (parentRelation.tags.type === 'route' &&
65459                                     parentRelation.tags.route === 'ferry') return true;
65460
65461                                 // allow connections to highway multipolygons
65462                                 return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
65463                             });
65464                         } else if (wayType === 'waterway') {
65465                             // multiple waterways may start or end at a water body at the same node
65466                             if (parentWay.tags.natural === 'water' ||
65467                                 parentWay.tags.natural === 'coastline') return true;
65468                         }
65469                         return false;
65470                     });
65471                 }
65472
65473                 function issuesForNode(way, nodeID) {
65474
65475                     var isFirst = nodeID === way.first();
65476
65477                     var wayType = typeForWay(way);
65478
65479                     // ignore if this way is self-connected at this node
65480                     if (nodeOccursMoreThanOnce(way, nodeID)) return [];
65481
65482                     var osm = services$1.osm;
65483                     if (!osm) return [];
65484
65485                     var node = graph.hasEntity(nodeID);
65486
65487                     // ignore if this node or its tile are unloaded
65488                     if (!node || !osm.isDataLoaded(node.loc)) return [];
65489
65490                     if (isConnectedViaOtherTypes(way, node)) return [];
65491
65492                     var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
65493                         if (parentWay.id === way.id) return false;
65494                         return typeForWay(parentWay) === wayType;
65495                     });
65496
65497                     // assume it's okay for waterways to start or end disconnected for now
65498                     if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
65499
65500                     var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
65501                         return isOneway(attachedWay);
65502                     });
65503
65504                     // ignore if the way is connected to some non-oneway features
65505                     if (attachedOneways.length < attachedWaysOfSameType.length) return [];
65506
65507                     if (attachedOneways.length) {
65508                         var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
65509                             if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
65510                             if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
65511                             return false;
65512                         });
65513                         if (connectedEndpointsOkay) return [];
65514                     }
65515
65516                     var fixes = [];
65517
65518                     if (attachedOneways.length) {
65519                         fixes.push(new validationIssueFix({
65520                             icon: 'iD-operation-reverse',
65521                             title: t('issues.fix.reverse_feature.title'),
65522                             entityIds: [way.id],
65523                             onClick: function(context) {
65524                                 var id = this.issue.entityIds[0];
65525                                 context.perform(actionReverse(id), t('operations.reverse.annotation'));
65526                             }
65527                         }));
65528                     }
65529                     if (node.tags.noexit !== 'yes') {
65530                         fixes.push(new validationIssueFix({
65531                             icon: 'iD-operation-continue' + (isFirst ? '-left' : ''),
65532                             title: t('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
65533                             onClick: function(context) {
65534                                 var entityID = this.issue.entityIds[0];
65535                                 var vertexID = this.issue.entityIds[1];
65536                                 var way = context.entity(entityID);
65537                                 var vertex = context.entity(vertexID);
65538                                 continueDrawing(way, vertex, context);
65539                             }
65540                         }));
65541                     }
65542
65543                     var placement = isFirst ? 'start' : 'end',
65544                         messageID = wayType + '.',
65545                         referenceID = wayType + '.';
65546
65547                     if (wayType === 'waterway') {
65548                         messageID += 'connected.' + placement;
65549                         referenceID += 'connected';
65550                     } else {
65551                         messageID += placement;
65552                         referenceID += placement;
65553                     }
65554
65555                     return [new validationIssue({
65556                         type: type,
65557                         subtype: wayType,
65558                         severity: 'warning',
65559                         message: function(context) {
65560                             var entity = context.hasEntity(this.entityIds[0]);
65561                             return entity ? t('issues.impossible_oneway.' + messageID + '.message', {
65562                                 feature: utilDisplayLabel(entity, context)
65563                             }) : '';
65564                         },
65565                         reference: getReference(referenceID),
65566                         entityIds: [way.id, node.id],
65567                         fixes: fixes
65568                     })];
65569
65570                     function getReference(referenceID) {
65571                         return function showReference(selection) {
65572                             selection.selectAll('.issue-reference')
65573                                 .data([0])
65574                                 .enter()
65575                                 .append('div')
65576                                 .attr('class', 'issue-reference')
65577                                 .text(t('issues.impossible_oneway.' + referenceID + '.reference'));
65578                         };
65579                     }
65580                 }
65581             };
65582
65583             function continueDrawing(way, vertex, context) {
65584                 // make sure the vertex is actually visible and editable
65585                 var map = context.map();
65586                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65587                     map.zoomToEase(vertex);
65588                 }
65589
65590                 context.enter(
65591                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65592                 );
65593             }
65594
65595             validation.type = type;
65596
65597             return validation;
65598         }
65599
65600         function validationIncompatibleSource() {
65601             var type = 'incompatible_source';
65602             var invalidSources = [{id:'google', regex:'google'}];
65603
65604             var validation = function checkIncompatibleSource(entity) {
65605                 var issues = [];
65606
65607                 if (entity.tags && entity.tags.source) {
65608                     invalidSources.forEach(function(invalidSource) {
65609                         var pattern = new RegExp(invalidSource.regex, 'i');
65610
65611                         if (entity.tags.source.match(pattern)) {
65612                             issues.push(new validationIssue({
65613                                 type: type,
65614                                 severity: 'warning',
65615                                 message: function(context) {
65616                                     var entity = context.hasEntity(this.entityIds[0]);
65617                                     return entity ? t('issues.incompatible_source.' + invalidSource.id + '.feature.message', {
65618                                         feature: utilDisplayLabel(entity, context)
65619                                     }) : '';
65620                                 },
65621                                 reference: getReference(invalidSource.id),
65622                                 entityIds: [entity.id],
65623                                 fixes: [
65624                                     new validationIssueFix({
65625                                         title: t('issues.fix.remove_proprietary_data.title')
65626                                     })
65627                                 ]
65628                             }));
65629                         }
65630                     });
65631                 }
65632
65633                 return issues;
65634
65635
65636                 function getReference(id) {
65637                     return function showReference(selection) {
65638                         selection.selectAll('.issue-reference')
65639                             .data([0])
65640                             .enter()
65641                             .append('div')
65642                             .attr('class', 'issue-reference')
65643                             .text(t('issues.incompatible_source.' + id + '.reference'));
65644                     };
65645                 }
65646             };
65647
65648             validation.type = type;
65649
65650             return validation;
65651         }
65652
65653         function validationFormatting() {
65654             var type = 'invalid_format';
65655
65656             var validation = function(entity) {
65657                 var issues = [];
65658
65659                 function isValidEmail(email) {
65660                     // Emails in OSM are going to be official so they should be pretty simple
65661                     // Using negated lists to better support all possible unicode characters (#6494)
65662                     var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
65663
65664                     // An empty value is also acceptable
65665                     return (!email || valid_email.test(email));
65666                 }
65667
65668                 function isSchemePresent(url) {
65669                     var valid_scheme = /^https?:\/\//i;
65670                     return (!url || valid_scheme.test(url));
65671                 }
65672
65673                 function showReferenceEmail(selection) {
65674                     selection.selectAll('.issue-reference')
65675                         .data([0])
65676                         .enter()
65677                         .append('div')
65678                         .attr('class', 'issue-reference')
65679                         .text(t('issues.invalid_format.email.reference'));
65680                 }
65681
65682                 function showReferenceWebsite(selection) {
65683                     selection.selectAll('.issue-reference')
65684                         .data([0])
65685                         .enter()
65686                         .append('div')
65687                         .attr('class', 'issue-reference')
65688                         .text(t('issues.invalid_format.website.reference'));
65689                 }
65690
65691                 if (entity.tags.website) {
65692                     // Multiple websites are possible
65693                     // If ever we support ES6, arrow functions make this nicer
65694                     var websites = entity.tags.website
65695                         .split(';')
65696                         .map(function(s) { return s.trim(); })
65697                         .filter(function(x) { return !isSchemePresent(x); });
65698
65699                     if (websites.length) {
65700                         issues.push(new validationIssue({
65701                             type: type,
65702                             subtype: 'website',
65703                             severity: 'warning',
65704                             message: function(context) {
65705                                 var entity = context.hasEntity(this.entityIds[0]);
65706                                 return entity ? t('issues.invalid_format.website.message' + this.data,
65707                                     { feature: utilDisplayLabel(entity, context), site: websites.join(', ') }) : '';
65708                             },
65709                             reference: showReferenceWebsite,
65710                             entityIds: [entity.id],
65711                             hash: websites.join(),
65712                             data: (websites.length > 1) ? '_multi' : ''
65713                         }));
65714                     }
65715                 }
65716
65717                 if (entity.tags.email) {
65718                     // Multiple emails are possible
65719                     var emails = entity.tags.email
65720                         .split(';')
65721                         .map(function(s) { return s.trim(); })
65722                         .filter(function(x) { return !isValidEmail(x); });
65723
65724                     if (emails.length) {
65725                         issues.push(new validationIssue({
65726                             type: type,
65727                             subtype: 'email',
65728                             severity: 'warning',
65729                             message: function(context) {
65730                                 var entity = context.hasEntity(this.entityIds[0]);
65731                                 return entity ? t('issues.invalid_format.email.message' + this.data,
65732                                     { feature: utilDisplayLabel(entity, context), email: emails.join(', ') }) : '';
65733                             },
65734                             reference: showReferenceEmail,
65735                             entityIds: [entity.id],
65736                             hash: emails.join(),
65737                             data: (emails.length > 1) ? '_multi' : ''
65738                         }));
65739                     }
65740                 }
65741
65742                 return issues;
65743             };
65744
65745             validation.type = type;
65746
65747             return validation;
65748         }
65749
65750         function validationMaprules() {
65751             var type = 'maprules';
65752
65753             var validation = function checkMaprules(entity, graph) {
65754                 if (!services$1.maprules) return [];
65755
65756                 var rules = services$1.maprules.validationRules();
65757                 var issues = [];
65758
65759                 for (var i = 0; i < rules.length; i++) {
65760                     var rule = rules[i];
65761                     rule.findIssues(entity, graph, issues);
65762                 }
65763
65764                 return issues;
65765             };
65766
65767
65768             validation.type = type;
65769
65770             return validation;
65771         }
65772
65773         function validationMissingRole() {
65774             var type = 'missing_role';
65775
65776             var validation = function checkMissingRole(entity, graph) {
65777                 var issues = [];
65778                 if (entity.type === 'way') {
65779                     graph.parentRelations(entity).forEach(function(relation) {
65780                         if (!relation.isMultipolygon()) return;
65781
65782                         var member = relation.memberById(entity.id);
65783                         if (member && isMissingRole(member)) {
65784                             issues.push(makeIssue(entity, relation, member));
65785                         }
65786                     });
65787                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
65788                     entity.indexedMembers().forEach(function(member) {
65789                         var way = graph.hasEntity(member.id);
65790                         if (way && isMissingRole(member)) {
65791                             issues.push(makeIssue(way, entity, member));
65792                         }
65793                     });
65794                 }
65795
65796                 return issues;
65797             };
65798
65799
65800             function isMissingRole(member) {
65801                 return !member.role || !member.role.trim().length;
65802             }
65803
65804
65805             function makeIssue(way, relation, member) {
65806                 return new validationIssue({
65807                     type: type,
65808                     severity: 'warning',
65809                     message: function(context) {
65810                         var member = context.hasEntity(this.entityIds[1]),
65811                             relation = context.hasEntity(this.entityIds[0]);
65812                         return (member && relation) ? t('issues.missing_role.message', {
65813                             member: utilDisplayLabel(member, context),
65814                             relation: utilDisplayLabel(relation, context)
65815                         }) : '';
65816                     },
65817                     reference: showReference,
65818                     entityIds: [relation.id, way.id],
65819                     data: {
65820                         member: member
65821                     },
65822                     hash: member.index.toString(),
65823                     fixes: [
65824                         makeAddRoleFix('inner'),
65825                         makeAddRoleFix('outer'),
65826                         new validationIssueFix({
65827                             icon: 'iD-operation-delete',
65828                             title: t('issues.fix.remove_from_relation.title'),
65829                             onClick: function(context) {
65830                                 context.perform(
65831                                     actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
65832                                     t('operations.delete_member.annotation')
65833                                 );
65834                             }
65835                         })
65836                     ]
65837                 });
65838
65839
65840                 function showReference(selection) {
65841                     selection.selectAll('.issue-reference')
65842                         .data([0])
65843                         .enter()
65844                         .append('div')
65845                         .attr('class', 'issue-reference')
65846                         .text(t('issues.missing_role.multipolygon.reference'));
65847                 }
65848             }
65849
65850
65851             function makeAddRoleFix(role) {
65852                 return new validationIssueFix({
65853                     title: t('issues.fix.set_as_' + role + '.title'),
65854                     onClick: function(context) {
65855                         var oldMember = this.issue.data.member;
65856                         var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
65857                         context.perform(
65858                             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
65859                             t('operations.change_role.annotation')
65860                         );
65861                     }
65862                 });
65863             }
65864
65865             validation.type = type;
65866
65867             return validation;
65868         }
65869
65870         function validationMissingTag() {
65871             var type = 'missing_tag';
65872
65873
65874             function hasDescriptiveTags(entity) {
65875                 var keys = Object.keys(entity.tags)
65876                     .filter(function(k) {
65877                         if (k === 'area' || k === 'name') {
65878                             return false;
65879                         } else {
65880                             return osmIsInterestingTag(k);
65881                         }
65882                     });
65883
65884                 if (entity.type === 'relation' && keys.length === 1) {
65885                     return entity.tags.type !== 'multipolygon';
65886                 }
65887                 return keys.length > 0;
65888             }
65889
65890
65891             function isUnknownRoad(entity) {
65892                 return entity.type === 'way' && entity.tags.highway === 'road';
65893             }
65894
65895             function isUntypedRelation(entity) {
65896                 return entity.type === 'relation' && !entity.tags.type;
65897             }
65898
65899
65900             var validation = function checkMissingTag(entity, graph) {
65901
65902                 // ignore vertex features and relation members
65903                 if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
65904                     return [];
65905                 }
65906
65907                 var subtype;
65908
65909                 if (Object.keys(entity.tags).length === 0) {
65910                     subtype = 'any';
65911                 } else if (!hasDescriptiveTags(entity)) {
65912                     subtype = 'descriptive';
65913                 } else if (isUntypedRelation(entity)) {
65914                     subtype = 'relation_type';
65915                 } else if (isUnknownRoad(entity)) {
65916                     subtype = 'highway_classification';
65917                 }
65918
65919                 if (!subtype) return [];
65920
65921                 var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
65922
65923                 var fixes = [
65924                     new validationIssueFix({
65925                         icon: 'iD-icon-search',
65926                         title: t('issues.fix.' + selectFixType + '.title'),
65927                         onClick: function(context) {
65928                             context.ui().sidebar.showPresetList();
65929                         }
65930                     })
65931                 ];
65932
65933                 // can always delete if the user created it in the first place..
65934                 var canDelete = (entity.version === undefined || entity.v !== undefined);
65935                 fixes.push(
65936                     new validationIssueFix({
65937                         icon: 'iD-operation-delete',
65938                         title: t('issues.fix.delete_feature.title'),
65939                         onClick: function(context) {
65940                             var id = this.issue.entityIds[0];
65941                             var operation = operationDelete([id], context);
65942                             if (!operation.disabled()) {
65943                                 operation();
65944                             }
65945                         }
65946                     })
65947                 );
65948
65949                 var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
65950                 var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
65951
65952                 var severity = (canDelete && subtype !== 'highway_classification') ? 'error' : 'warning';
65953
65954                 return [new validationIssue({
65955                     type: type,
65956                     subtype: subtype,
65957                     severity: severity,
65958                     message: function(context) {
65959                         var entity = context.hasEntity(this.entityIds[0]);
65960                         return entity ? t('issues.' + messageID + '.message', {
65961                             feature: utilDisplayLabel(entity, context)
65962                         }) : '';
65963                     },
65964                     reference: showReference,
65965                     entityIds: [entity.id],
65966                     fixes: fixes
65967                 })];
65968
65969
65970                 function showReference(selection) {
65971                     selection.selectAll('.issue-reference')
65972                         .data([0])
65973                         .enter()
65974                         .append('div')
65975                         .attr('class', 'issue-reference')
65976                         .text(t('issues.' + referenceID + '.reference'));
65977                 }
65978             };
65979
65980
65981             validation.type = type;
65982
65983             return validation;
65984         }
65985
65986         function validationOutdatedTags(context) {
65987             var type = 'outdated_tags';
65988
65989             // initialize name-suggestion-index matcher
65990             var nsiMatcher = matcher$1();
65991             nsiMatcher.buildMatchIndex(brands$1.brands);
65992             var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
65993
65994             var allWD = {};
65995             var allWP = {};
65996             Object.keys(brands$1.brands).forEach(function(kvnd) {
65997                 var brand = brands$1.brands[kvnd];
65998                 var wd = brand.tags['brand:wikidata'];
65999                 var wp = brand.tags['brand:wikipedia'];
66000                 if (wd) { allWD[wd] = kvnd; }
66001                 if (wp) { allWP[wp] = kvnd; }
66002             });
66003
66004
66005             function oldTagIssues(entity, graph) {
66006                 var oldTags = Object.assign({}, entity.tags);  // shallow copy
66007                 var preset = context.presets().match(entity, graph);
66008                 var explicitPresetUpgrade = preset.replacement;
66009                 var subtype = 'deprecated_tags';
66010
66011                 // upgrade preset..
66012                 if (preset.replacement) {
66013                     var newPreset = context.presets().item(preset.replacement);
66014                     graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);  // true = skip field defaults
66015                     entity = graph.entity(entity.id);
66016                     preset = newPreset;
66017                 }
66018
66019                 // upgrade tags..
66020                 var deprecatedTags = entity.deprecatedTags();
66021                 if (deprecatedTags.length) {
66022                     deprecatedTags.forEach(function(tag) {
66023                         graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
66024                     });
66025                     entity = graph.entity(entity.id);
66026                 }
66027
66028                 // add missing addTags..
66029                 var newTags = Object.assign({}, entity.tags);  // shallow copy
66030                 if (preset.tags !== preset.addTags) {
66031                     Object.keys(preset.addTags).forEach(function(k) {
66032                         if (!newTags[k]) {
66033                             newTags[k] = preset.addTags[k];
66034                             if (!explicitPresetUpgrade) {
66035                                 subtype = 'incomplete_tags';
66036                             }
66037                         }
66038                     });
66039                 }
66040
66041                 // Do `wikidata` or `wikipedia` identify this entity as a brand?  #6416
66042                 // If so, these tags can be swapped to `brand:wikidata`/`brand:wikipedia`
66043                 var isBrand;
66044                 if (newTags.wikidata) {                 // try matching `wikidata`
66045                     isBrand = allWD[newTags.wikidata];
66046                 }
66047                 if (!isBrand && newTags.wikipedia) {    // fallback to `wikipedia`
66048                     isBrand = allWP[newTags.wikipedia];
66049                 }
66050                 if (isBrand && !newTags.office) {       // but avoid doing this for corporate offices
66051                     if (newTags.wikidata) {
66052                         newTags['brand:wikidata'] = newTags.wikidata;
66053                         delete newTags.wikidata;
66054                     }
66055                     if (newTags.wikipedia) {
66056                         newTags['brand:wikipedia'] = newTags.wikipedia;
66057                         delete newTags.wikipedia;
66058                     }
66059                     // I considered setting `name` and other tags here, but they aren't unique per wikidata
66060                     // (Q2759586 -> in USA "Papa John's", in Russia "Папа Джонс")
66061                     // So users will really need to use a preset or assign `name` themselves.
66062                 }
66063
66064                 // try key/value|name match against name-suggestion-index
66065                 if (newTags.name) {
66066                     for (var i = 0; i < nsiKeys.length; i++) {
66067                         var k = nsiKeys[i];
66068                         if (!newTags[k]) continue;
66069
66070                         var match = nsiMatcher.matchKVN(k, newTags[k], newTags.name);
66071                         if (!match) continue;
66072
66073                         // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
66074                         if (match.d) continue;
66075
66076                         var brand = brands$1.brands[match.kvnd];
66077                         if (brand && brand.tags['brand:wikidata']) {
66078                             subtype = 'noncanonical_brand';
66079                             Object.assign(newTags, brand.tags);
66080                             break;
66081                         }
66082                     }
66083                 }
66084
66085
66086                 // determine diff
66087                 var tagDiff = utilTagDiff(oldTags, newTags);
66088                 if (!tagDiff.length) return [];
66089
66090                 var prefix = '';
66091                 if (subtype === 'noncanonical_brand') {
66092                     prefix = 'noncanonical_brand.';
66093                 } else if (subtype === 'incomplete_tags') {
66094                     prefix = 'incomplete.';
66095                 }
66096
66097                 // don't allow autofixing brand tags
66098                 var autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, t('issues.fix.upgrade_tags.annotation')] : null;
66099
66100                 return [new validationIssue({
66101                     type: type,
66102                     subtype: subtype,
66103                     severity: 'warning',
66104                     message: showMessage,
66105                     reference: showReference,
66106                     entityIds: [entity.id],
66107                     hash: JSON.stringify(tagDiff),
66108                     fixes: [
66109                         new validationIssueFix({
66110                             autoArgs: autoArgs,
66111                             title: t('issues.fix.upgrade_tags.title'),
66112                             onClick: function(context) {
66113                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66114                             }
66115                         })
66116                     ]
66117                 })];
66118
66119
66120                 function doUpgrade(graph) {
66121                     var currEntity = graph.hasEntity(entity.id);
66122                     if (!currEntity) return graph;
66123
66124                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66125                     tagDiff.forEach(function(diff) {
66126                         if (diff.type === '-') {
66127                             delete newTags[diff.key];
66128                         } else if (diff.type === '+') {
66129                             newTags[diff.key] = diff.newVal;
66130                         }
66131                     });
66132
66133                     return actionChangeTags(currEntity.id, newTags)(graph);
66134                 }
66135
66136
66137                 function showMessage(context) {
66138                     var currEntity = context.hasEntity(entity.id);
66139                     if (!currEntity) return '';
66140
66141                     return t('issues.outdated_tags.' + prefix + 'message',
66142                         { feature: utilDisplayLabel(currEntity, context) }
66143                     );
66144                 }
66145
66146
66147                 function showReference(selection) {
66148                     var enter = selection.selectAll('.issue-reference')
66149                         .data([0])
66150                         .enter();
66151
66152                     enter
66153                         .append('div')
66154                         .attr('class', 'issue-reference')
66155                         .text(t('issues.outdated_tags.' + prefix + 'reference'));
66156
66157                     enter
66158                         .append('strong')
66159                         .text(t('issues.suggested'));
66160
66161                     enter
66162                         .append('table')
66163                         .attr('class', 'tagDiff-table')
66164                         .selectAll('.tagDiff-row')
66165                         .data(tagDiff)
66166                         .enter()
66167                         .append('tr')
66168                         .attr('class', 'tagDiff-row')
66169                         .append('td')
66170                         .attr('class', function(d) {
66171                             var klass = d.type === '+' ? 'add' : 'remove';
66172                             return 'tagDiff-cell tagDiff-cell-' + klass;
66173                         })
66174                         .text(function(d) { return d.display; });
66175                 }
66176             }
66177
66178
66179             function oldMultipolygonIssues(entity, graph) {
66180
66181                 var multipolygon, outerWay;
66182                 if (entity.type === 'relation') {
66183                     outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
66184                     multipolygon = entity;
66185                 } else if (entity.type === 'way') {
66186                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
66187                     outerWay = entity;
66188                 } else {
66189                     return [];
66190                 }
66191
66192                 if (!multipolygon || !outerWay) return [];
66193
66194                 return [new validationIssue({
66195                     type: type,
66196                     subtype: 'old_multipolygon',
66197                     severity: 'warning',
66198                     message: showMessage,
66199                     reference: showReference,
66200                     entityIds: [outerWay.id, multipolygon.id],
66201                     fixes: [
66202                         new validationIssueFix({
66203                             autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
66204                             title: t('issues.fix.move_tags.title'),
66205                             onClick: function(context) {
66206                                 context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
66207                             }
66208                         })
66209                     ]
66210                 })];
66211
66212
66213                 function doUpgrade(graph) {
66214                     var currMultipolygon = graph.hasEntity(multipolygon.id);
66215                     var currOuterWay = graph.hasEntity(outerWay.id);
66216                     if (!currMultipolygon || !currOuterWay) return graph;
66217
66218                     currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
66219                     graph = graph.replace(currMultipolygon);
66220                     return actionChangeTags(currOuterWay.id, {})(graph);
66221                 }
66222
66223
66224                 function showMessage(context) {
66225                     var currMultipolygon = context.hasEntity(multipolygon.id);
66226                     if (!currMultipolygon) return '';
66227
66228                     return t('issues.old_multipolygon.message',
66229                         { multipolygon: utilDisplayLabel(currMultipolygon, context) }
66230                     );
66231                 }
66232
66233
66234                 function showReference(selection) {
66235                     selection.selectAll('.issue-reference')
66236                         .data([0])
66237                         .enter()
66238                         .append('div')
66239                         .attr('class', 'issue-reference')
66240                         .text(t('issues.old_multipolygon.reference'));
66241                 }
66242             }
66243
66244
66245             var validation = function checkOutdatedTags(entity, graph) {
66246                 var issues = oldMultipolygonIssues(entity, graph);
66247                 if (!issues.length) issues = oldTagIssues(entity, graph);
66248                 return issues;
66249             };
66250
66251
66252             validation.type = type;
66253
66254             return validation;
66255         }
66256
66257         function validationPrivateData() {
66258             var type = 'private_data';
66259
66260             // assume that some buildings are private
66261             var privateBuildingValues = {
66262                 detached: true,
66263                 farm: true,
66264                 house: true,
66265                 houseboat: true,
66266                 residential: true,
66267                 semidetached_house: true,
66268                 static_caravan: true
66269             };
66270
66271             // but they might be public if they have one of these other tags
66272             var publicKeys = {
66273                 amenity: true,
66274                 craft: true,
66275                 historic: true,
66276                 leisure: true,
66277                 office: true,
66278                 shop: true,
66279                 tourism: true
66280             };
66281
66282             // these tags may contain personally identifying info
66283             var personalTags = {
66284                 'contact:email': true,
66285                 'contact:fax': true,
66286                 'contact:phone': true,
66287                 email: true,
66288                 fax: true,
66289                 phone: true
66290             };
66291
66292
66293             var validation = function checkPrivateData(entity) {
66294                 var tags = entity.tags;
66295                 if (!tags.building || !privateBuildingValues[tags.building]) return [];
66296
66297                 var keepTags = {};
66298                 for (var k in tags) {
66299                     if (publicKeys[k]) return [];  // probably a public feature
66300                     if (!personalTags[k]) {
66301                         keepTags[k] = tags[k];
66302                     }
66303                 }
66304
66305                 var tagDiff = utilTagDiff(tags, keepTags);
66306                 if (!tagDiff.length) return [];
66307
66308                 var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
66309
66310                 return [new validationIssue({
66311                     type: type,
66312                     severity: 'warning',
66313                     message: showMessage,
66314                     reference: showReference,
66315                     entityIds: [entity.id],
66316                     fixes: [
66317                         new validationIssueFix({
66318                             icon: 'iD-operation-delete',
66319                             title: t('issues.fix.' + fixID + '.title'),
66320                             onClick: function(context) {
66321                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66322                             }
66323                         })
66324                     ]
66325                 })];
66326
66327
66328                 function doUpgrade(graph) {
66329                     var currEntity = graph.hasEntity(entity.id);
66330                     if (!currEntity) return graph;
66331
66332                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66333                     tagDiff.forEach(function(diff) {
66334                         if (diff.type === '-') {
66335                             delete newTags[diff.key];
66336                         } else if (diff.type === '+') {
66337                             newTags[diff.key] = diff.newVal;
66338                         }
66339                     });
66340
66341                     return actionChangeTags(currEntity.id, newTags)(graph);
66342                 }
66343
66344
66345                 function showMessage(context) {
66346                     var currEntity = context.hasEntity(this.entityIds[0]);
66347                     if (!currEntity) return '';
66348
66349                     return t('issues.private_data.contact.message',
66350                         { feature: utilDisplayLabel(currEntity, context) }
66351                     );
66352                 }
66353
66354
66355                 function showReference(selection) {
66356                     var enter = selection.selectAll('.issue-reference')
66357                         .data([0])
66358                         .enter();
66359
66360                     enter
66361                         .append('div')
66362                         .attr('class', 'issue-reference')
66363                         .text(t('issues.private_data.reference'));
66364
66365                     enter
66366                         .append('strong')
66367                         .text(t('issues.suggested'));
66368
66369                     enter
66370                         .append('table')
66371                         .attr('class', 'tagDiff-table')
66372                         .selectAll('.tagDiff-row')
66373                         .data(tagDiff)
66374                         .enter()
66375                         .append('tr')
66376                         .attr('class', 'tagDiff-row')
66377                         .append('td')
66378                         .attr('class', function(d) {
66379                             var klass = d.type === '+' ? 'add' : 'remove';
66380                             return 'tagDiff-cell tagDiff-cell-' + klass;
66381                         })
66382                         .text(function(d) { return d.display; });
66383                 }
66384             };
66385
66386
66387             validation.type = type;
66388
66389             return validation;
66390         }
66391
66392         function validationTagSuggestsArea(context) {
66393             var type = 'tag_suggests_area';
66394
66395
66396             var validation = function checkTagSuggestsArea(entity, graph) {
66397                 if (entity.type !== 'way' || entity.isClosed()) return [];
66398
66399                 var tagSuggestingArea = entity.tagSuggestingArea();
66400                 if (!tagSuggestingArea) {
66401                     return [];
66402                 }
66403
66404                 if (context.presets().matchTags(tagSuggestingArea, 'line') ===
66405                     context.presets().matchTags(tagSuggestingArea, 'area')) {
66406                     // these tags also allow lines and making this an area wouldn't matter
66407                     return [];
66408                 }
66409
66410                 var tagText = utilTagText({ tags: tagSuggestingArea });
66411                 var fixes = [];
66412
66413                 var connectEndpointsOnClick;
66414
66415                 // must have at least three nodes to close this automatically
66416                 if (entity.nodes.length >= 3) {
66417                     var nodes = graph.childNodes(entity), testNodes;
66418                     var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
66419
66420                     // if the distance is very small, attempt to merge the endpoints
66421                     if (firstToLastDistanceMeters < 0.75) {
66422                         testNodes = nodes.slice();   // shallow copy
66423                         testNodes.pop();
66424                         testNodes.push(testNodes[0]);
66425                         // make sure this will not create a self-intersection
66426                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66427                             connectEndpointsOnClick = function(context) {
66428                                 var way = context.entity(this.issue.entityIds[0]);
66429                                 context.perform(
66430                                     actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
66431                                     t('issues.fix.connect_endpoints.annotation')
66432                                 );
66433                             };
66434                         }
66435                     }
66436
66437                     if (!connectEndpointsOnClick) {
66438                         // if the points were not merged, attempt to close the way
66439                         testNodes = nodes.slice();   // shallow copy
66440                         testNodes.push(testNodes[0]);
66441                         // make sure this will not create a self-intersection
66442                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66443                             connectEndpointsOnClick = function(context) {
66444                                 var wayId = this.issue.entityIds[0];
66445                                 var way = context.entity(wayId);
66446                                 var nodeId = way.nodes[0];
66447                                 var index = way.nodes.length;
66448                                 context.perform(
66449                                     actionAddVertex(wayId, nodeId, index),
66450                                     t('issues.fix.connect_endpoints.annotation')
66451                                 );
66452                             };
66453                         }
66454                     }
66455                 }
66456
66457                 fixes.push(new validationIssueFix({
66458                     title: t('issues.fix.connect_endpoints.title'),
66459                     onClick: connectEndpointsOnClick
66460                 }));
66461
66462                 fixes.push(new validationIssueFix({
66463                     icon: 'iD-operation-delete',
66464                     title: t('issues.fix.remove_tag.title'),
66465                     onClick: function(context) {
66466                         var entityId = this.issue.entityIds[0];
66467                         var entity = context.entity(entityId);
66468                         var tags = Object.assign({}, entity.tags);  // shallow copy
66469                         for (var key in tagSuggestingArea) {
66470                             delete tags[key];
66471                         }
66472                         context.perform(
66473                             actionChangeTags(entityId, tags),
66474                             t('issues.fix.remove_tag.annotation')
66475                         );
66476                     }
66477                 }));
66478
66479                 return [new validationIssue({
66480                     type: type,
66481                     severity: 'warning',
66482                     message: function(context) {
66483                         var entity = context.hasEntity(this.entityIds[0]);
66484                         return entity ? t('issues.tag_suggests_area.message', {
66485                             feature: utilDisplayLabel(entity, context),
66486                             tag: tagText
66487                         }) : '';
66488                     },
66489                     reference: showReference,
66490                     entityIds: [entity.id],
66491                     hash: JSON.stringify(tagSuggestingArea) +
66492                         // avoid stale "connect endpoints" fix
66493                         (typeof connectEndpointsOnClick),
66494                     fixes: fixes
66495                 })];
66496
66497
66498                 function showReference(selection) {
66499                     selection.selectAll('.issue-reference')
66500                         .data([0])
66501                         .enter()
66502                         .append('div')
66503                         .attr('class', 'issue-reference')
66504                         .text(t('issues.tag_suggests_area.reference'));
66505                 }
66506             };
66507
66508             validation.type = type;
66509
66510             return validation;
66511         }
66512
66513         function validationUnsquareWay(context) {
66514             var type = 'unsquare_way';
66515             var DEFAULT_DEG_THRESHOLD = 5;   // see also issues.js
66516
66517             // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
66518             var epsilon = 0.05;
66519             var nodeThreshold = 10;
66520
66521             function isBuilding(entity, graph) {
66522                 if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
66523                 return entity.tags.building && entity.tags.building !== 'no';
66524             }
66525
66526
66527             var validation = function checkUnsquareWay(entity, graph) {
66528
66529                 if (!isBuilding(entity, graph)) return [];
66530
66531                 // don't flag ways marked as physically unsquare
66532                 if (entity.tags.nonsquare === 'yes') return [];
66533
66534                 var isClosed = entity.isClosed();
66535                 if (!isClosed) return [];        // this building has bigger problems
66536
66537                 // don't flag ways with lots of nodes since they are likely detail-mapped
66538                 var nodes = graph.childNodes(entity).slice();    // shallow copy
66539                 if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
66540
66541                 // ignore if not all nodes are fully downloaded
66542                 var osm = services$1.osm;
66543                 if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
66544
66545                 // don't flag connected ways to avoid unresolvable unsquare loops
66546                 var hasConnectedSquarableWays = nodes.some(function(node) {
66547                     return graph.parentWays(node).some(function(way) {
66548                         if (way.id === entity.id) return false;
66549                         if (isBuilding(way, graph)) return true;
66550                         return graph.parentRelations(way).some(function(parentRelation) {
66551                             return parentRelation.isMultipolygon() &&
66552                                 parentRelation.tags.building &&
66553                                 parentRelation.tags.building !== 'no';
66554                         });
66555                     });
66556                 });
66557                 if (hasConnectedSquarableWays) return [];
66558
66559
66560                 // user-configurable square threshold
66561                 var storedDegreeThreshold = context.storage('validate-square-degrees');
66562                 var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
66563
66564                 var points = nodes.map(function(node) { return context.projection(node.loc); });
66565                 if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
66566
66567                 var autoArgs;
66568                 // don't allow autosquaring features linked to wikidata
66569                 if (!entity.tags.wikidata) {
66570                     // use same degree threshold as for detection
66571                     var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
66572                     autoAction.transitionable = false;  // when autofixing, do it instantly
66573                     autoArgs = [autoAction, t('operations.orthogonalize.annotation.area')];
66574                 }
66575
66576                 return [new validationIssue({
66577                     type: type,
66578                     severity: 'warning',
66579                     message: function(context) {
66580                         var entity = context.hasEntity(this.entityIds[0]);
66581                         return entity ? t('issues.unsquare_way.message', { feature: utilDisplayLabel(entity, context) }) : '';
66582                     },
66583                     reference: showReference,
66584                     entityIds: [entity.id],
66585                     hash: JSON.stringify(autoArgs !== undefined) + degreeThreshold,
66586                     fixes: [
66587                         new validationIssueFix({
66588                             icon: 'iD-operation-orthogonalize',
66589                             title: t('issues.fix.square_feature.title'),
66590                             autoArgs: autoArgs,
66591                             onClick: function(context, completionHandler) {
66592                                 var entityId = this.issue.entityIds[0];
66593                                 // use same degree threshold as for detection
66594                                 context.perform(
66595                                     actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold),
66596                                     t('operations.orthogonalize.annotation.area')
66597                                 );
66598                                 // run after the squaring transition (currently 150ms)
66599                                 window.setTimeout(function() { completionHandler(); }, 175);
66600                             }
66601                         }),
66602                         /*
66603                         new validationIssueFix({
66604                             title: t('issues.fix.tag_as_unsquare.title'),
66605                             onClick: function(context) {
66606                                 var entityId = this.issue.entityIds[0];
66607                                 var entity = context.entity(entityId);
66608                                 var tags = Object.assign({}, entity.tags);  // shallow copy
66609                                 tags.nonsquare = 'yes';
66610                                 context.perform(
66611                                     actionChangeTags(entityId, tags),
66612                                     t('issues.fix.tag_as_unsquare.annotation')
66613                                 );
66614                             }
66615                         })
66616                         */
66617                     ]
66618                 })];
66619
66620                 function showReference(selection) {
66621                     selection.selectAll('.issue-reference')
66622                         .data([0])
66623                         .enter()
66624                         .append('div')
66625                         .attr('class', 'issue-reference')
66626                         .text(t('issues.unsquare_way.buildings.reference'));
66627                 }
66628             };
66629
66630             validation.type = type;
66631
66632             return validation;
66633         }
66634
66635
66636
66637         var Validations = /*#__PURE__*/Object.freeze({
66638                 validationAlmostJunction: validationAlmostJunction,
66639                 validationCloseNodes: validationCloseNodes,
66640                 validationCrossingWays: validationCrossingWays,
66641                 validationDisconnectedWay: validationDisconnectedWay,
66642                 validationFixmeTag: validationFixmeTag,
66643                 validationGenericName: validationGenericName,
66644                 validationImpossibleOneway: validationImpossibleOneway,
66645                 validationIncompatibleSource: validationIncompatibleSource,
66646                 validationFormatting: validationFormatting,
66647                 validationMaprules: validationMaprules,
66648                 validationMissingRole: validationMissingRole,
66649                 validationMissingTag: validationMissingTag,
66650                 validationOutdatedTags: validationOutdatedTags,
66651                 validationPrivateData: validationPrivateData,
66652                 validationTagSuggestsArea: validationTagSuggestsArea,
66653                 validationUnsquareWay: validationUnsquareWay
66654         });
66655
66656         function coreValidator(context) {
66657             var dispatch$1 = dispatch('validated', 'focusedIssue');
66658             var validator = utilRebind({}, dispatch$1, 'on');
66659
66660             var _rules = {};
66661             var _disabledRules = {};
66662
66663             var _ignoredIssueIDs = {};       // issue.id -> true
66664             var _issuesByIssueID = {};       // issue.id -> issue
66665             var _issuesByEntityID = {};      // entity.id -> set(issue.id)
66666             var _validatedGraph = null;
66667             var _deferred = new Set();
66668
66669             //
66670             // initialize the validator rulesets
66671             //
66672             validator.init = function() {
66673                 Object.values(Validations).forEach(function(validation) {
66674                     if (typeof validation !== 'function') return;
66675
66676                     var fn = validation(context);
66677                     var key = fn.type;
66678                     _rules[key] = fn;
66679                 });
66680
66681                 var disabledRules = context.storage('validate-disabledRules');
66682                 if (disabledRules) {
66683                     disabledRules.split(',')
66684                         .forEach(function(key) { _disabledRules[key] = true; });
66685                 }
66686             };
66687
66688
66689             //
66690             // clear caches, called whenever iD resets after a save
66691             //
66692             validator.reset = function() {
66693                 Array.from(_deferred).forEach(function(handle) {
66694                     window.cancelIdleCallback(handle);
66695                     _deferred.delete(handle);
66696                 });
66697
66698                 // clear caches
66699                 _ignoredIssueIDs = {};
66700                 _issuesByIssueID = {};
66701                 _issuesByEntityID = {};
66702                 _validatedGraph = null;
66703
66704                 for (var key in _rules) {
66705                     if (typeof _rules[key].reset === 'function') {
66706                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66707                     }
66708                 }
66709             };
66710
66711             validator.resetIgnoredIssues = function() {
66712                 _ignoredIssueIDs = {};
66713                 // reload UI
66714                 dispatch$1.call('validated');
66715             };
66716
66717
66718             // when the user changes the squaring thereshold, rerun this on all buildings
66719             validator.changeSquareThreshold = function() {
66720                 var checkUnsquareWay = _rules.unsquare_way;
66721                 if (typeof checkUnsquareWay !== 'function') return;
66722
66723                 // uncache existing
66724                 Object.values(_issuesByIssueID)
66725                     .filter(function(issue) { return issue.type === 'unsquare_way'; })
66726                     .forEach(function(issue) {
66727                         var entityId = issue.entityIds[0];   // always 1 entity for unsquare way
66728                         if (_issuesByEntityID[entityId]) {
66729                             _issuesByEntityID[entityId].delete(issue.id);
66730                         }
66731                         delete _issuesByIssueID[issue.id];
66732                     });
66733
66734                 var buildings = context.intersects(geoExtent([-180,-90],[180, 90]))  // everywhere
66735                     .filter(function(entity) {
66736                         return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
66737                     });
66738
66739                 // rerun for all buildings
66740                 buildings.forEach(function(entity) {
66741                     var detected = checkUnsquareWay(entity, context);
66742                     if (detected.length !== 1) return;
66743
66744                     var issue = detected[0];
66745                     var ignoreFix = new validationIssueFix({
66746                         title: t('issues.fix.ignore_issue.title'),
66747                         icon: 'iD-icon-close',
66748                         onClick: function() {
66749                             ignoreIssue(this.issue.id);
66750                         }
66751                     });
66752                     ignoreFix.type = 'ignore';
66753                     ignoreFix.issue = issue;
66754                     issue.fixes.push(ignoreFix);
66755
66756                     if (!_issuesByEntityID[entity.id]) {
66757                         _issuesByEntityID[entity.id] = new Set();
66758                     }
66759                     _issuesByEntityID[entity.id].add(issue.id);
66760                     _issuesByIssueID[issue.id] = issue;
66761                 });
66762
66763                 dispatch$1.call('validated');
66764             };
66765
66766
66767             // options = {
66768             //     what: 'all',     // 'all' or 'edited'
66769             //     where: 'all',   // 'all' or 'visible'
66770             //     includeIgnored: false   // true, false, or 'only'
66771             //     includeDisabledRules: false   // true, false, or 'only'
66772             // };
66773             validator.getIssues = function(options) {
66774                 var opts = Object.assign({ what: 'all', where: 'all', includeIgnored: false, includeDisabledRules: false }, options);
66775                 var issues = Object.values(_issuesByIssueID);
66776                 var changes = context.history().difference().changes();
66777                 var view = context.map().extent();
66778
66779                 return issues.filter(function(issue) {
66780                     if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66781                     if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66782
66783                     if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66784                     if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66785
66786                     // Sanity check:  This issue may be for an entity that not longer exists.
66787                     // If we detect this, uncache and return false so it is not included..
66788                     var entityIds = issue.entityIds || [];
66789                     for (var i = 0; i < entityIds.length; i++) {
66790                         var entityId = entityIds[i];
66791                         if (!context.hasEntity(entityId)) {
66792                             delete _issuesByEntityID[entityId];
66793                             delete _issuesByIssueID[issue.id];
66794                             return false;
66795                         }
66796                     }
66797
66798                     if (opts.what === 'edited') {
66799                         var isEdited = entityIds.some(function(entityId) { return changes[entityId]; });
66800                         if (entityIds.length && !isEdited) return false;
66801                     }
66802
66803                     if (opts.where === 'visible') {
66804                         var extent = issue.extent(context.graph());
66805                         if (!view.intersects(extent)) return false;
66806                     }
66807
66808                     return true;
66809                 });
66810             };
66811
66812             validator.focusIssue = function(issue) {
66813                 var extent = issue.extent(context.graph());
66814
66815                 if (extent) {
66816                     var setZoom = Math.max(context.map().zoom(), 19);
66817                     context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
66818
66819                     // select the first entity
66820                     if (issue.entityIds && issue.entityIds.length) {
66821                         window.setTimeout(function() {
66822                             var ids = issue.entityIds;
66823                             context.enter(modeSelect(context, [ids[0]]));
66824                             dispatch$1.call('focusedIssue', this, issue);
66825                         }, 250);  // after ease
66826                     }
66827                 }
66828             };
66829
66830
66831             validator.getIssuesBySeverity = function(options) {
66832                 var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
66833                 groups.error = groups.error || [];
66834                 groups.warning = groups.warning || [];
66835                 return groups;
66836             };
66837
66838
66839             validator.getEntityIssues = function(entityID, options) {
66840                 var issueIDs = _issuesByEntityID[entityID];
66841                 if (!issueIDs) return [];
66842
66843                 var opts = options || {};
66844
66845                 return Array.from(issueIDs)
66846                     .map(function(id) { return _issuesByIssueID[id]; })
66847                     .filter(function(issue) {
66848                         if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66849                         if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66850
66851                         if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66852                         if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66853
66854                         return true;
66855                     });
66856             };
66857
66858
66859             validator.getRuleKeys = function() {
66860                 return Object.keys(_rules)
66861                     .filter(function(key) { return key !== 'maprules'; })
66862                     .sort(function(key1, key2) {
66863                         // alphabetize by localized title
66864                         return t('issues.' + key1 + '.title') < t('issues.' + key2 + '.title') ? -1 : 1;
66865                     });
66866             };
66867
66868
66869             validator.isRuleEnabled = function(key) {
66870                 return !_disabledRules[key];
66871             };
66872
66873
66874             validator.toggleRule = function(key) {
66875                 if (_disabledRules[key]) {
66876                     delete _disabledRules[key];
66877                 } else {
66878                     _disabledRules[key] = true;
66879                 }
66880
66881                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66882                 validator.validate();
66883             };
66884
66885
66886             validator.disableRules = function(keys) {
66887                 _disabledRules = {};
66888                 keys.forEach(function(k) {
66889                     _disabledRules[k] = true;
66890                 });
66891
66892                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66893                 validator.validate();
66894             };
66895
66896
66897             //
66898             // Remove a single entity and all its related issues from the caches
66899             //
66900             function uncacheEntityID(entityID) {
66901                 var issueIDs = _issuesByEntityID[entityID];
66902                 if (!issueIDs) return;
66903
66904                 issueIDs.forEach(function(issueID) {
66905                     var issue = _issuesByIssueID[issueID];
66906                     if (issue) {
66907                         // When multiple entities are involved (e.g. crossing_ways),
66908                         // remove this issue from the other entity caches too..
66909                         var entityIds = issue.entityIds || [];
66910                         entityIds.forEach(function(other) {
66911                             if (other !== entityID) {
66912                                 if (_issuesByEntityID[other]) {
66913                                     _issuesByEntityID[other].delete(issueID);
66914                                 }
66915                             }
66916                         });
66917                     }
66918
66919                     delete _issuesByIssueID[issueID];
66920                 });
66921
66922                 delete _issuesByEntityID[entityID];
66923             }
66924
66925
66926             function ignoreIssue(id) {
66927                 _ignoredIssueIDs[id] = true;
66928             }
66929
66930
66931             //
66932             // Run validation on a single entity for the given graph
66933             //
66934             function validateEntity(entity, graph) {
66935                 var entityIssues = [];
66936                 var ran = {};
66937
66938                 // runs validation and appends resulting issues,
66939                 // returning true if validation passed without issue
66940                 function runValidation(key) {
66941                     if (ran[key]) return true;
66942
66943                     var fn = _rules[key];
66944                     if (typeof fn !== 'function') {
66945                         console.error('no such validation rule = ' + key);  // eslint-disable-line no-console
66946                         ran[key] = true;
66947                         return true;
66948                     }
66949
66950                     var detected = fn(entity, graph);
66951                     detected.forEach(function(issue) {
66952                         var hasIgnoreFix = issue.fixes && issue.fixes.length && issue.fixes[issue.fixes.length - 1].type === 'ignore';
66953                         if (issue.severity === 'warning' && !hasIgnoreFix) {
66954                             var ignoreFix = new validationIssueFix({
66955                                 title: t('issues.fix.ignore_issue.title'),
66956                                 icon: 'iD-icon-close',
66957                                 onClick: function() {
66958                                     ignoreIssue(this.issue.id);
66959                                 }
66960                             });
66961                             ignoreFix.type = 'ignore';
66962                             ignoreFix.issue = issue;
66963                             issue.fixes.push(ignoreFix);
66964                         }
66965                     });
66966                     entityIssues = entityIssues.concat(detected);
66967                     ran[key] = true;
66968                     return !detected.length;
66969                 }
66970
66971                 // run some validations manually to control the order and to skip some
66972
66973                 runValidation('missing_role');
66974
66975                 if (entity.type === 'relation') {
66976                     if (!runValidation('outdated_tags')) {
66977                         // don't flag missing tags if they are on the outer way
66978                         ran.missing_tag = true;
66979                     }
66980                 }
66981
66982                 runValidation('missing_tag');
66983
66984                 runValidation('outdated_tags');
66985
66986                 runValidation('crossing_ways');
66987                 runValidation('almost_junction');
66988
66989                 // only check impossible_oneway if no disconnected_way issues
66990                 if (runValidation('disconnected_way')) {
66991                     runValidation('impossible_oneway');
66992                 } else {
66993                     ran.impossible_oneway = true;
66994                 }
66995
66996                 runValidation('tag_suggests_area');
66997
66998                 // run all rules not yet run
66999                 Object.keys(_rules).forEach(runValidation);
67000
67001                 return entityIssues;
67002             }
67003
67004             function entityIDsToValidate(entityIDs, graph) {
67005                 var processedIDs = new Set();
67006                 return entityIDs.reduce(function(acc, entityID) {
67007                     // keep redundancy check separate from `acc` because an `entityID`
67008                     // could have been added to `acc` as a related entity through an earlier pass
67009                     if (processedIDs.has(entityID)) return acc;
67010                     processedIDs.add(entityID);
67011
67012                     var entity = graph.hasEntity(entityID);
67013                     if (!entity) return acc;
67014
67015                     acc.add(entityID);
67016
67017                     var checkParentRels = [entity];
67018
67019                     if (entity.type === 'node') {   // include parent ways
67020                         graph.parentWays(entity).forEach(function(parentWay) {
67021                             acc.add(parentWay.id);
67022                             checkParentRels.push(parentWay);
67023                         });
67024                     } else if (entity.type === 'relation') {   // include members
67025                         entity.members.forEach(function(member) {
67026                             acc.add(member.id);
67027                         });
67028                     } else if (entity.type === 'way') {   // include connected ways
67029                         entity.nodes.forEach(function(nodeID) {
67030                             graph._parentWays[nodeID].forEach(function(wayID) {
67031                                 acc.add(wayID);
67032                             });
67033                         });
67034                     }
67035
67036                     checkParentRels.forEach(function(entity) {   // include parent relations
67037                         if (entity.type !== 'relation') {        // but not super-relations
67038                             graph.parentRelations(entity).forEach(function(parentRelation) {
67039                                 acc.add(parentRelation.id);
67040                             });
67041                         }
67042                     });
67043
67044                     return acc;
67045
67046                 }, new Set());
67047             }
67048
67049             //
67050             // Run validation for several entities, supplied `entityIDs`
67051             //
67052             function validateEntities(entityIDs) {
67053
67054                 var graph = context.graph();
67055
67056                 // clear caches for existing issues related to these entities
67057                 entityIDs.forEach(uncacheEntityID);
67058
67059                 // detect new issues and update caches
67060                 entityIDs.forEach(function(entityID) {
67061                     var entity = graph.hasEntity(entityID);
67062                     // don't validate deleted entities
67063                     if (!entity) return;
67064
67065                     var issues = validateEntity(entity, graph);
67066                     issues.forEach(function(issue) {
67067                         var entityIds = issue.entityIds || [];
67068                         entityIds.forEach(function(entityId) {
67069                             if (!_issuesByEntityID[entityId]) {
67070                                 _issuesByEntityID[entityId] = new Set();
67071                             }
67072                             _issuesByEntityID[entityId].add(issue.id);
67073                         });
67074                         _issuesByIssueID[issue.id] = issue;
67075                     });
67076                 });
67077
67078                 dispatch$1.call('validated');
67079             }
67080
67081
67082             //
67083             // Validates anything that has changed since the last time it was run.
67084             // Also updates the "validatedGraph" to be the current graph
67085             // and dispatches a `validated` event when finished.
67086             //
67087             validator.validate = function() {
67088                 var currGraph = context.graph();
67089                 _validatedGraph = _validatedGraph || context.history().base();
67090                 if (currGraph === _validatedGraph) {
67091                     dispatch$1.call('validated');
67092                     return;
67093                 }
67094                 var oldGraph = _validatedGraph;
67095                 var difference = coreDifference(oldGraph, currGraph);
67096                 _validatedGraph = currGraph;
67097
67098                 for (var key in _rules) {
67099                     if (typeof _rules[key].reset === 'function') {
67100                         _rules[key].reset();   // 'crossing_ways' is the only one like this
67101                     }
67102                 }
67103
67104                 var createdAndModifiedEntityIDs = difference.extantIDs(true);   // created/modified (true = w/relation members)
67105                 var entityIDsToCheck = entityIDsToValidate(createdAndModifiedEntityIDs, currGraph);
67106
67107                 // "validate" deleted entities in order to update their related entities
67108                 // (e.g. deleting the only highway connected to a road should create a disconnected highway issue)
67109                 var deletedEntityIDs = difference.deleted().map(function(entity) { return entity.id; });
67110                 var entityIDsToCheckForDeleted = entityIDsToValidate(deletedEntityIDs, oldGraph);
67111
67112                 // concat the sets
67113                 entityIDsToCheckForDeleted.forEach(entityIDsToCheck.add, entityIDsToCheck);
67114
67115                 validateEntities(entityIDsToCheck);   // dispatches 'validated'
67116             };
67117
67118
67119             // WHEN TO RUN VALIDATION:
67120             // When graph changes:
67121             context.history()
67122                 .on('restore.validator', validator.validate)   // restore saved history
67123                 .on('undone.validator', validator.validate)    // undo
67124                 .on('redone.validator', validator.validate);   // redo
67125                 // but not on 'change' (e.g. while drawing)
67126
67127             // When user chages editing modes:
67128             context
67129                 .on('exit.validator', validator.validate);
67130
67131             // When merging fetched data:
67132             context.history()
67133                 .on('merge.validator', function(entities) {
67134                     if (!entities) return;
67135                     var handle = window.requestIdleCallback(function() {
67136                         var ids = entities.map(function(entity) { return entity.id; });
67137                         validateEntities(entityIDsToValidate(ids, context.graph()));
67138                     });
67139                     _deferred.add(handle);
67140                 });
67141
67142
67143             return validator;
67144         }
67145
67146         function presetCollection(collection) {
67147             var maxSearchResults = 50;
67148
67149             var presets = {
67150
67151                 collection: collection,
67152
67153
67154                 item: function(id) {
67155                     return this.collection.find(function(d) {
67156                         return d.id === id;
67157                     });
67158                 },
67159
67160                 index: function(id) {
67161                     return this.collection.findIndex(function(d) {
67162                         return d.id === id;
67163                     });
67164                 },
67165
67166                 matchGeometry: function(geometry) {
67167                     return presetCollection(this.collection.filter(function(d) {
67168                         return d.matchGeometry(geometry);
67169                     }));
67170                 },
67171
67172                 matchAnyGeometry: function(geometries) {
67173                     return presetCollection(this.collection.filter(function(d) {
67174                         return geometries.some(function(geometry) {
67175                             return d.matchGeometry(geometry);
67176                         });
67177                     }));
67178                 },
67179
67180                 fallback: function(geometry) {
67181                     var id = geometry;
67182                     if (id === 'vertex') id = 'point';
67183                     return this.item(id);
67184                 },
67185
67186                 search: function(value, geometry, countryCode) {
67187                     if (!value) return this;
67188
67189                     value = value.toLowerCase().trim();
67190
67191                     // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
67192                     function leading(a) {
67193                         var index = a.indexOf(value);
67194                         return index === 0 || a[index - 1] === ' ';
67195                     }
67196
67197                     // match at name beginning only
67198                     function leadingStrict(a) {
67199                         var index = a.indexOf(value);
67200                         return index === 0;
67201                     }
67202
67203                     function sortNames(a, b) {
67204                         var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
67205                         var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
67206
67207                         // priority if search string matches preset name exactly - #4325
67208                         if (value === aCompare) return -1;
67209                         if (value === bCompare) return 1;
67210
67211                         // priority for higher matchScore
67212                         var i = b.originalScore - a.originalScore;
67213                         if (i !== 0) return i;
67214
67215                         // priority if search string appears earlier in preset name
67216                         i = aCompare.indexOf(value) - bCompare.indexOf(value);
67217                         if (i !== 0) return i;
67218
67219                         // priority for shorter preset names
67220                         return aCompare.length - bCompare.length;
67221                     }
67222
67223                     var pool = this.collection;
67224                     if (countryCode) {
67225                         pool = pool.filter(function(a) {
67226                             if (!a.countryCodes) return true;
67227                             return a.countryCodes.indexOf(countryCode) !== -1;
67228                         });
67229                     }
67230                     var searchable = pool.filter(function(a) {
67231                         return a.searchable !== false && a.suggestion !== true;
67232                     });
67233                     var suggestions = pool.filter(function(a) {
67234                         return a.suggestion === true;
67235                     });
67236
67237                     // matches value to preset.name
67238                     var leading_name = searchable
67239                         .filter(function(a) {
67240                             return leading(a.name().toLowerCase());
67241                         }).sort(sortNames);
67242
67243                     // matches value to preset.terms values
67244                     var leading_terms = searchable
67245                         .filter(function(a) {
67246                             return (a.terms() || []).some(leading);
67247                         });
67248
67249                     // matches value to preset.tags values
67250                     var leading_tag_values = searchable
67251                         .filter(function(a) {
67252                             return Object.values(a.tags || {})
67253                                 .filter(function(val) { return val !== '*'; })
67254                                 .some(leading);
67255                         });
67256
67257                     var leading_suggestions = suggestions
67258                         .filter(function(a) {
67259                             return leadingStrict(a.originalName.toLowerCase());
67260                         }).sort(sortNames);
67261
67262                     // finds close matches to value in preset.name
67263                     var similar_name = searchable
67264                         .map(function(a) {
67265                             return { preset: a, dist: utilEditDistance(value, a.name()) };
67266                         }).filter(function(a) {
67267                             return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
67268                         }).sort(function(a, b) {
67269                             return a.dist - b.dist;
67270                         }).map(function(a) {
67271                             return a.preset;
67272                         });
67273
67274                     // finds close matches to value in preset.terms
67275                     var similar_terms = searchable
67276                         .filter(function(a) {
67277                             return (a.terms() || []).some(function(b) {
67278                                 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
67279                             });
67280                         });
67281
67282                     var similar_suggestions = suggestions
67283                         .map(function(a) {
67284                             return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
67285                         }).filter(function(a) {
67286                             return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
67287                         }).sort(function(a, b) {
67288                             return a.dist - b.dist;
67289                         }).map(function(a) {
67290                             return a.preset;
67291                         });
67292
67293                     var results = leading_name.concat(
67294                         leading_suggestions,
67295                         leading_terms,
67296                         leading_tag_values,
67297                         similar_name,
67298                         similar_suggestions,
67299                         similar_terms
67300                     ).slice(0, maxSearchResults - 1);
67301
67302                     if (geometry) {
67303                         if (typeof geometry === 'string') {
67304                             results.push(presets.fallback(geometry));
67305                         } else {
67306                             geometry.forEach(function(geom) {
67307                                 results.push(presets.fallback(geom));
67308                             });
67309                         }
67310                     }
67311
67312                     return presetCollection(utilArrayUniq(results));
67313                 }
67314             };
67315
67316
67317             return presets;
67318         }
67319
67320         function presetCategory(id, category, all) {
67321             category = Object.assign({}, category);   // shallow copy
67322
67323             category.id = id;
67324
67325
67326             category.members = presetCollection(category.members.map(function(id) {
67327                 return all.item(id);
67328             }));
67329
67330
67331             category.geometry = category.members.collection.reduce(function(geometries, preset) {
67332                 for (var index in preset.geometry) {
67333                     var geometry = preset.geometry[index];
67334                     if (geometries.indexOf(geometry) === -1) {
67335                         geometries.push(geometry);
67336                     }
67337                 }
67338                 return geometries;
67339             }, []);
67340
67341
67342             category.matchGeometry = function(geometry) {
67343                 return category.geometry.indexOf(geometry) >= 0;
67344             };
67345
67346
67347             category.matchScore = function() {
67348                 return -1;
67349             };
67350
67351
67352             category.name = function() {
67353                 return t('presets.categories.' + id + '.name', {'default': id});
67354             };
67355
67356
67357             category.terms = function() {
67358                 return [];
67359             };
67360
67361
67362             return category;
67363         }
67364
67365         function presetField(id, field) {
67366             field = Object.assign({}, field);   // shallow copy
67367
67368             field.id = id;
67369
67370             // for use in classes, element ids, css selectors
67371             field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
67372
67373             field.matchGeometry = function(geometry) {
67374                 return !field.geometry || field.geometry === geometry;
67375             };
67376
67377
67378             field.t = function(scope, options) {
67379                 return t('presets.fields.' + id + '.' + scope, options);
67380             };
67381
67382
67383             field.label = function() {
67384                 return field.overrideLabel || field.t('label', {'default': id});
67385             };
67386
67387
67388             var placeholder = field.placeholder;
67389             field.placeholder = function() {
67390                 return field.t('placeholder', {'default': placeholder});
67391             };
67392
67393
67394             return field;
67395         }
67396
67397         function presetPreset(id, preset, fields, visible, rawPresets) {
67398             preset = Object.assign({}, preset);   // shallow copy
67399
67400             preset.id = id;
67401
67402             preset.parentPresetID = function() {
67403                 var endIndex = preset.id.lastIndexOf('/');
67404                 if (endIndex < 0) return null;
67405
67406                 return preset.id.substring(0, endIndex);
67407             };
67408
67409
67410             // For a preset without fields, use the fields of the parent preset.
67411             // Replace {preset} placeholders with the fields of the specified presets.
67412             function resolveFieldInheritance() {
67413
67414                 // Skip `fields` for the keys which define the preset.
67415                 // These are usually `typeCombo` fields like `shop=*`
67416                 function shouldInheritFieldWithID(fieldID) {
67417                     var f = fields[fieldID];
67418                     if (f.key) {
67419                         if (preset.tags[f.key] !== undefined &&
67420                             // inherit anyway if multiple values are allowed or just a checkbox
67421                             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check') {
67422                             return false;
67423                         }
67424                     }
67425                     return true;
67426                 }
67427
67428                 // returns an array of field IDs to inherit from the given presetID, if found
67429                 function inheritedFieldIDs(presetID, prop) {
67430                     if (!presetID) return null;
67431
67432                     var inheritPreset = rawPresets[presetID];
67433                     if (!inheritPreset) return null;
67434
67435                     var inheritFieldIDs = inheritPreset[prop] || [];
67436
67437                     if (prop === 'fields') {
67438                         inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
67439                     }
67440
67441                     return inheritFieldIDs;
67442                 }
67443
67444
67445                 ['fields', 'moreFields'].forEach(function(prop) {
67446                     var fieldIDs = [];
67447                     if (preset[prop] && preset[prop].length) {    // fields were defined
67448                         preset[prop].forEach(function(fieldID) {
67449                             var match = fieldID.match(/\{(.*)\}/);
67450                             if (match !== null) {        // presetID wrapped in braces {}
67451                                 var inheritIDs = inheritedFieldIDs(match[1], prop);
67452                                 if (inheritIDs !== null) {
67453                                     fieldIDs = fieldIDs.concat(inheritIDs);
67454                                 } else {
67455                                     /* eslint-disable no-console */
67456                                     console.log('Cannot resolve presetID ' + match[0] +
67457                                         ' found in ' + preset.id + ' ' + prop);
67458                                     /* eslint-enable no-console */
67459                                 }
67460                             } else {
67461                                 fieldIDs.push(fieldID);  // no braces - just a normal field
67462                             }
67463                         });
67464
67465                     } else {  // no fields defined, so use the parent's if possible
67466                         fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
67467                     }
67468                     // resolve duplicate fields
67469                     fieldIDs = utilArrayUniq(fieldIDs);
67470
67471                     // update this preset with the results
67472                     preset[prop] = fieldIDs;
67473
67474                     // update the raw object to allow for multiple levels of inheritance
67475                     rawPresets[preset.id][prop] = fieldIDs;
67476                 });
67477             }
67478
67479             if (rawPresets) {
67480                 resolveFieldInheritance();
67481             }
67482
67483             preset.fields = (preset.fields || []).map(getFields);
67484             preset.moreFields = (preset.moreFields || []).map(getFields);
67485             preset.geometry = (preset.geometry || []);
67486
67487             visible = visible || false;
67488
67489             function getFields(f) {
67490                 return fields[f];
67491             }
67492
67493
67494             preset.matchGeometry = function(geometry) {
67495                 return preset.geometry.indexOf(geometry) >= 0;
67496             };
67497
67498
67499             preset.originalScore = preset.matchScore || 1;
67500
67501
67502             preset.matchScore = function(entityTags) {
67503                 var tags = preset.tags;
67504                 var score = 0;
67505
67506                 for (var t in tags) {
67507                     if (entityTags[t] === tags[t]) {
67508                         score += preset.originalScore;
67509                     } else if (tags[t] === '*' && t in entityTags) {
67510                         score += preset.originalScore / 2;
67511                     } else {
67512                         return -1;
67513                     }
67514                 }
67515
67516                 return score;
67517             };
67518
67519             var _textCache = {};
67520
67521             preset.t = function(scope, options) {
67522                 var textID = 'presets.presets.' + id + '.' + scope;
67523
67524                 if (_textCache[textID]) return _textCache[textID];
67525
67526                 var text = t(textID, options);
67527                 _textCache[textID] = text;
67528                 return text;
67529             };
67530
67531
67532             preset.originalName = preset.name || '';
67533
67534
67535             preset.name = function() {
67536                 if (preset.suggestion) {
67537                     var path = id.split('/');
67538                     path.pop();  // remove brand name
67539                     // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
67540                     return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
67541                 }
67542                 return preset.t('name', { 'default': preset.originalName });
67543             };
67544
67545
67546             preset.originalTerms = (preset.terms || []).join();
67547
67548
67549             preset.terms = function() {
67550                 return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67551             };
67552
67553
67554             preset.isFallback = function() {
67555                 var tagCount = Object.keys(preset.tags).length;
67556                 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67557             };
67558
67559             preset.visible = function(val) {
67560                 if (!arguments.length) return visible;
67561                 visible = val;
67562                 return visible;
67563             };
67564
67565
67566             var reference = preset.reference || {};
67567             preset.reference = function(geometry) {
67568                 // Lookup documentation on Wikidata...
67569                 var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
67570                 if (qid) {
67571                     return { qid: qid };
67572                 }
67573
67574                 // Lookup documentation on OSM Wikibase...
67575                 var key = reference.key || Object.keys(utilObjectOmit(preset.tags, 'name'))[0];
67576                 var value = reference.value || preset.tags[key];
67577
67578                 if (geometry === 'relation' && key === 'type') {
67579                     if (value in preset.tags) {
67580                         key = value;
67581                         value = preset.tags[key];
67582                     } else {
67583                         return { rtype: value };
67584                     }
67585                 }
67586
67587                 if (value === '*') {
67588                     return { key: key };
67589                 } else {
67590                     return { key: key, value: value };
67591                 }
67592             };
67593
67594
67595             preset.removeTags = preset.removeTags || preset.addTags || preset.tags || {};
67596             preset.unsetTags = function(tags, geometry) {
67597                 tags = utilObjectOmit(tags, Object.keys(preset.removeTags));
67598
67599                 for (var f in preset.fields) {
67600                     var field = preset.fields[f];
67601                     if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67602                         delete tags[field.key];
67603                     }
67604                 }
67605
67606                 delete tags.area;
67607                 return tags;
67608             };
67609
67610
67611             preset.addTags = preset.addTags || preset.tags || {};
67612             preset.setTags = function(tags, geometry, skipFieldDefaults) {
67613                 var addTags = preset.addTags;
67614                 var k;
67615
67616                 tags = Object.assign({}, tags);   // shallow copy
67617
67618                 for (k in addTags) {
67619                     if (addTags[k] === '*') {
67620                         tags[k] = 'yes';
67621                     } else {
67622                         tags[k] = addTags[k];
67623                     }
67624                 }
67625
67626                 // Add area=yes if necessary.
67627                 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67628                 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67629                 // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
67630                 if (!addTags.hasOwnProperty('area')) {
67631                     delete tags.area;
67632                     if (geometry === 'area') {
67633                         var needsAreaTag = true;
67634                         if (preset.geometry.indexOf('line') === -1) {
67635                             for (k in addTags) {
67636                                 if (k in osmAreaKeys) {
67637                                     needsAreaTag = false;
67638                                     break;
67639                                 }
67640                             }
67641                         }
67642                         if (needsAreaTag) {
67643                             tags.area = 'yes';
67644                         }
67645                     }
67646                 }
67647                 if (geometry && !skipFieldDefaults) {
67648                     for (var f in preset.fields) {
67649                         var field = preset.fields[f];
67650                         if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67651                             tags[field.key] = field.default;
67652                         }
67653                     }
67654                 }
67655
67656                 return tags;
67657             };
67658
67659
67660             return preset;
67661         }
67662
67663         function presetIndex(context) {
67664             // a presetCollection with methods for
67665             // loading new data and returning defaults
67666
67667             var dispatch$1 = dispatch('recentsChange', 'favoritePreset');
67668
67669             var all = presetCollection([]);
67670             var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67671             var _fields = {};
67672             var _universal = [];
67673             var _favorites, _recents;
67674
67675             // Index of presets by (geometry, tag key).
67676             var _index = {
67677                 point: {},
67678                 vertex: {},
67679                 line: {},
67680                 area: {},
67681                 relation: {}
67682             };
67683
67684             all.match = function(entity, resolver) {
67685                 return resolver.transient(entity, 'presetMatch', function() {
67686                     var geometry = entity.geometry(resolver);
67687
67688                     // Treat entities on addr:interpolation lines as points, not vertices - #3241
67689                     if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67690                         geometry = 'point';
67691                     }
67692
67693                     return all.matchTags(entity.tags, geometry);
67694                 });
67695             };
67696
67697             all.matchTags = function(tags, geometry) {
67698
67699                 var address;
67700                 var geometryMatches = _index[geometry];
67701                 var best = -1;
67702                 var match;
67703
67704                 for (var k in tags) {
67705                     // If any part of an address is present,
67706                     // allow fallback to "Address" preset - #4353
67707                     if (/^addr:/.test(k) && geometryMatches['addr:*']) {
67708                         address = geometryMatches['addr:*'][0];
67709                     }
67710
67711                     var keyMatches = geometryMatches[k];
67712                     if (!keyMatches) continue;
67713
67714                     for (var i = 0; i < keyMatches.length; i++) {
67715                         var score = keyMatches[i].matchScore(tags);
67716                         if (score > best) {
67717                             best = score;
67718                             match = keyMatches[i];
67719                         }
67720                     }
67721
67722                 }
67723
67724                 if (address && (!match || match.isFallback())) {
67725                     match = address;
67726                 }
67727                 return match || all.fallback(geometry);
67728             };
67729
67730             all.allowsVertex = function(entity, resolver) {
67731                 if (entity.type !== 'node') return false;
67732                 if (Object.keys(entity.tags).length === 0) return true;
67733
67734                 return resolver.transient(entity, 'vertexMatch', function() {
67735                     // address lines allow vertices to act as standalone points
67736                     if (entity.isOnAddressLine(resolver)) return true;
67737
67738                     var geometries = osmNodeGeometriesForTags(entity.tags);
67739                     if (geometries.vertex) return true;
67740                     if (geometries.point) return false;
67741                     // allow vertices for unspecified points
67742                     return true;
67743                 });
67744             };
67745
67746
67747             // Because of the open nature of tagging, iD will never have a complete
67748             // list of tags used in OSM, so we want it to have logic like "assume
67749             // that a closed way with an amenity tag is an area, unless the amenity
67750             // is one of these specific types". This function computes a structure
67751             // that allows testing of such conditions, based on the presets designated
67752             // as as supporting (or not supporting) the area geometry.
67753             //
67754             // The returned object L is a whitelist/blacklist of tags. A closed way
67755             // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67756             // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67757             // and the subkeys form the blacklist.
67758             all.areaKeys = function() {
67759                 var areaKeys = {};
67760                 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
67761
67762                 // ignore name-suggestion-index and deprecated presets
67763                 var presets = all.collection.filter(function(p) {
67764                     return !p.suggestion && !p.replacement;
67765                 });
67766
67767                 // whitelist
67768                 presets.forEach(function(d) {
67769                     for (var key in d.tags) break;
67770                     if (!key) return;
67771                     if (ignore.indexOf(key) !== -1) return;
67772
67773                     if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67774                         areaKeys[key] = areaKeys[key] || {};
67775                     }
67776                 });
67777
67778                 // blacklist
67779                 presets.forEach(function(d) {
67780                     for (var key in d.tags) break;
67781                     if (!key) return;
67782                     if (ignore.indexOf(key) !== -1) return;
67783
67784                     var value = d.tags[key];
67785                     if (key in areaKeys &&                      // probably an area...
67786                         d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
67787                         value !== '*') {
67788                         areaKeys[key][value] = true;
67789                     }
67790                 });
67791
67792                 return areaKeys;
67793             };
67794
67795             all.pointTags = function() {
67796                 return all.collection.reduce(function(pointTags, d) {
67797                     // ignore name-suggestion-index, deprecated, and generic presets
67798                     if (d.suggestion || d.replacement || d.searchable === false) return pointTags;
67799
67800                     // only care about the primary tag
67801                     for (var key in d.tags) break;
67802                     if (!key) return pointTags;
67803
67804                     // if this can be a point
67805                     if (d.geometry.indexOf('point') !== -1) {
67806                         pointTags[key] = pointTags[key] || {};
67807                         pointTags[key][d.tags[key]] = true;
67808                     }
67809                     return pointTags;
67810                 }, {});
67811             };
67812
67813             all.vertexTags = function() {
67814                 return all.collection.reduce(function(vertexTags, d) {
67815                     // ignore name-suggestion-index, deprecated, and generic presets
67816                     if (d.suggestion || d.replacement || d.searchable === false) return vertexTags;
67817
67818                     // only care about the primary tag
67819                     for (var key in d.tags) break;
67820                     if (!key) return vertexTags;
67821
67822                     // if this can be a vertex
67823                     if (d.geometry.indexOf('vertex') !== -1) {
67824                         vertexTags[key] = vertexTags[key] || {};
67825                         vertexTags[key][d.tags[key]] = true;
67826                     }
67827                     return vertexTags;
67828                 }, {});
67829             };
67830
67831             all.build = function(d, visible) {
67832                 if (d.fields) {
67833                     Object.keys(d.fields).forEach(function(id) {
67834                         var f = d.fields[id];
67835                         _fields[id] = presetField(id, f);
67836                         if (f.universal) {
67837                             _universal.push(_fields[id]);
67838                         }
67839                     });
67840                 }
67841
67842                 if (d.presets) {
67843                     var rawPresets = d.presets;
67844                     Object.keys(d.presets).forEach(function(id) {
67845                         var p = d.presets[id];
67846                         var existing = all.index(id);
67847                         if (existing !== -1) {
67848                             all.collection[existing] = presetPreset(id, p, _fields, visible, rawPresets);
67849                         } else {
67850                             all.collection.push(presetPreset(id, p, _fields, visible, rawPresets));
67851                         }
67852                     });
67853                 }
67854
67855                 if (d.categories) {
67856                     Object.keys(d.categories).forEach(function(id) {
67857                         var c = d.categories[id];
67858                         var existing = all.index(id);
67859                         if (existing !== -1) {
67860                             all.collection[existing] = presetCategory(id, c, all);
67861                         } else {
67862                             all.collection.push(presetCategory(id, c, all));
67863                         }
67864                     });
67865                 }
67866
67867                 if (d.defaults) {
67868                     var getItem = (all.item).bind(all);
67869                     _defaults = {
67870                         area: presetCollection(d.defaults.area.map(getItem)),
67871                         line: presetCollection(d.defaults.line.map(getItem)),
67872                         point: presetCollection(d.defaults.point.map(getItem)),
67873                         vertex: presetCollection(d.defaults.vertex.map(getItem)),
67874                         relation: presetCollection(d.defaults.relation.map(getItem))
67875                     };
67876                 }
67877
67878                 for (var i = 0; i < all.collection.length; i++) {
67879                     var preset = all.collection[i];
67880                     var geometry = preset.geometry;
67881
67882                     for (var j = 0; j < geometry.length; j++) {
67883                         var g = _index[geometry[j]];
67884                         for (var k in preset.tags) {
67885                             (g[k] = g[k] || []).push(preset);
67886                         }
67887                     }
67888                 }
67889                 return all;
67890             };
67891
67892             all.init = function() {
67893                 all.collection = [];
67894                 _favorites = null;
67895                 _recents = null;
67896                 _fields = {};
67897                 _universal = [];
67898                 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
67899
67900                 return all.build(data.presets, true);
67901             };
67902
67903
67904             all.reset = function() {
67905                 all.collection = [];
67906                 _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67907                 _fields = {};
67908                 _universal = [];
67909                 _favorites = null;
67910                 _recents = null;
67911
67912                 // Index of presets by (geometry, tag key).
67913                 _index = {
67914                     point: {},
67915                     vertex: {},
67916                     line: {},
67917                     area: {},
67918                     relation: {}
67919                 };
67920
67921                 return all;
67922             };
67923
67924             all.fromExternal = function(external, done) {
67925                 all.reset();
67926                 d3_json(external)
67927                     .then(function(externalPresets) {
67928                         all.build(data.presets, false);    // make default presets hidden to begin
67929                         all.build(externalPresets, true);  // make the external visible
67930                     })
67931                     .catch(function() {
67932                         all.init();
67933                     })
67934                     .finally(function() {
67935                         done(all);
67936                     });
67937             };
67938
67939             all.field = function(id) {
67940                 return _fields[id];
67941             };
67942
67943             all.universal = function() {
67944                 return _universal;
67945             };
67946
67947             all.defaults = function(geometry, n) {
67948                 var rec = [];
67949                 if (!context.inIntro()) {
67950                     rec = all.recent().matchGeometry(geometry).collection.slice(0, 4);
67951                 }
67952                 var def = utilArrayUniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
67953                 return presetCollection(utilArrayUniq(rec.concat(def).concat(all.fallback(geometry))));
67954             };
67955
67956             all.recent = function() {
67957                 return presetCollection(utilArrayUniq(all.getRecents().map(function(d) {
67958                     return d.preset;
67959                 })));
67960             };
67961
67962             function RibbonItem(preset, geometry, source) {
67963                 var item = {};
67964                 item.preset = preset;
67965                 item.geometry = geometry;
67966                 item.source = source;
67967
67968                 item.isFavorite = function() {
67969                     return item.source === 'favorite';
67970                 };
67971                 item.isRecent = function() {
67972                     return item.source === 'recent';
67973                 };
67974                 item.matches = function(preset, geometry) {
67975                     return item.preset.id === preset.id && item.geometry === geometry;
67976                 };
67977                 item.minified = function() {
67978                     return {
67979                         pID: item.preset.id,
67980                         geom: item.geometry
67981                     };
67982                 };
67983                 return item;
67984             }
67985
67986             function ribbonItemForMinified(d, source) {
67987                 if (d && d.pID && d.geom) {
67988                     var preset = all.item(d.pID);
67989                     if (!preset) return null;
67990
67991                     var geom = d.geom;
67992                     // treat point and vertex features as one geometry
67993                     if (geom === 'vertex') geom = 'point';
67994
67995                     // iD's presets could have changed since this was saved,
67996                     // so make sure it's still valid.
67997                     if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) {
67998                         return RibbonItem(preset, geom, source);
67999                     }
68000                 }
68001                 return null;
68002             }
68003
68004             function setFavorites(items) {
68005                 _favorites = items;
68006                 var minifiedItems = items.map(function(d) { return d.minified(); });
68007                 context.storage('preset_favorites', JSON.stringify(minifiedItems));
68008
68009                 // call update
68010                 dispatch$1.call('favoritePreset');
68011             }
68012
68013             all.getFavorites = function() {
68014                 if (!_favorites) {
68015                     // fetch from local storage
68016                     _favorites = (JSON.parse(context.storage('preset_favorites')) || [
68017                             // use the generic presets as the default favorites
68018                             { pID: 'point', geom: 'point'},
68019                             { pID: 'line', geom: 'line'},
68020                             { pID: 'area', geom: 'area'}
68021                         ]).reduce(function(output, d) {
68022                             var item = ribbonItemForMinified(d, 'favorite');
68023                             if (item) output.push(item);
68024                             return output;
68025                         }, []);
68026                 }
68027                 return _favorites;
68028             };
68029
68030             function setRecents(items) {
68031                 _recents = items;
68032                 var minifiedItems = items.map(function(d) { return d.minified(); });
68033                 context.storage('preset_recents', JSON.stringify(minifiedItems));
68034
68035                 dispatch$1.call('recentsChange');
68036             }
68037
68038             all.getRecents = function() {
68039                 if (!_recents) {
68040                     // fetch from local storage
68041                     _recents = (JSON.parse(context.storage('preset_recents')) || [])
68042                         .reduce(function(output, d) {
68043                             var item = ribbonItemForMinified(d, 'recent');
68044                             if (item) output.push(item);
68045                             return output;
68046                         }, []);
68047                 }
68048                 return _recents;
68049             };
68050
68051             all.toggleFavorite = function(preset, geometry) {
68052                 geometry = all.fallback(geometry).id;
68053                 var favs = all.getFavorites();
68054                 var favorite = all.favoriteMatching(preset, geometry);
68055                 if (favorite) {
68056                     favs.splice(favs.indexOf(favorite), 1);
68057                 } else {
68058                     // only allow 10 favorites
68059                     if (favs.length === 10) {
68060                         // remove the last favorite (last in, first out)
68061                         favs.pop();
68062                     }
68063                     // append array
68064                     favs.push(RibbonItem(preset, geometry, 'favorite'));
68065                 }
68066                 setFavorites(favs);
68067             };
68068
68069             all.removeFavorite = function(preset, geometry) {
68070                 geometry = all.fallback(geometry).id;
68071                 var item = all.favoriteMatching(preset, geometry);
68072                 if (item) {
68073                     var items = all.getFavorites();
68074                     items.splice(items.indexOf(item), 1);
68075                     setFavorites(items);
68076                 }
68077             };
68078
68079             all.removeRecent = function(preset, geometry) {
68080                 var item = all.recentMatching(preset, geometry);
68081                 if (item) {
68082                     var items = all.getRecents();
68083                     items.splice(items.indexOf(item), 1);
68084                     setRecents(items);
68085                 }
68086             };
68087
68088             all.favoriteMatching = function(preset, geometry) {
68089                 geometry = all.fallback(geometry).id;
68090                 var favs = all.getFavorites();
68091                 for (var index in favs) {
68092                     if (favs[index].matches(preset, geometry)) {
68093                         return favs[index];
68094                     }
68095                 }
68096                 return null;
68097             };
68098             all.recentMatching = function(preset, geometry) {
68099                 geometry = all.fallback(geometry).id;
68100                 var items = all.getRecents();
68101                 for (var index in items) {
68102                     if (items[index].matches(preset, geometry)) {
68103                         return items[index];
68104                     }
68105                 }
68106                 return null;
68107             };
68108
68109             all.moveItem = function(items, fromIndex, toIndex) {
68110                 if (fromIndex === toIndex ||
68111                     fromIndex < 0 || toIndex < 0 ||
68112                     fromIndex >= items.length || toIndex >= items.length) return null;
68113                 items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
68114                 return items;
68115             };
68116
68117             all.moveFavorite = function(fromIndex, toIndex) {
68118                 var items = all.moveItem(all.getFavorites(), fromIndex, toIndex);
68119                 if (items) setFavorites(items);
68120             };
68121
68122             all.moveRecent = function(item, beforeItem) {
68123                 var recents = all.getRecents();
68124                 var fromIndex = recents.indexOf(item);
68125                 var toIndex = recents.indexOf(beforeItem);
68126                 var items = all.moveItem(recents, fromIndex, toIndex);
68127                 if (items) setRecents(items);
68128             };
68129
68130             all.setMostRecent = function(preset, geometry) {
68131                 if (context.inIntro()) return;
68132                 if (preset.searchable === false) return;
68133
68134                 geometry = all.fallback(geometry).id;
68135
68136                 var items = all.getRecents();
68137                 var item = all.recentMatching(preset, geometry);
68138                 if (item) {
68139                     items.splice(items.indexOf(item), 1);
68140                 } else {
68141                     item = RibbonItem(preset, geometry, 'recent');
68142                 }
68143                 // allow 30 recents
68144                 if (items.length === 30) {
68145                     // remove the last favorite (first in, first out)
68146                     items.pop();
68147                 }
68148                 // prepend array
68149                 items.unshift(item);
68150                 setRecents(items);
68151             };
68152
68153             return utilRebind(all, dispatch$1, 'on');
68154         }
68155
68156         function localeDateString(s) {
68157             if (!s) return null;
68158             var detected = utilDetect();
68159             var options = { day: 'numeric', month: 'short', year: 'numeric' };
68160             var d = new Date(s);
68161             if (isNaN(d.getTime())) return null;
68162             return d.toLocaleDateString(detected.locale, options);
68163         }
68164
68165         function vintageRange(vintage) {
68166             var s;
68167             if (vintage.start || vintage.end) {
68168                 s = (vintage.start || '?');
68169                 if (vintage.start !== vintage.end) {
68170                     s += ' - ' + (vintage.end || '?');
68171                 }
68172             }
68173             return s;
68174         }
68175
68176
68177         function rendererBackgroundSource(data) {
68178             var source = Object.assign({}, data);   // shallow copy
68179             var offset = [0, 0];
68180             var name = source.name;
68181             var description = source.description;
68182             var best = !!source.best;
68183             var template = source.template;
68184
68185             source.tileSize = data.tileSize || 256;
68186             source.zoomExtent = data.zoomExtent || [0, 22];
68187             source.overzoom = data.overzoom !== false;
68188
68189             source.offset = function(_) {
68190                 if (!arguments.length) return offset;
68191                 offset = _;
68192                 return source;
68193             };
68194
68195
68196             source.nudge = function(val, zoomlevel) {
68197                 offset[0] += val[0] / Math.pow(2, zoomlevel);
68198                 offset[1] += val[1] / Math.pow(2, zoomlevel);
68199                 return source;
68200             };
68201
68202
68203             source.name = function() {
68204                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68205                 return t('imagery.' + id_safe + '.name', { default: name });
68206             };
68207
68208
68209             source.description = function() {
68210                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68211                 return t('imagery.' + id_safe + '.description', { default: description });
68212             };
68213
68214
68215             source.best = function() {
68216                 return best;
68217             };
68218
68219
68220             source.area = function() {
68221                 if (!data.polygon) return Number.MAX_VALUE;  // worldwide
68222                 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
68223                 return isNaN(area) ? 0 : area;
68224             };
68225
68226
68227             source.imageryUsed = function() {
68228                 return name || source.id;
68229             };
68230
68231
68232             source.template = function(_) {
68233                 if (!arguments.length) return template;
68234                 if (source.id === 'custom') template = _;
68235                 return source;
68236             };
68237
68238
68239             source.url = function(coord) {
68240                 if (this.type === 'wms') {
68241                     var tileToProjectedCoords = (function(x, y, z) {
68242                         //polyfill for IE11, PhantomJS
68243                         var sinh = Math.sinh || function(x) {
68244                             var y = Math.exp(x);
68245                             return (y - 1 / y) / 2;
68246                         };
68247
68248                         var zoomSize = Math.pow(2, z);
68249                         var lon = x / zoomSize * Math.PI * 2 - Math.PI;
68250                         var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
68251
68252                         switch (this.projection) {
68253                             case 'EPSG:4326':
68254                                 return {
68255                                     x: lon * 180 / Math.PI,
68256                                     y: lat * 180 / Math.PI
68257                                 };
68258                             default: // EPSG:3857 and synonyms
68259                                 var mercCoords = mercatorRaw(lon, lat);
68260                                 return {
68261                                     x: 20037508.34 / Math.PI * mercCoords[0],
68262                                     y: 20037508.34 / Math.PI * mercCoords[1]
68263                                 };
68264                         }
68265                     }).bind(this);
68266
68267                     var tileSize = this.tileSize;
68268                     var projection = this.projection;
68269                     var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
68270                     var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
68271                     return template.replace(/\{(\w+)\}/g, function (token, key) {
68272                       switch (key) {
68273                         case 'width':
68274                         case 'height':
68275                           return tileSize;
68276                         case 'proj':
68277                           return projection;
68278                         case 'wkid':
68279                           return projection.replace(/^EPSG:/, '');
68280                         case 'bbox':
68281                           return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
68282                         case 'w':
68283                           return minXmaxY.x;
68284                         case 's':
68285                           return maxXminY.y;
68286                         case 'n':
68287                           return maxXminY.x;
68288                         case 'e':
68289                           return minXmaxY.y;
68290                         default:
68291                           return token;
68292                       }
68293                     });
68294                 }
68295                 return template
68296                     .replace('{x}', coord[0])
68297                     .replace('{y}', coord[1])
68298                     // TMS-flipped y coordinate
68299                     .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
68300                     .replace(/\{z(oom)?\}/, coord[2])
68301                     .replace(/\{switch:([^}]+)\}/, function(s, r) {
68302                         var subdomains = r.split(',');
68303                         return subdomains[(coord[0] + coord[1]) % subdomains.length];
68304                     })
68305                     .replace('{u}', function() {
68306                         var u = '';
68307                         for (var zoom = coord[2]; zoom > 0; zoom--) {
68308                             var b = 0;
68309                             var mask = 1 << (zoom - 1);
68310                             if ((coord[0] & mask) !== 0) b++;
68311                             if ((coord[1] & mask) !== 0) b += 2;
68312                             u += b.toString();
68313                         }
68314                         return u;
68315                     });
68316             };
68317
68318
68319             source.validZoom = function(z) {
68320                 return source.zoomExtent[0] <= z &&
68321                     (source.overzoom || source.zoomExtent[1] > z);
68322             };
68323
68324
68325             source.isLocatorOverlay = function() {
68326                 return source.id === 'mapbox_locator_overlay';
68327             };
68328
68329
68330             /* hides a source from the list, but leaves it available for use */
68331             source.isHidden = function() {
68332                 return source.id === 'DigitalGlobe-Premium-vintage' ||
68333                     source.id === 'DigitalGlobe-Standard-vintage';
68334             };
68335
68336
68337             source.copyrightNotices = function() {};
68338
68339
68340             source.getMetadata = function(center, tileCoord, callback) {
68341                 var vintage = {
68342                     start: localeDateString(source.startDate),
68343                     end: localeDateString(source.endDate)
68344                 };
68345                 vintage.range = vintageRange(vintage);
68346
68347                 var metadata = { vintage: vintage };
68348                 callback(null, metadata);
68349             };
68350
68351
68352             return source;
68353         }
68354
68355
68356         rendererBackgroundSource.Bing = function(data, dispatch) {
68357             // http://msdn.microsoft.com/en-us/library/ff701716.aspx
68358             // http://msdn.microsoft.com/en-us/library/ff701701.aspx
68359
68360             data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
68361
68362             var bing = rendererBackgroundSource(data);
68363             // var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // P2, JOSM, etc
68364             var key = 'Ak5oTE46TUbjRp08OFVcGpkARErDobfpuyNKa-W2mQ8wbt1K1KL8p1bIRwWwcF-Q';    // iD
68365
68366
68367             var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key;
68368             var cache = {};
68369             var inflight = {};
68370             var providers = [];
68371
68372             d3_json(url)
68373                 .then(function(json) {
68374                     providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
68375                         return {
68376                             attribution: provider.attribution,
68377                             areas: provider.coverageAreas.map(function(area) {
68378                                 return {
68379                                     zoom: [area.zoomMin, area.zoomMax],
68380                                     extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
68381                                 };
68382                             })
68383                         };
68384                     });
68385                     dispatch.call('change');
68386                 })
68387                 .catch(function() {
68388                     /* ignore */
68389                 });
68390
68391
68392             bing.copyrightNotices = function(zoom, extent) {
68393                 zoom = Math.min(zoom, 21);
68394                 return providers.filter(function(provider) {
68395                     return provider.areas.some(function(area) {
68396                         return extent.intersects(area.extent) &&
68397                             area.zoom[0] <= zoom &&
68398                             area.zoom[1] >= zoom;
68399                     });
68400                 }).map(function(provider) {
68401                     return provider.attribution;
68402                 }).join(', ');
68403             };
68404
68405
68406             bing.getMetadata = function(center, tileCoord, callback) {
68407                 var tileID = tileCoord.slice(0, 3).join('/');
68408                 var zoom = Math.min(tileCoord[2], 21);
68409                 var centerPoint = center[1] + ',' + center[0];  // lat,lng
68410                 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
68411                         '?zl=' + zoom + '&key=' + key;
68412
68413                 if (inflight[tileID]) return;
68414
68415                 if (!cache[tileID]) {
68416                     cache[tileID] = {};
68417                 }
68418                 if (cache[tileID] && cache[tileID].metadata) {
68419                     return callback(null, cache[tileID].metadata);
68420                 }
68421
68422                 inflight[tileID] = true;
68423                 d3_json(url)
68424                     .then(function(result) {
68425                         delete inflight[tileID];
68426                         if (!result) {
68427                             throw new Error('Unknown Error');
68428                         }
68429                         var vintage = {
68430                             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
68431                             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
68432                         };
68433                         vintage.range = vintageRange(vintage);
68434
68435                         var metadata = { vintage: vintage };
68436                         cache[tileID].metadata = metadata;
68437                         if (callback) callback(null, metadata);
68438                     })
68439                     .catch(function(err) {
68440                         delete inflight[tileID];
68441                         if (callback) callback(err.message);
68442                     });
68443             };
68444
68445
68446             bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
68447
68448
68449             return bing;
68450         };
68451
68452
68453
68454         rendererBackgroundSource.Esri = function(data) {
68455             // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
68456             if (data.template.match(/blankTile/) === null) {
68457                 data.template = data.template + '?blankTile=false';
68458             }
68459
68460             var esri = rendererBackgroundSource(data);
68461             var cache = {};
68462             var inflight = {};
68463             var _prevCenter;
68464
68465             // use a tilemap service to set maximum zoom for esri tiles dynamically
68466             // https://developers.arcgis.com/documentation/tiled-elevation-service/
68467             esri.fetchTilemap = function(center) {
68468                 // skip if we have already fetched a tilemap within 5km
68469                 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
68470                 _prevCenter = center;
68471
68472                 // tiles are available globally to zoom level 19, afterward they may or may not be present
68473                 var z = 20;
68474
68475                 // first generate a random url using the template
68476                 var dummyUrl = esri.url([1,2,3]);
68477
68478                 // calculate url z/y/x from the lat/long of the center of the map
68479                 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
68480                 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)));
68481
68482                 // fetch an 8x8 grid to leverage cache
68483                 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
68484
68485                 // make the request and introspect the response from the tilemap server
68486                 d3_json(tilemapUrl)
68487                     .then(function(tilemap) {
68488                         if (!tilemap) {
68489                             throw new Error('Unknown Error');
68490                         }
68491                         var hasTiles = true;
68492                         for (var i = 0; i < tilemap.data.length; i++) {
68493                             // 0 means an individual tile in the grid doesn't exist
68494                             if (!tilemap.data[i]) {
68495                                 hasTiles = false;
68496                                 break;
68497                             }
68498                         }
68499
68500                         // if any tiles are missing at level 20 we restrict maxZoom to 19
68501                         esri.zoomExtent[1] = (hasTiles ? 22 : 19);
68502                     })
68503                     .catch(function() {
68504                         /* ignore */
68505                     });
68506             };
68507
68508
68509             esri.getMetadata = function(center, tileCoord, callback) {
68510                 var tileID = tileCoord.slice(0, 3).join('/');
68511                 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
68512                 var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
68513                 var unknown = t('info_panels.background.unknown');
68514                 var metadataLayer;
68515                 var vintage = {};
68516                 var metadata = {};
68517
68518                 if (inflight[tileID]) return;
68519
68520                 switch (true) {
68521                     case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
68522                         metadataLayer = 4;
68523                         break;
68524                     case zoom >= 19:
68525                         metadataLayer = 3;
68526                         break;
68527                     case zoom >= 17:
68528                         metadataLayer = 2;
68529                         break;
68530                     case zoom >= 13:
68531                         metadataLayer = 0;
68532                         break;
68533                     default:
68534                         metadataLayer = 99;
68535                 }
68536
68537                 var url;
68538                 // build up query using the layer appropriate to the current zoom
68539                 if (esri.id === 'EsriWorldImagery') {
68540                     url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
68541                 } else if (esri.id === 'EsriWorldImageryClarity') {
68542                     url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
68543                 }
68544
68545                 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
68546
68547                 if (!cache[tileID]) {
68548                     cache[tileID] = {};
68549                 }
68550                 if (cache[tileID] && cache[tileID].metadata) {
68551                     return callback(null, cache[tileID].metadata);
68552                 }
68553
68554                 // accurate metadata is only available >= 13
68555                 if (metadataLayer === 99) {
68556                     vintage = {
68557                         start: null,
68558                         end: null,
68559                         range: null
68560                     };
68561                     metadata = {
68562                         vintage: null,
68563                         source: unknown,
68564                         description: unknown,
68565                         resolution: unknown,
68566                         accuracy: unknown
68567                     };
68568
68569                     callback(null, metadata);
68570
68571                 } else {
68572                     inflight[tileID] = true;
68573                     d3_json(url)
68574                         .then(function(result) {
68575                             delete inflight[tileID];
68576                             if (!result) {
68577                                 throw new Error('Unknown Error');
68578                             } else if (result.features && result.features.length < 1) {
68579                                 throw new Error('No Results');
68580                             } else if (result.error && result.error.message) {
68581                                 throw new Error(result.error.message);
68582                             }
68583
68584                             // pass through the discrete capture date from metadata
68585                             var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
68586                             vintage = {
68587                                 start: captureDate,
68588                                 end: captureDate,
68589                                 range: captureDate
68590                             };
68591                             metadata = {
68592                                 vintage: vintage,
68593                                 source: clean(result.features[0].attributes.NICE_NAME),
68594                                 description: clean(result.features[0].attributes.NICE_DESC),
68595                                 resolution: clean(result.features[0].attributes.SRC_RES),
68596                                 accuracy: clean(result.features[0].attributes.SRC_ACC)
68597                             };
68598
68599                             // append units - meters
68600                             if (isFinite(metadata.resolution)) {
68601                                 metadata.resolution += ' m';
68602                             }
68603                             if (isFinite(metadata.accuracy)) {
68604                                 metadata.accuracy += ' m';
68605                             }
68606
68607                             cache[tileID].metadata = metadata;
68608                             if (callback) callback(null, metadata);
68609                         })
68610                         .catch(function(err) {
68611                             delete inflight[tileID];
68612                             if (callback) callback(err.message);
68613                         });
68614                 }
68615
68616
68617                 function clean(val) {
68618                     return String(val).trim() || unknown;
68619                 }
68620             };
68621
68622             return esri;
68623         };
68624
68625
68626         rendererBackgroundSource.None = function() {
68627             var source = rendererBackgroundSource({ id: 'none', template: '' });
68628
68629
68630             source.name = function() {
68631                 return t('background.none');
68632             };
68633
68634
68635             source.imageryUsed = function() {
68636                 return null;
68637             };
68638
68639
68640             source.area = function() {
68641                 return -1;  // sources in background pane are sorted by area
68642             };
68643
68644
68645             return source;
68646         };
68647
68648
68649         rendererBackgroundSource.Custom = function(template) {
68650             var source = rendererBackgroundSource({ id: 'custom', template: template });
68651
68652
68653             source.name = function() {
68654                 return t('background.custom');
68655             };
68656
68657
68658             source.imageryUsed = function() {
68659                 return 'Custom (' + source.template() + ')';
68660             };
68661
68662
68663             source.area = function() {
68664                 return -2;  // sources in background pane are sorted by area
68665             };
68666
68667
68668             return source;
68669         };
68670
68671         function rendererTileLayer(context) {
68672             var transformProp = utilPrefixCSSProperty('Transform');
68673             var tiler = utilTiler();
68674
68675             var _tileSize = 256;
68676             var _projection;
68677             var _cache = {};
68678             var _tileOrigin;
68679             var _zoom;
68680             var _source;
68681
68682
68683             function tileSizeAtZoom(d, z) {
68684                 var EPSILON = 0.002;    // close seams
68685                 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
68686             }
68687
68688
68689             function atZoom(t, distance) {
68690                 var power = Math.pow(2, distance);
68691                 return [
68692                     Math.floor(t[0] * power),
68693                     Math.floor(t[1] * power),
68694                     t[2] + distance
68695                 ];
68696             }
68697
68698
68699             function lookUp(d) {
68700                 for (var up = -1; up > -d[2]; up--) {
68701                     var tile = atZoom(d, up);
68702                     if (_cache[_source.url(tile)] !== false) {
68703                         return tile;
68704                     }
68705                 }
68706             }
68707
68708
68709             function uniqueBy(a, n) {
68710                 var o = [];
68711                 var seen = {};
68712                 for (var i = 0; i < a.length; i++) {
68713                     if (seen[a[i][n]] === undefined) {
68714                         o.push(a[i]);
68715                         seen[a[i][n]] = true;
68716                     }
68717                 }
68718                 return o;
68719             }
68720
68721
68722             function addSource(d) {
68723                 d.push(_source.url(d));
68724                 return d;
68725             }
68726
68727
68728             // Update tiles based on current state of `projection`.
68729             function background(selection) {
68730                 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
68731
68732                 var pixelOffset;
68733                 if (_source) {
68734                     pixelOffset = [
68735                         _source.offset()[0] * Math.pow(2, _zoom),
68736                         _source.offset()[1] * Math.pow(2, _zoom)
68737                     ];
68738                 } else {
68739                     pixelOffset = [0, 0];
68740                 }
68741
68742                 var translate = [
68743                     _projection.translate()[0] + pixelOffset[0],
68744                     _projection.translate()[1] + pixelOffset[1]
68745                 ];
68746
68747                 tiler
68748                     .scale(_projection.scale() * 2 * Math.PI)
68749                     .translate(translate);
68750
68751                 _tileOrigin = [
68752                     _projection.scale() * Math.PI - translate[0],
68753                     _projection.scale() * Math.PI - translate[1]
68754                 ];
68755
68756                 render(selection);
68757             }
68758
68759
68760             // Derive the tiles onscreen, remove those offscreen and position them.
68761             // Important that this part not depend on `_projection` because it's
68762             // rentered when tiles load/error (see #644).
68763             function render(selection) {
68764                 if (!_source) return;
68765                 var requests = [];
68766                 var showDebug = context.getDebug('tile') && !_source.overlay;
68767
68768                 if (_source.validZoom(_zoom)) {
68769                     tiler.skipNullIsland(!!_source.overlay);
68770
68771                     tiler().forEach(function(d) {
68772                         addSource(d);
68773                         if (d[3] === '') return;
68774                         if (typeof d[3] !== 'string') return; // Workaround for #2295
68775                         requests.push(d);
68776                         if (_cache[d[3]] === false && lookUp(d)) {
68777                             requests.push(addSource(lookUp(d)));
68778                         }
68779                     });
68780
68781                     requests = uniqueBy(requests, 3).filter(function(r) {
68782                         // don't re-request tiles which have failed in the past
68783                         return _cache[r[3]] !== false;
68784                     });
68785                 }
68786
68787                 function load(d) {
68788                     _cache[d[3]] = true;
68789                     d3_select(this)
68790                         .on('error', null)
68791                         .on('load', null)
68792                         .classed('tile-loaded', true);
68793                     render(selection);
68794                 }
68795
68796                 function error(d) {
68797                     _cache[d[3]] = false;
68798                     d3_select(this)
68799                         .on('error', null)
68800                         .on('load', null)
68801                         .remove();
68802                     render(selection);
68803                 }
68804
68805                 function imageTransform(d) {
68806                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68807                     var scale = tileSizeAtZoom(d, _zoom);
68808                     return 'translate(' +
68809                         ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
68810                         ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
68811                         'scale(' + scale + ',' + scale + ')';
68812                 }
68813
68814                 function tileCenter(d) {
68815                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68816                     return [
68817                         ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
68818                         ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
68819                     ];
68820                 }
68821
68822                 function debugTransform(d) {
68823                     var coord = tileCenter(d);
68824                     return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
68825                 }
68826
68827
68828                 // Pick a representative tile near the center of the viewport
68829                 // (This is useful for sampling the imagery vintage)
68830                 var dims = tiler.size();
68831                 var mapCenter = [dims[0] / 2, dims[1] / 2];
68832                 var minDist = Math.max(dims[0], dims[1]);
68833                 var nearCenter;
68834
68835                 requests.forEach(function(d) {
68836                     var c = tileCenter(d);
68837                     var dist = geoVecLength(c, mapCenter);
68838                     if (dist < minDist) {
68839                         minDist = dist;
68840                         nearCenter = d;
68841                     }
68842                 });
68843
68844
68845                 var image = selection.selectAll('img')
68846                     .data(requests, function(d) { return d[3]; });
68847
68848                 image.exit()
68849                     .style(transformProp, imageTransform)
68850                     .classed('tile-removing', true)
68851                     .classed('tile-center', false)
68852                     .each(function() {
68853                         var tile = d3_select(this);
68854                         window.setTimeout(function() {
68855                             if (tile.classed('tile-removing')) {
68856                                 tile.remove();
68857                             }
68858                         }, 300);
68859                     });
68860
68861                 image.enter()
68862                   .append('img')
68863                     .attr('class', 'tile')
68864                     .attr('src', function(d) { return d[3]; })
68865                     .on('error', error)
68866                     .on('load', load)
68867                   .merge(image)
68868                     .style(transformProp, imageTransform)
68869                     .classed('tile-debug', showDebug)
68870                     .classed('tile-removing', false)
68871                     .classed('tile-center', function(d) { return d === nearCenter; });
68872
68873
68874
68875                 var debug = selection.selectAll('.tile-label-debug')
68876                     .data(showDebug ? requests : [], function(d) { return d[3]; });
68877
68878                 debug.exit()
68879                     .remove();
68880
68881                 if (showDebug) {
68882                     var debugEnter = debug.enter()
68883                         .append('div')
68884                         .attr('class', 'tile-label-debug');
68885
68886                     debugEnter
68887                         .append('div')
68888                         .attr('class', 'tile-label-debug-coord');
68889
68890                     debugEnter
68891                         .append('div')
68892                         .attr('class', 'tile-label-debug-vintage');
68893
68894                     debug = debug.merge(debugEnter);
68895
68896                     debug
68897                         .style(transformProp, debugTransform);
68898
68899                     debug
68900                         .selectAll('.tile-label-debug-coord')
68901                         .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
68902
68903                     debug
68904                         .selectAll('.tile-label-debug-vintage')
68905                         .each(function(d) {
68906                             var span = d3_select(this);
68907                             var center = context.projection.invert(tileCenter(d));
68908                             _source.getMetadata(center, d, function(err, result) {
68909                                 span.text((result && result.vintage && result.vintage.range) ||
68910                                     t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
68911                                 );
68912                             });
68913                         });
68914                 }
68915
68916             }
68917
68918
68919             background.projection = function(val) {
68920                 if (!arguments.length) return _projection;
68921                 _projection = val;
68922                 return background;
68923             };
68924
68925
68926             background.dimensions = function(val) {
68927                 if (!arguments.length) return tiler.size();
68928                 tiler.size(val);
68929                 return background;
68930             };
68931
68932
68933             background.source = function(val) {
68934                 if (!arguments.length) return _source;
68935                 _source = val;
68936                 _tileSize = _source.tileSize;
68937                 _cache = {};
68938                 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
68939                 return background;
68940             };
68941
68942
68943             return background;
68944         }
68945
68946         function rendererBackground(context) {
68947             var dispatch$1 = dispatch('change');
68948             var detected = utilDetect();
68949             var baseLayer = rendererTileLayer(context).projection(context.projection);
68950             var _isValid = true;
68951             var _overlayLayers = [];
68952             var _backgroundSources = [];
68953             var _brightness = 1;
68954             var _contrast = 1;
68955             var _saturation = 1;
68956             var _sharpness = 1;
68957
68958
68959             function background(selection) {
68960                 // If we are displaying an Esri basemap at high zoom,
68961                 // check its tilemap to see how high the zoom can go
68962                 if (context.map().zoom() > 18) {
68963                     var basemap = baseLayer.source();
68964                     if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
68965                         var center = context.map().center();
68966                         basemap.fetchTilemap(center);
68967                     }
68968                 }
68969
68970                 // Is the imagery valid here? - #4827
68971                 var sources = background.sources(context.map().extent());
68972                 var wasValid = _isValid;
68973                 _isValid = !!sources
68974                     .filter(function(d) { return d === baseLayer.source(); }).length;
68975
68976                 if (wasValid !== _isValid) {      // change in valid status
68977                     background.updateImagery();
68978                 }
68979
68980
68981                 var baseFilter = '';
68982                 if (detected.cssfilters) {
68983                     if (_brightness !== 1) {
68984                         baseFilter += 'brightness(' + _brightness + ')';
68985                     }
68986                     if (_contrast !== 1) {
68987                         baseFilter += 'contrast(' + _contrast + ')';
68988                     }
68989                     if (_saturation !== 1) {
68990                         baseFilter += 'saturate(' + _saturation + ')';
68991                     }
68992                     if (_sharpness < 1) {  // gaussian blur
68993                         var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
68994                         baseFilter += 'blur(' + blur + 'px)';
68995                     }
68996                 }
68997
68998                 var base = selection.selectAll('.layer-background')
68999                     .data([0]);
69000
69001                 base = base.enter()
69002                     .insert('div', '.layer-data')
69003                     .attr('class', 'layer layer-background')
69004                     .merge(base);
69005
69006                 if (detected.cssfilters) {
69007                     base.style('filter', baseFilter || null);
69008                 } else {
69009                     base.style('opacity', _brightness);
69010                 }
69011
69012
69013                 var imagery = base.selectAll('.layer-imagery')
69014                     .data([0]);
69015
69016                 imagery.enter()
69017                     .append('div')
69018                     .attr('class', 'layer layer-imagery')
69019                     .merge(imagery)
69020                     .call(baseLayer);
69021
69022
69023                 var maskFilter = '';
69024                 var mixBlendMode = '';
69025                 if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
69026                     mixBlendMode = 'overlay';
69027                     maskFilter = 'saturate(0) blur(3px) invert(1)';
69028
69029                     var contrast = _sharpness - 1;
69030                     maskFilter += ' contrast(' + contrast + ')';
69031
69032                     var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
69033                     maskFilter += ' brightness(' + brightness + ')';
69034                 }
69035
69036                 var mask = base.selectAll('.layer-unsharp-mask')
69037                     .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
69038
69039                 mask.exit()
69040                     .remove();
69041
69042                 mask.enter()
69043                     .append('div')
69044                     .attr('class', 'layer layer-mask layer-unsharp-mask')
69045                     .merge(mask)
69046                     .call(baseLayer)
69047                     .style('filter', maskFilter || null)
69048                     .style('mix-blend-mode', mixBlendMode || null);
69049
69050
69051                 var overlays = selection.selectAll('.layer-overlay')
69052                     .data(_overlayLayers, function(d) { return d.source().name(); });
69053
69054                 overlays.exit()
69055                     .remove();
69056
69057                 overlays.enter()
69058                     .insert('div', '.layer-data')
69059                     .attr('class', 'layer layer-overlay')
69060                     .merge(overlays)
69061                     .each(function(layer) { d3_select(this).call(layer); });
69062             }
69063
69064
69065             background.updateImagery = function() {
69066                 var b = baseLayer.source();
69067                 if (context.inIntro() || !b) return;
69068
69069                 var o = _overlayLayers
69070                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69071                     .map(function (d) { return d.source().id; })
69072                     .join(',');
69073
69074                 var meters = geoOffsetToMeters(b.offset());
69075                 var epsilon = 0.01;
69076                 var x = +meters[0].toFixed(2);
69077                 var y = +meters[1].toFixed(2);
69078                 var q = utilStringQs(window.location.hash.substring(1));
69079
69080                 var id = b.id;
69081                 if (id === 'custom') {
69082                     id = 'custom:' + b.template();
69083                 }
69084
69085                 if (id) {
69086                     q.background = id;
69087                 } else {
69088                     delete q.background;
69089                 }
69090
69091                 if (o) {
69092                     q.overlays = o;
69093                 } else {
69094                     delete q.overlays;
69095                 }
69096
69097                 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
69098                     q.offset = x + ',' + y;
69099                 } else {
69100                     delete q.offset;
69101                 }
69102
69103                 if (!window.mocha) {
69104                     window.location.replace('#' + utilQsString(q, true));
69105                 }
69106
69107                 var imageryUsed = [];
69108                 var photoOverlaysUsed = [];
69109
69110                 var current = b.imageryUsed();
69111                 if (current && _isValid) {
69112                     imageryUsed.push(current);
69113                 }
69114
69115                 _overlayLayers
69116                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69117                     .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
69118
69119                 var data = context.layers().layer('data');
69120                 if (data && data.enabled() && data.hasData()) {
69121                     imageryUsed.push(data.getSrc());
69122                 }
69123
69124                 var photoOverlayLayers = {
69125                     streetside: 'Bing Streetside',
69126                     mapillary: 'Mapillary Images',
69127                     'mapillary-signs': 'Mapillary Signs',
69128                     openstreetcam: 'OpenStreetCam Images'
69129                 };
69130
69131                 for (var layerID in photoOverlayLayers) {
69132                     var layer = context.layers().layer(layerID);
69133                     if (layer && layer.enabled()) {
69134                         photoOverlaysUsed.push(layerID);
69135                         imageryUsed.push(photoOverlayLayers[layerID]);
69136                     }
69137                 }
69138
69139                 context.history().photoOverlaysUsed(photoOverlaysUsed);
69140                 context.history().imageryUsed(imageryUsed);
69141             };
69142
69143
69144             background.sources = function(extent) {
69145                 if (!data.imagery || !data.imagery.query) return [];   // called before init()?
69146
69147                 var matchIDs = {};
69148                 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
69149                 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
69150
69151                 return _backgroundSources.filter(function(source) {
69152                     return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
69153                 });
69154             };
69155
69156
69157             background.dimensions = function(d) {
69158                 if (!d) return;
69159                 baseLayer.dimensions(d);
69160
69161                 _overlayLayers.forEach(function(layer) {
69162                     layer.dimensions(d);
69163                 });
69164             };
69165
69166
69167             background.baseLayerSource = function(d) {
69168                 if (!arguments.length) return baseLayer.source();
69169
69170                 // test source against OSM imagery blacklists..
69171                 var osm = context.connection();
69172                 if (!osm) return background;
69173
69174                 var blacklists = context.connection().imageryBlacklists();
69175                 var template = d.template();
69176                 var fail = false;
69177                 var tested = 0;
69178                 var regex;
69179
69180                 for (var i = 0; i < blacklists.length; i++) {
69181                     try {
69182                         regex = new RegExp(blacklists[i]);
69183                         fail = regex.test(template);
69184                         tested++;
69185                         if (fail) break;
69186                     } catch (e) {
69187                         /* noop */
69188                     }
69189                 }
69190
69191                 // ensure at least one test was run.
69192                 if (!tested) {
69193                     regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
69194                     fail = regex.test(template);
69195                 }
69196
69197                 baseLayer.source(!fail ? d : background.findSource('none'));
69198                 dispatch$1.call('change');
69199                 background.updateImagery();
69200                 return background;
69201             };
69202
69203
69204             background.findSource = function(id) {
69205                 return _backgroundSources.find(function(d) {
69206                     return d.id && d.id === id;
69207                 });
69208             };
69209
69210
69211             background.bing = function() {
69212                 background.baseLayerSource(background.findSource('Bing'));
69213             };
69214
69215
69216             background.showsLayer = function(d) {
69217                 return d.id === baseLayer.source().id ||
69218                     _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
69219             };
69220
69221
69222             background.overlayLayerSources = function() {
69223                 return _overlayLayers.map(function (l) { return l.source(); });
69224             };
69225
69226
69227             background.toggleOverlayLayer = function(d) {
69228                 var layer;
69229                 for (var i = 0; i < _overlayLayers.length; i++) {
69230                     layer = _overlayLayers[i];
69231                     if (layer.source() === d) {
69232                         _overlayLayers.splice(i, 1);
69233                         dispatch$1.call('change');
69234                         background.updateImagery();
69235                         return;
69236                     }
69237                 }
69238
69239                 layer = rendererTileLayer(context)
69240                     .source(d)
69241                     .projection(context.projection)
69242                     .dimensions(baseLayer.dimensions()
69243                 );
69244
69245                 _overlayLayers.push(layer);
69246                 dispatch$1.call('change');
69247                 background.updateImagery();
69248             };
69249
69250
69251             background.nudge = function(d, zoom) {
69252                 baseLayer.source().nudge(d, zoom);
69253                 dispatch$1.call('change');
69254                 background.updateImagery();
69255                 return background;
69256             };
69257
69258
69259             background.offset = function(d) {
69260                 if (!arguments.length) return baseLayer.source().offset();
69261                 baseLayer.source().offset(d);
69262                 dispatch$1.call('change');
69263                 background.updateImagery();
69264                 return background;
69265             };
69266
69267
69268             background.brightness = function(d) {
69269                 if (!arguments.length) return _brightness;
69270                 _brightness = d;
69271                 if (context.mode()) dispatch$1.call('change');
69272                 return background;
69273             };
69274
69275
69276             background.contrast = function(d) {
69277                 if (!arguments.length) return _contrast;
69278                 _contrast = d;
69279                 if (context.mode()) dispatch$1.call('change');
69280                 return background;
69281             };
69282
69283
69284             background.saturation = function(d) {
69285                 if (!arguments.length) return _saturation;
69286                 _saturation = d;
69287                 if (context.mode()) dispatch$1.call('change');
69288                 return background;
69289             };
69290
69291
69292             background.sharpness = function(d) {
69293                 if (!arguments.length) return _sharpness;
69294                 _sharpness = d;
69295                 if (context.mode()) dispatch$1.call('change');
69296                 return background;
69297             };
69298
69299
69300             background.init = function() {
69301                 function parseMap(qmap) {
69302                     if (!qmap) return false;
69303                     var args = qmap.split('/').map(Number);
69304                     if (args.length < 3 || args.some(isNaN)) return false;
69305                     return geoExtent([args[2], args[1]]);
69306                 }
69307
69308                 var q = utilStringQs(window.location.hash.substring(1));
69309                 var requested = q.background || q.layer;
69310                 var extent = parseMap(q.map);
69311                 var first;
69312                 var best;
69313
69314
69315                 data.imagery = data.imagery || [];
69316                 data.imagery.features = {};
69317
69318                 // build efficient index and querying for data.imagery
69319                 var features = data.imagery.map(function(source) {
69320                     if (!source.polygon) return null;
69321
69322                     // Add an extra array nest to each element in `source.polygon`
69323                     // so the rings are not treated as a bunch of holes:
69324                     // what we have: [ [[outer],[hole],[hole]] ]
69325                     // what we want: [ [[outer]],[[outer]],[[outer]] ]
69326                     var rings = source.polygon.map(function(ring) { return [ring]; });
69327
69328                     var feature = {
69329                         type: 'Feature',
69330                         properties: { id: source.id },
69331                         geometry: { type: 'MultiPolygon', coordinates: rings }
69332                     };
69333
69334                     data.imagery.features[source.id] = feature;
69335                     return feature;
69336
69337                 }).filter(Boolean);
69338
69339                 data.imagery.query = whichPolygon_1({
69340                     type: 'FeatureCollection',
69341                     features: features
69342                 });
69343
69344
69345                 // Add all the available imagery sources
69346                 _backgroundSources = data.imagery.map(function(source) {
69347                     if (source.type === 'bing') {
69348                         return rendererBackgroundSource.Bing(source, dispatch$1);
69349                     } else if (/^EsriWorldImagery/.test(source.id)) {
69350                         return rendererBackgroundSource.Esri(source);
69351                     } else {
69352                         return rendererBackgroundSource(source);
69353                     }
69354                 });
69355
69356                 first = _backgroundSources.length && _backgroundSources[0];
69357
69358                 // Add 'None'
69359                 _backgroundSources.unshift(rendererBackgroundSource.None());
69360
69361                 // Add 'Custom'
69362                 var template = context.storage('background-custom-template') || '';
69363                 var custom = rendererBackgroundSource.Custom(template);
69364                 _backgroundSources.unshift(custom);
69365
69366
69367                 // Decide which background layer to display
69368                 if (!requested && extent) {
69369                     best = this.sources(extent).find(function(s) { return s.best(); });
69370                 }
69371                 if (requested && requested.indexOf('custom:') === 0) {
69372                     template = requested.replace(/^custom:/, '');
69373                     background.baseLayerSource(custom.template(template));
69374                     context.storage('background-custom-template', template);
69375                 } else {
69376                     background.baseLayerSource(
69377                         background.findSource(requested) ||
69378                         best ||
69379                         background.findSource(context.storage('background-last-used')) ||
69380                         background.findSource('Bing') ||
69381                         first ||
69382                         background.findSource('none')
69383                     );
69384                 }
69385
69386                 var locator = _backgroundSources.find(function(d) {
69387                     return d.overlay && d.default;
69388                 });
69389
69390                 if (locator) {
69391                     background.toggleOverlayLayer(locator);
69392                 }
69393
69394                 var overlays = (q.overlays || '').split(',');
69395                 overlays.forEach(function(overlay) {
69396                     overlay = background.findSource(overlay);
69397                     if (overlay) {
69398                         background.toggleOverlayLayer(overlay);
69399                     }
69400                 });
69401
69402                 if (q.gpx) {
69403                     var gpx = context.layers().layer('data');
69404                     if (gpx) {
69405                         gpx.url(q.gpx, '.gpx');
69406                     }
69407                 }
69408
69409                 if (q.offset) {
69410                     var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
69411                         return !isNaN(n) && n;
69412                     });
69413
69414                     if (offset.length === 2) {
69415                         background.offset(geoMetersToOffset(offset));
69416                     }
69417                 }
69418             };
69419
69420
69421             return utilRebind(background, dispatch$1, 'on');
69422         }
69423
69424         function rendererFeatures(context) {
69425             var dispatch$1 = dispatch('change', 'redraw');
69426             var features = utilRebind({}, dispatch$1, 'on');
69427             var _deferred = new Set();
69428
69429             var traffic_roads = {
69430                 'motorway': true,
69431                 'motorway_link': true,
69432                 'trunk': true,
69433                 'trunk_link': true,
69434                 'primary': true,
69435                 'primary_link': true,
69436                 'secondary': true,
69437                 'secondary_link': true,
69438                 'tertiary': true,
69439                 'tertiary_link': true,
69440                 'residential': true,
69441                 'unclassified': true,
69442                 'living_street': true
69443             };
69444
69445             var service_roads = {
69446                 'service': true,
69447                 'road': true,
69448                 'track': true
69449             };
69450
69451             var paths = {
69452                 'path': true,
69453                 'footway': true,
69454                 'cycleway': true,
69455                 'bridleway': true,
69456                 'steps': true,
69457                 'pedestrian': true,
69458                 'corridor': true
69459             };
69460
69461             var past_futures = {
69462                 'proposed': true,
69463                 'construction': true,
69464                 'abandoned': true,
69465                 'dismantled': true,
69466                 'disused': true,
69467                 'razed': true,
69468                 'demolished': true,
69469                 'obliterated': true
69470             };
69471
69472             var _cullFactor = 1;
69473             var _cache = {};
69474             var _rules = {};
69475             var _stats = {};
69476             var _keys = [];
69477             var _hidden = [];
69478             var _forceVisible = {};
69479
69480
69481             function update() {
69482                 if (!window.mocha) {
69483                     var q = utilStringQs(window.location.hash.substring(1));
69484                     var disabled = features.disabled();
69485                     if (disabled.length) {
69486                         q.disable_features = disabled.join(',');
69487                     } else {
69488                         delete q.disable_features;
69489                     }
69490                     window.location.replace('#' + utilQsString(q, true));
69491                     context.storage('disabled-features', disabled.join(','));
69492                 }
69493                 _hidden = features.hidden();
69494                 dispatch$1.call('change');
69495                 dispatch$1.call('redraw');
69496             }
69497
69498
69499             function defineRule(k, filter, max) {
69500                 var isEnabled = true;
69501
69502                 _keys.push(k);
69503                 _rules[k] = {
69504                     filter: filter,
69505                     enabled: isEnabled,   // whether the user wants it enabled..
69506                     count: 0,
69507                     currentMax: (max || Infinity),
69508                     defaultMax: (max || Infinity),
69509                     enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
69510                     disable: function() { this.enabled = false; this.currentMax = 0; },
69511                     hidden: function() {
69512                         return !context.editable() ||
69513                             (this.count === 0 && !this.enabled) ||
69514                             this.count > this.currentMax * _cullFactor;
69515                     },
69516                     autoHidden: function() { return this.hidden() && this.currentMax > 0; }
69517                 };
69518             }
69519
69520
69521             defineRule('points', function isPoint(tags, geometry) {
69522                 return geometry === 'point';
69523             }, 200);
69524
69525             defineRule('traffic_roads', function isTrafficRoad(tags) {
69526                 return traffic_roads[tags.highway];
69527             });
69528
69529             defineRule('service_roads', function isServiceRoad(tags) {
69530                 return service_roads[tags.highway];
69531             });
69532
69533             defineRule('paths', function isPath(tags) {
69534                 return paths[tags.highway];
69535             });
69536
69537             defineRule('buildings', function isBuilding(tags) {
69538                 return (
69539                     (!!tags.building && tags.building !== 'no') ||
69540                     tags.parking === 'multi-storey' ||
69541                     tags.parking === 'sheds' ||
69542                     tags.parking === 'carports' ||
69543                     tags.parking === 'garage_boxes'
69544                 );
69545             }, 250);
69546
69547             defineRule('building_parts', function isBuildingPart(tags) {
69548                 return tags['building:part'];
69549             });
69550
69551             defineRule('indoor', function isIndoor(tags) {
69552                 return tags.indoor;
69553             });
69554
69555             defineRule('landuse', function isLanduse(tags, geometry) {
69556                 return geometry === 'area' &&
69557                     !_rules.buildings.filter(tags) &&
69558                     !_rules.building_parts.filter(tags) &&
69559                     !_rules.indoor.filter(tags) &&
69560                     !_rules.water.filter(tags) &&
69561                     !_rules.pistes.filter(tags);
69562             });
69563
69564             defineRule('boundaries', function isBoundary(tags) {
69565                 return (
69566                     !!tags.boundary
69567                 ) && !(
69568                     traffic_roads[tags.highway] ||
69569                     service_roads[tags.highway] ||
69570                     paths[tags.highway] ||
69571                     tags.waterway ||
69572                     tags.railway ||
69573                     tags.landuse ||
69574                     tags.natural ||
69575                     tags.building ||
69576                     tags.power
69577                 );
69578             });
69579
69580             defineRule('water', function isWater(tags) {
69581                 return (
69582                     !!tags.waterway ||
69583                     tags.natural === 'water' ||
69584                     tags.natural === 'coastline' ||
69585                     tags.natural === 'bay' ||
69586                     tags.landuse === 'pond' ||
69587                     tags.landuse === 'basin' ||
69588                     tags.landuse === 'reservoir' ||
69589                     tags.landuse === 'salt_pond'
69590                 );
69591             });
69592
69593             defineRule('rail', function isRail(tags) {
69594                 return (
69595                     !!tags.railway ||
69596                     tags.landuse === 'railway'
69597                 ) && !(
69598                     traffic_roads[tags.highway] ||
69599                     service_roads[tags.highway] ||
69600                     paths[tags.highway]
69601                 );
69602             });
69603
69604             defineRule('pistes', function isPiste(tags) {
69605                 return tags['piste:type'];
69606             });
69607
69608             defineRule('aerialways', function isPiste(tags) {
69609                 return tags.aerialway &&
69610                     tags.aerialway !== 'yes' &&
69611                     tags.aerialway !== 'station';
69612             });
69613
69614             defineRule('power', function isPower(tags) {
69615                 return !!tags.power;
69616             });
69617
69618             // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
69619             defineRule('past_future', function isPastFuture(tags) {
69620                 if (
69621                     traffic_roads[tags.highway] ||
69622                     service_roads[tags.highway] ||
69623                     paths[tags.highway]
69624                 ) { return false; }
69625
69626                 var strings = Object.keys(tags);
69627
69628                 for (var i = 0; i < strings.length; i++) {
69629                     var s = strings[i];
69630                     if (past_futures[s] || past_futures[tags[s]]) { return true; }
69631                 }
69632                 return false;
69633             });
69634
69635             // Lines or areas that don't match another feature filter.
69636             // IMPORTANT: The 'others' feature must be the last one defined,
69637             //   so that code in getMatches can skip this test if `hasMatch = true`
69638             defineRule('others', function isOther(tags, geometry) {
69639                 return (geometry === 'line' || geometry === 'area');
69640             });
69641
69642
69643
69644             features.features = function() {
69645                 return _rules;
69646             };
69647
69648
69649             features.keys = function() {
69650                 return _keys;
69651             };
69652
69653
69654             features.enabled = function(k) {
69655                 if (!arguments.length) {
69656                     return _keys.filter(function(k) { return _rules[k].enabled; });
69657                 }
69658                 return _rules[k] && _rules[k].enabled;
69659             };
69660
69661
69662             features.disabled = function(k) {
69663                 if (!arguments.length) {
69664                     return _keys.filter(function(k) { return !_rules[k].enabled; });
69665                 }
69666                 return _rules[k] && !_rules[k].enabled;
69667             };
69668
69669
69670             features.hidden = function(k) {
69671                 if (!arguments.length) {
69672                     return _keys.filter(function(k) { return _rules[k].hidden(); });
69673                 }
69674                 return _rules[k] && _rules[k].hidden();
69675             };
69676
69677
69678             features.autoHidden = function(k) {
69679                 if (!arguments.length) {
69680                     return _keys.filter(function(k) { return _rules[k].autoHidden(); });
69681                 }
69682                 return _rules[k] && _rules[k].autoHidden();
69683             };
69684
69685
69686             features.enable = function(k) {
69687                 if (_rules[k] && !_rules[k].enabled) {
69688                     _rules[k].enable();
69689                     update();
69690                 }
69691             };
69692
69693             features.enableAll = function() {
69694                 var didEnable = false;
69695                 for (var k in _rules) {
69696                     if (!_rules[k].enabled) {
69697                         didEnable = true;
69698                         _rules[k].enable();
69699                     }
69700                 }
69701                 if (didEnable) update();
69702             };
69703
69704
69705             features.disable = function(k) {
69706                 if (_rules[k] && _rules[k].enabled) {
69707                     _rules[k].disable();
69708                     update();
69709                 }
69710             };
69711
69712             features.disableAll = function() {
69713                 var didDisable = false;
69714                 for (var k in _rules) {
69715                     if (_rules[k].enabled) {
69716                         didDisable = true;
69717                         _rules[k].disable();
69718                     }
69719                 }
69720                 if (didDisable) update();
69721             };
69722
69723
69724             features.toggle = function(k) {
69725                 if (_rules[k]) {
69726                     (function(f) { return f.enabled ? f.disable() : f.enable(); }(_rules[k]));
69727                     update();
69728                 }
69729             };
69730
69731
69732             features.resetStats = function() {
69733                 for (var i = 0; i < _keys.length; i++) {
69734                     _rules[_keys[i]].count = 0;
69735                 }
69736                 dispatch$1.call('change');
69737             };
69738
69739
69740             features.gatherStats = function(d, resolver, dimensions) {
69741                 var needsRedraw = false;
69742                 var types = utilArrayGroupBy(d, 'type');
69743                 var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69744                 var currHidden, geometry, matches, i, j;
69745
69746                 for (i = 0; i < _keys.length; i++) {
69747                     _rules[_keys[i]].count = 0;
69748                 }
69749
69750                 // adjust the threshold for point/building culling based on viewport size..
69751                 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
69752                 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
69753
69754                 for (i = 0; i < entities.length; i++) {
69755                     geometry = entities[i].geometry(resolver);
69756                     matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
69757                     for (j = 0; j < matches.length; j++) {
69758                         _rules[matches[j]].count++;
69759                     }
69760                 }
69761
69762                 currHidden = features.hidden();
69763                 if (currHidden !== _hidden) {
69764                     _hidden = currHidden;
69765                     needsRedraw = true;
69766                     dispatch$1.call('change');
69767                 }
69768
69769                 return needsRedraw;
69770             };
69771
69772
69773             features.stats = function() {
69774                 for (var i = 0; i < _keys.length; i++) {
69775                     _stats[_keys[i]] = _rules[_keys[i]].count;
69776                 }
69777
69778                 return _stats;
69779             };
69780
69781
69782             features.clear = function(d) {
69783                 for (var i = 0; i < d.length; i++) {
69784                     features.clearEntity(d[i]);
69785                 }
69786             };
69787
69788
69789             features.clearEntity = function(entity) {
69790                 delete _cache[osmEntity.key(entity)];
69791             };
69792
69793
69794             features.reset = function() {
69795                 Array.from(_deferred).forEach(function(handle) {
69796                     window.cancelIdleCallback(handle);
69797                     _deferred.delete(handle);
69798                 });
69799
69800                 _cache = {};
69801             };
69802
69803             // only certain relations are worth checking
69804             function relationShouldBeChecked(relation) {
69805                 // multipolygon features have `area` geometry and aren't checked here
69806                 return relation.tags.type === 'boundary';
69807             }
69808
69809             features.getMatches = function(entity, resolver, geometry) {
69810                 if (geometry === 'vertex' ||
69811                     (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
69812
69813                 var ent = osmEntity.key(entity);
69814                 if (!_cache[ent]) {
69815                     _cache[ent] = {};
69816                 }
69817
69818                 if (!_cache[ent].matches) {
69819                     var matches = {};
69820                     var hasMatch = false;
69821
69822                     for (var i = 0; i < _keys.length; i++) {
69823                         if (_keys[i] === 'others') {
69824                             if (hasMatch) continue;
69825
69826                             // If an entity...
69827                             //   1. is a way that hasn't matched other 'interesting' feature rules,
69828                             if (entity.type === 'way') {
69829                                 var parents = features.getParents(entity, resolver, geometry);
69830
69831                                 //   2a. belongs only to a single multipolygon relation
69832                                 if ((parents.length === 1 && parents[0].isMultipolygon()) ||
69833                                     // 2b. or belongs only to boundary relations
69834                                     (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
69835
69836                                     // ...then match whatever feature rules the parent relation has matched.
69837                                     // see #2548, #2887
69838                                     //
69839                                     // IMPORTANT:
69840                                     // For this to work, getMatches must be called on relations before ways.
69841                                     //
69842                                     var pkey = osmEntity.key(parents[0]);
69843                                     if (_cache[pkey] && _cache[pkey].matches) {
69844                                         matches = Object.assign({}, _cache[pkey].matches);  // shallow copy
69845                                         continue;
69846                                     }
69847                                 }
69848                             }
69849                         }
69850
69851                         if (_rules[_keys[i]].filter(entity.tags, geometry)) {
69852                             matches[_keys[i]] = hasMatch = true;
69853                         }
69854                     }
69855                     _cache[ent].matches = matches;
69856                 }
69857
69858                 return _cache[ent].matches;
69859             };
69860
69861
69862             features.getParents = function(entity, resolver, geometry) {
69863                 if (geometry === 'point') return [];
69864
69865                 var ent = osmEntity.key(entity);
69866                 if (!_cache[ent]) {
69867                     _cache[ent] = {};
69868                 }
69869
69870                 if (!_cache[ent].parents) {
69871                     var parents = [];
69872                     if (geometry === 'vertex') {
69873                         parents = resolver.parentWays(entity);
69874                     } else {   // 'line', 'area', 'relation'
69875                         parents = resolver.parentRelations(entity);
69876                     }
69877                     _cache[ent].parents = parents;
69878                 }
69879                 return _cache[ent].parents;
69880             };
69881
69882
69883             features.isHiddenPreset = function(preset, geometry) {
69884                 if (!_hidden.length) return false;
69885                 if (!preset.tags) return false;
69886
69887                 var test = preset.setTags({}, geometry);
69888                 for (var key in _rules) {
69889                     if (_rules[key].filter(test, geometry)) {
69890                         if (_hidden.indexOf(key) !== -1) {
69891                             return key;
69892                         }
69893                         return false;
69894                     }
69895                 }
69896                 return false;
69897             };
69898
69899
69900             features.isHiddenFeature = function(entity, resolver, geometry) {
69901                 if (!_hidden.length) return false;
69902                 if (!entity.version) return false;
69903                 if (_forceVisible[entity.id]) return false;
69904
69905                 var matches = Object.keys(features.getMatches(entity, resolver, geometry));
69906                 return matches.length && matches.every(function(k) { return features.hidden(k); });
69907             };
69908
69909
69910             features.isHiddenChild = function(entity, resolver, geometry) {
69911                 if (!_hidden.length) return false;
69912                 if (!entity.version || geometry === 'point') return false;
69913                 if (_forceVisible[entity.id]) return false;
69914
69915                 var parents = features.getParents(entity, resolver, geometry);
69916                 if (!parents.length) return false;
69917
69918                 for (var i = 0; i < parents.length; i++) {
69919                     if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
69920                         return false;
69921                     }
69922                 }
69923                 return true;
69924             };
69925
69926
69927             features.hasHiddenConnections = function(entity, resolver) {
69928                 if (!_hidden.length) return false;
69929
69930                 var childNodes, connections;
69931                 if (entity.type === 'midpoint') {
69932                     childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
69933                     connections = [];
69934                 } else {
69935                     childNodes = entity.nodes ? resolver.childNodes(entity) : [];
69936                     connections = features.getParents(entity, resolver, entity.geometry(resolver));
69937                 }
69938
69939                 // gather ways connected to child nodes..
69940                 connections = childNodes.reduce(function(result, e) {
69941                     return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
69942                 }, connections);
69943
69944                 return connections.some(function(e) {
69945                     return features.isHidden(e, resolver, e.geometry(resolver));
69946                 });
69947             };
69948
69949
69950             features.isHidden = function(entity, resolver, geometry) {
69951                 if (!_hidden.length) return false;
69952                 if (!entity.version) return false;
69953
69954                 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
69955                 return fn(entity, resolver, geometry);
69956             };
69957
69958
69959             features.filter = function(d, resolver) {
69960                 if (!_hidden.length) return d;
69961
69962                 var result = [];
69963                 for (var i = 0; i < d.length; i++) {
69964                     var entity = d[i];
69965                     if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
69966                         result.push(entity);
69967                     }
69968                 }
69969                 return result;
69970             };
69971
69972
69973             features.forceVisible = function(entityIDs) {
69974                 if (!arguments.length) return Object.keys(_forceVisible);
69975
69976                 _forceVisible = {};
69977                 for (var i = 0; i < entityIDs.length; i++) {
69978                     _forceVisible[entityIDs[i]] = true;
69979                     var entity = context.hasEntity(entityIDs[i]);
69980                     if (entity && entity.type === 'relation') {
69981                         // also show relation members (one level deep)
69982                         for (var j in entity.members) {
69983                             _forceVisible[entity.members[j].id] = true;
69984                         }
69985                     }
69986                 }
69987                 return features;
69988             };
69989
69990
69991             features.init = function() {
69992                 var storage = context.storage('disabled-features');
69993                 if (storage) {
69994                     var storageDisabled = storage.replace(/;/g, ',').split(',');
69995                     storageDisabled.forEach(features.disable);
69996                 }
69997
69998                 var q = utilStringQs(window.location.hash.substring(1));
69999                 if (q.disable_features) {
70000                     var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
70001                     hashDisabled.forEach(features.disable);
70002                 }
70003             };
70004
70005
70006             // warm up the feature matching cache upon merging fetched data
70007             context.history().on('merge.features', function(newEntities) {
70008                 if (!newEntities) return;
70009                 var handle = window.requestIdleCallback(function() {
70010                     var graph = context.graph();
70011                     var types = utilArrayGroupBy(newEntities, 'type');
70012                     // ensure that getMatches is called on relations before ways
70013                     var entities = [].concat(types.relation || [], types.way || [], types.node || []);
70014                     for (var i = 0; i < entities.length; i++) {
70015                         var geometry = entities[i].geometry(graph);
70016                         features.getMatches(entities[i], graph, geometry);
70017                     }
70018                 });
70019                 _deferred.add(handle);
70020             });
70021
70022
70023             return features;
70024         }
70025
70026         // Touch targets control which other vertices we can drag a vertex onto.
70027         //
70028         // - the activeID - nope
70029         // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
70030         // - 2 away from the activeID - nope (would create a self intersecting segment)
70031         // - all others on a linear way - yes
70032         // - all others on a closed way - nope (would create a self intersecting polygon)
70033         //
70034         // returns
70035         // 0 = active vertex - no touch/connect
70036         // 1 = passive vertex - yes touch/connect
70037         // 2 = adjacent vertex - yes but pay attention segmenting a line here
70038         //
70039         function svgPassiveVertex(node, graph, activeID) {
70040             if (!activeID) return 1;
70041             if (activeID === node.id) return 0;
70042
70043             var parents = graph.parentWays(node);
70044
70045             for (var i = 0; i < parents.length; i++) {
70046                 var nodes = parents[i].nodes;
70047                 var isClosed = parents[i].isClosed();
70048                 for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
70049                     if (nodes[j] === node.id) {
70050                         var ix1 = j - 2;
70051                         var ix2 = j - 1;
70052                         var ix3 = j + 1;
70053                         var ix4 = j + 2;
70054
70055                         if (isClosed) {  // wraparound if needed
70056                             var max = nodes.length - 1;
70057                             if (ix1 < 0)   ix1 = max + ix1;
70058                             if (ix2 < 0)   ix2 = max + ix2;
70059                             if (ix3 > max) ix3 = ix3 - max;
70060                             if (ix4 > max) ix4 = ix4 - max;
70061                         }
70062
70063                         if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
70064                         else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
70065                         else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
70066                         else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
70067                         else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
70068                     }
70069                 }
70070             }
70071
70072             return 1;   // ok
70073         }
70074
70075
70076         function svgMarkerSegments(projection, graph, dt,
70077                                           shouldReverse,
70078                                           bothDirections) {
70079             return function(entity) {
70080                 var i = 0;
70081                 var offset = dt;
70082                 var segments = [];
70083                 var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
70084                 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
70085                 var a, b;
70086
70087                 if (shouldReverse(entity)) {
70088                     coordinates.reverse();
70089                 }
70090
70091                 d3_geoStream({
70092                     type: 'LineString',
70093                     coordinates: coordinates
70094                 }, projection.stream(clip({
70095                     lineStart: function() {},
70096                     lineEnd: function() { a = null; },
70097                     point: function(x, y) {
70098                         b = [x, y];
70099
70100                         if (a) {
70101                             var span = geoVecLength(a, b) - offset;
70102
70103                             if (span >= 0) {
70104                                 var heading = geoVecAngle(a, b);
70105                                 var dx = dt * Math.cos(heading);
70106                                 var dy = dt * Math.sin(heading);
70107                                 var p = [
70108                                     a[0] + offset * Math.cos(heading),
70109                                     a[1] + offset * Math.sin(heading)
70110                                 ];
70111
70112                                 // gather coordinates
70113                                 var coord = [a, p];
70114                                 for (span -= dt; span >= 0; span -= dt) {
70115                                     p = geoVecAdd(p, [dx, dy]);
70116                                     coord.push(p);
70117                                 }
70118                                 coord.push(b);
70119
70120                                 // generate svg paths
70121                                 var segment = '';
70122                                 var j;
70123
70124                                 for (j = 0; j < coord.length; j++) {
70125                                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70126                                 }
70127                                 segments.push({ id: entity.id, index: i++, d: segment });
70128
70129                                 if (bothDirections(entity)) {
70130                                     segment = '';
70131                                     for (j = coord.length - 1; j >= 0; j--) {
70132                                         segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70133                                     }
70134                                     segments.push({ id: entity.id, index: i++, d: segment });
70135                                 }
70136                             }
70137
70138                             offset = -span;
70139                         }
70140
70141                         a = b;
70142                     }
70143                 })));
70144
70145                 return segments;
70146             };
70147         }
70148
70149
70150         function svgPath(projection, graph, isArea) {
70151
70152             // Explanation of magic numbers:
70153             // "padding" here allows space for strokes to extend beyond the viewport,
70154             // so that the stroke isn't drawn along the edge of the viewport when
70155             // the shape is clipped.
70156             //
70157             // When drawing lines, pad viewport by 5px.
70158             // When drawing areas, pad viewport by 65px in each direction to allow
70159             // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
70160
70161             var cache = {};
70162             var padding = isArea ? 65 : 5;
70163             var viewport = projection.clipExtent();
70164             var paddedExtent = [
70165                 [viewport[0][0] - padding, viewport[0][1] - padding],
70166                 [viewport[1][0] + padding, viewport[1][1] + padding]
70167             ];
70168             var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
70169             var project = projection.stream;
70170             var path = d3_geoPath()
70171                 .projection({stream: function(output) { return project(clip(output)); }});
70172
70173             var svgpath = function(entity) {
70174                 if (entity.id in cache) {
70175                     return cache[entity.id];
70176                 } else {
70177                     return cache[entity.id] = path(entity.asGeoJSON(graph));
70178                 }
70179             };
70180
70181             svgpath.geojson = function(d) {
70182                 if (d.__featurehash__ !== undefined) {
70183                     if (d.__featurehash__ in cache) {
70184                         return cache[d.__featurehash__];
70185                     } else {
70186                         return cache[d.__featurehash__] = path(d);
70187                     }
70188                 } else {
70189                     return path(d);
70190                 }
70191             };
70192
70193             return svgpath;
70194         }
70195
70196
70197         function svgPointTransform(projection) {
70198             var svgpoint = function(entity) {
70199                 // http://jsperf.com/short-array-join
70200                 var pt = projection(entity.loc);
70201                 return 'translate(' + pt[0] + ',' + pt[1] + ')';
70202             };
70203
70204             svgpoint.geojson = function(d) {
70205                 return svgpoint(d.properties.entity);
70206             };
70207
70208             return svgpoint;
70209         }
70210
70211
70212         function svgRelationMemberTags(graph) {
70213             return function(entity) {
70214                 var tags = entity.tags;
70215                 var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
70216                 graph.parentRelations(entity).forEach(function(relation) {
70217                     var type = relation.tags.type;
70218                     if ((type === 'multipolygon' && shouldCopyMultipolygonTags) || type === 'boundary') {
70219                         tags = Object.assign({}, relation.tags, tags);
70220                     }
70221                 });
70222                 return tags;
70223             };
70224         }
70225
70226
70227         function svgSegmentWay(way, graph, activeID) {
70228             // When there is no activeID, we can memoize this expensive computation
70229             if (activeID === undefined) {
70230                 return graph.transient(way, 'waySegments', getWaySegments);
70231             } else {
70232                 return getWaySegments();
70233             }
70234
70235             function getWaySegments() {
70236                 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
70237                 var features = { passive: [], active: [] };
70238                 var start = {};
70239                 var end = {};
70240                 var node, type;
70241
70242                 for (var i = 0; i < way.nodes.length; i++) {
70243                     node = graph.entity(way.nodes[i]);
70244                     type = svgPassiveVertex(node, graph, activeID);
70245                     end = { node: node, type: type };
70246
70247                     if (start.type !== undefined) {
70248                         if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
70249                             pushActive(start, end, i);
70250                         } else if (start.type === 0 && end.type === 0) {   // both active vertices
70251                             pushActive(start, end, i);
70252                         } else {
70253                             pushPassive(start, end, i);
70254                         }
70255                     }
70256
70257                     start = end;
70258                 }
70259
70260                 return features;
70261
70262                 function pushActive(start, end, index) {
70263                     features.active.push({
70264                         type: 'Feature',
70265                         id: way.id + '-' + index + '-nope',
70266                         properties: {
70267                             nope: true,
70268                             target: true,
70269                             entity: way,
70270                             nodes: [start.node, end.node],
70271                             index: index
70272                         },
70273                         geometry: {
70274                             type: 'LineString',
70275                             coordinates: [start.node.loc, end.node.loc]
70276                         }
70277                     });
70278                 }
70279
70280                 function pushPassive(start, end, index) {
70281                     features.passive.push({
70282                         type: 'Feature',
70283                         id: way.id + '-' + index,
70284                         properties: {
70285                             target: true,
70286                             entity: way,
70287                             nodes: [start.node, end.node],
70288                             index: index
70289                         },
70290                         geometry: {
70291                             type: 'LineString',
70292                             coordinates: [start.node.loc, end.node.loc]
70293                         }
70294                     });
70295                 }
70296             }
70297         }
70298
70299         function svgTagClasses() {
70300             var primaries = [
70301                 'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
70302                 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
70303                 'leisure', 'military', 'place', 'man_made', 'route', 'attraction',
70304                 'building:part', 'indoor'
70305             ];
70306             var statuses = [
70307                 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
70308                 'razed', 'demolished', 'obliterated', 'intermittent'
70309             ];
70310             var secondaries = [
70311                 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
70312                 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
70313                 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure',
70314                 'man_made', 'indoor'
70315             ];
70316             var _tags = function(entity) { return entity.tags; };
70317
70318
70319             var tagClasses = function(selection) {
70320                 selection.each(function tagClassesEach(entity) {
70321                     var value = this.className;
70322
70323                     if (value.baseVal !== undefined) {
70324                         value = value.baseVal;
70325                     }
70326
70327                     var t = _tags(entity);
70328
70329                     var computed = tagClasses.getClassesString(t, value, entity);
70330
70331                     if (computed !== value) {
70332                         d3_select(this).attr('class', computed);
70333                     }
70334                 });
70335             };
70336
70337
70338             tagClasses.getClassesString = function(t, value, entity) {
70339                 var primary, status;
70340                 var i, k, v;
70341
70342                 // in some situations we want to render perimeter strokes a certain way
70343                 var overrideGeometry;
70344                 if (/\bstroke\b/.test(value)) {
70345                     if (!!t.barrier && t.barrier !== 'no') {
70346                         overrideGeometry = 'line';
70347                     } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
70348                         overrideGeometry = 'area';
70349                     }
70350                 }
70351
70352                 // preserve base classes (nothing with `tag-`)
70353                 var classes = value.trim().split(/\s+/)
70354                     .filter(function(klass) {
70355                         return klass.length && !/^tag-/.test(klass);
70356                     })
70357                     .map(function(klass) {  // special overrides for some perimeter strokes
70358                         return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
70359                     });
70360
70361                 // pick at most one primary classification tag..
70362                 for (i = 0; i < primaries.length; i++) {
70363                     k = primaries[i];
70364                     v = t[k];
70365                     if (!v || v === 'no') continue;
70366
70367                     if (k === 'piste:type') {  // avoid a ':' in the class name
70368                         k = 'piste';
70369                     } else if (k === 'building:part') {  // avoid a ':' in the class name
70370                         k = 'building_part';
70371                     }
70372
70373                     primary = k;
70374                     if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
70375                         status = v;
70376                         classes.push('tag-' + k);
70377                     } else {
70378                         classes.push('tag-' + k);
70379                         classes.push('tag-' + k + '-' + v);
70380                     }
70381
70382                     break;
70383                 }
70384
70385                 // add at most one status tag, only if relates to primary tag..
70386                 if (!status) {
70387                     for (i = 0; i < statuses.length; i++) {
70388                         k = statuses[i];
70389                         v = t[k];
70390                         if (!v || v === 'no') continue;
70391
70392                         if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
70393                             status = k;
70394                         }
70395                         else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
70396                             status = k;
70397                         } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
70398                             status = k;
70399                             primary = v;
70400                             classes.push('tag-' + v);
70401                         }  // else ignore e.g.  `highway=path + abandoned=railway`
70402
70403                         if (status) break;
70404                     }
70405                 }
70406
70407                 if (status) {
70408                     classes.push('tag-status');
70409                     classes.push('tag-status-' + status);
70410                 }
70411
70412                 // add any secondary tags
70413                 for (i = 0; i < secondaries.length; i++) {
70414                     k = secondaries[i];
70415                     v = t[k];
70416                     if (!v || v === 'no' || k === primary) continue;
70417                     classes.push('tag-' + k);
70418                     classes.push('tag-' + k + '-' + v);
70419                 }
70420
70421                 // For highways, look for surface tagging..
70422                 if (primary === 'highway' || primary === 'aeroway') {
70423                     var paved = (t.highway !== 'track');
70424                     for (k in t) {
70425                         v = t[k];
70426                         if (k in osmPavedTags) {
70427                             paved = !!osmPavedTags[k][v];
70428                             break;
70429                         }
70430                     }
70431                     if (!paved) {
70432                         classes.push('tag-unpaved');
70433                     }
70434                 }
70435
70436                 // If this is a wikidata-tagged item, add a class for that..
70437                 if (t.wikidata || t['brand:wikidata']) {
70438                     classes.push('tag-wikidata');
70439                 }
70440
70441                 return classes.join(' ').trim();
70442             };
70443
70444
70445             tagClasses.tags = function(val) {
70446                 if (!arguments.length) return _tags;
70447                 _tags = val;
70448                 return tagClasses;
70449             };
70450
70451             return tagClasses;
70452         }
70453
70454         function svgAreas(projection, context) {
70455             // Patterns only work in Firefox when set directly on element.
70456             // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
70457             var patterns = {
70458                 // tag - pattern name
70459                 // -or-
70460                 // tag - value - pattern name
70461                 // -or-
70462                 // tag - value - rules (optional tag-values, pattern name)
70463                 // (matches earlier rules first, so fallback should be last entry)
70464                 amenity: {
70465                     grave_yard: 'cemetery',
70466                     fountain: 'water_standing'
70467                 },
70468                 landuse: {
70469                     cemetery: [
70470                         { religion: 'christian', pattern: 'cemetery_christian' },
70471                         { religion: 'buddhist', pattern: 'cemetery_buddhist' },
70472                         { religion: 'muslim', pattern: 'cemetery_muslim' },
70473                         { religion: 'jewish', pattern: 'cemetery_jewish' },
70474                         { pattern: 'cemetery' }
70475                     ],
70476                     construction: 'construction',
70477                     farmland: 'farmland',
70478                     farmyard: 'farmyard',
70479                     forest: [
70480                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70481                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70482                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70483                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70484                     ],
70485                     grave_yard: 'cemetery',
70486                     grass: 'grass',
70487                     landfill: 'landfill',
70488                     meadow: 'meadow',
70489                     military: 'construction',
70490                     orchard: 'orchard',
70491                     quarry: 'quarry',
70492                     vineyard: 'vineyard'
70493                 },
70494                 natural: {
70495                     beach: 'beach',
70496                     grassland: 'grass',
70497                     sand: 'beach',
70498                     scrub: 'scrub',
70499                     water: [
70500                         { water: 'pond', pattern: 'pond' },
70501                         { water: 'reservoir', pattern: 'water_standing' },
70502                         { pattern: 'waves' }
70503                     ],
70504                     wetland: [
70505                         { wetland: 'marsh', pattern: 'wetland_marsh' },
70506                         { wetland: 'swamp', pattern: 'wetland_swamp' },
70507                         { wetland: 'bog', pattern: 'wetland_bog' },
70508                         { wetland: 'reedbed', pattern: 'wetland_reedbed' },
70509                         { pattern: 'wetland' }
70510                     ],
70511                     wood: [
70512                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70513                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70514                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70515                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70516                     ]
70517                 },
70518                 traffic_calming: {
70519                     island: [
70520                         { surface: 'grass', pattern: 'grass' },
70521                     ],
70522                     chicane: [
70523                         { surface: 'grass', pattern: 'grass' },
70524                     ],
70525                     choker: [
70526                         { surface: 'grass', pattern: 'grass' },
70527                     ]
70528                 }
70529             };
70530
70531             function setPattern(entity) {
70532                 // Skip pattern filling if this is a building (buildings don't get patterns applied)
70533                 if (entity.tags.building && entity.tags.building !== 'no') {
70534                     this.style.fill = this.style.stroke = '';
70535                     return;
70536                 }
70537
70538                 for (var tag in patterns) {
70539                     var entityValue = entity.tags[tag];
70540                     if (!entityValue) continue;
70541
70542                     if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
70543                         this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
70544                         return;
70545                     } else {
70546                         var values = patterns[tag];
70547                         for (var value in values) {
70548                             if (entityValue !== value) continue;
70549
70550                             var rules = values[value];
70551                             if (typeof rules === 'string') { // short syntax - pattern name
70552                                 this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
70553                                 return;
70554                             } else { // long syntax - rule array
70555                                 for (var ruleKey in rules) {
70556                                     var rule = rules[ruleKey];
70557
70558                                     var pass = true;
70559                                     for (var criterion in rule) {
70560                                         if (criterion !== 'pattern') { // reserved for pattern name
70561                                             // The only rule is a required tag-value pair
70562                                             var v = entity.tags[criterion];
70563                                             if (!v || v !== rule[criterion]) {
70564                                                 pass = false;
70565                                                 break;
70566                                             }
70567                                         }
70568                                     }
70569
70570                                     if (pass) {
70571                                         this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
70572                                         return;
70573                                     }
70574                                 }
70575                             }
70576                         }
70577                     }
70578                 }
70579
70580                 this.style.fill = this.style.stroke = '';
70581             }
70582
70583
70584             function drawTargets(selection, graph, entities, filter) {
70585                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70586                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
70587                 var getPath = svgPath(projection).geojson;
70588                 var activeID = context.activeID();
70589
70590                 // The targets and nopes will be MultiLineString sub-segments of the ways
70591                 var data = { targets: [], nopes: [] };
70592
70593                 entities.forEach(function(way) {
70594                     var features = svgSegmentWay(way, graph, activeID);
70595                     data.targets.push.apply(data.targets, features.passive);
70596                     data.nopes.push.apply(data.nopes, features.active);
70597                 });
70598
70599
70600                 // Targets allow hover and vertex snapping
70601                 var targetData = data.targets.filter(getPath);
70602                 var targets = selection.selectAll('.area.target-allowed')
70603                     .filter(function(d) { return filter(d.properties.entity); })
70604                     .data(targetData, function key(d) { return d.id; });
70605
70606                 // exit
70607                 targets.exit()
70608                     .remove();
70609
70610                 // enter/update
70611                 targets.enter()
70612                     .append('path')
70613                     .merge(targets)
70614                     .attr('d', getPath)
70615                     .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
70616
70617
70618                 // NOPE
70619                 var nopeData = data.nopes.filter(getPath);
70620                 var nopes = selection.selectAll('.area.target-nope')
70621                     .filter(function(d) { return filter(d.properties.entity); })
70622                     .data(nopeData, function key(d) { return d.id; });
70623
70624                 // exit
70625                 nopes.exit()
70626                     .remove();
70627
70628                 // enter/update
70629                 nopes.enter()
70630                     .append('path')
70631                     .merge(nopes)
70632                     .attr('d', getPath)
70633                     .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
70634             }
70635
70636
70637             function drawAreas(selection, graph, entities, filter) {
70638                 var path = svgPath(projection, graph, true);
70639                 var areas = {};
70640                 var multipolygon;
70641
70642                 for (var i = 0; i < entities.length; i++) {
70643                     var entity = entities[i];
70644                     if (entity.geometry(graph) !== 'area') continue;
70645
70646                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
70647                     if (multipolygon) {
70648                         areas[multipolygon.id] = {
70649                             entity: multipolygon.mergeTags(entity.tags),
70650                             area: Math.abs(entity.area(graph))
70651                         };
70652                     } else if (!areas[entity.id]) {
70653                         areas[entity.id] = {
70654                             entity: entity,
70655                             area: Math.abs(entity.area(graph))
70656                         };
70657                     }
70658                 }
70659
70660                 var fills = Object.values(areas).filter(function hasPath(a) { return path(a.entity); });
70661                 fills.sort(function areaSort(a, b) { return b.area - a.area; });
70662                 fills = fills.map(function(a) { return a.entity; });
70663
70664                 var strokes = fills.filter(function(area) { return area.type === 'way'; });
70665
70666                 var data = {
70667                     clip: fills,
70668                     shadow: strokes,
70669                     stroke: strokes,
70670                     fill: fills
70671                 };
70672
70673                 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
70674                    .filter(filter)
70675                    .data(data.clip, osmEntity.key);
70676
70677                 clipPaths.exit()
70678                    .remove();
70679
70680                 var clipPathsEnter = clipPaths.enter()
70681                    .append('clipPath')
70682                    .attr('class', 'clipPath-osm')
70683                    .attr('id', function(entity) { return entity.id + '-clippath'; });
70684
70685                 clipPathsEnter
70686                    .append('path');
70687
70688                 clipPaths.merge(clipPathsEnter)
70689                    .selectAll('path')
70690                    .attr('d', path);
70691
70692
70693                 var drawLayer = selection.selectAll('.layer-osm.areas');
70694                 var touchLayer = selection.selectAll('.layer-touch.areas');
70695
70696                 // Draw areas..
70697                 var areagroup = drawLayer
70698                     .selectAll('g.areagroup')
70699                     .data(['fill', 'shadow', 'stroke']);
70700
70701                 areagroup = areagroup.enter()
70702                     .append('g')
70703                     .attr('class', function(d) { return 'areagroup area-' + d; })
70704                     .merge(areagroup);
70705
70706                 var paths = areagroup
70707                     .selectAll('path')
70708                     .filter(filter)
70709                     .data(function(layer) { return data[layer]; }, osmEntity.key);
70710
70711                 paths.exit()
70712                     .remove();
70713
70714
70715                 var fillpaths = selection.selectAll('.area-fill path.area').nodes();
70716                 var bisect = d3_bisector(function(node) { return -node.__data__.area(graph); }).left;
70717
70718                 function sortedByArea(entity) {
70719                     if (this._parent.__data__ === 'fill') {
70720                         return fillpaths[bisect(fillpaths, -entity.area(graph))];
70721                     }
70722                 }
70723
70724                 paths = paths.enter()
70725                     .insert('path', sortedByArea)
70726                     .merge(paths)
70727                     .each(function(entity) {
70728                         var layer = this.parentNode.__data__;
70729                         this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
70730
70731                         if (layer === 'fill') {
70732                             this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
70733                             setPattern.call(this, entity);
70734                         }
70735                     })
70736                     .call(svgTagClasses())
70737                     .attr('d', path);
70738
70739
70740                 // Draw touch targets..
70741                 touchLayer
70742                     .call(drawTargets, graph, data.stroke, filter);
70743             }
70744
70745             return drawAreas;
70746         }
70747
70748         //[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]
70749         //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
70750         //[5]           Name       ::=          NameStartChar (NameChar)*
70751         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
70752         var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
70753         var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
70754         //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
70755         //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(',')
70756
70757         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70758         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70759         var S_TAG = 0;//tag name offerring
70760         var S_ATTR = 1;//attr name offerring 
70761         var S_ATTR_SPACE=2;//attr name end and space offer
70762         var S_EQ = 3;//=space?
70763         var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
70764         var S_ATTR_END = 5;//attr value end and no space(quot end)
70765         var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
70766         var S_TAG_CLOSE = 7;//closed el<el />
70767
70768         function XMLReader(){
70769                 
70770         }
70771
70772         XMLReader.prototype = {
70773                 parse:function(source,defaultNSMap,entityMap){
70774                         var domBuilder = this.domBuilder;
70775                         domBuilder.startDocument();
70776                         _copy(defaultNSMap ,defaultNSMap = {});
70777                         parse(source,defaultNSMap,entityMap,
70778                                         domBuilder,this.errorHandler);
70779                         domBuilder.endDocument();
70780                 }
70781         };
70782         function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
70783                 function fixedFromCharCode(code) {
70784                         // String.prototype.fromCharCode does not supports
70785                         // > 2 bytes unicode chars directly
70786                         if (code > 0xffff) {
70787                                 code -= 0x10000;
70788                                 var surrogate1 = 0xd800 + (code >> 10)
70789                                         , surrogate2 = 0xdc00 + (code & 0x3ff);
70790
70791                                 return String.fromCharCode(surrogate1, surrogate2);
70792                         } else {
70793                                 return String.fromCharCode(code);
70794                         }
70795                 }
70796                 function entityReplacer(a){
70797                         var k = a.slice(1,-1);
70798                         if(k in entityMap){
70799                                 return entityMap[k]; 
70800                         }else if(k.charAt(0) === '#'){
70801                                 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
70802                         }else{
70803                                 errorHandler.error('entity not found:'+a);
70804                                 return a;
70805                         }
70806                 }
70807                 function appendText(end){//has some bugs
70808                         if(end>start){
70809                                 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
70810                                 locator&&position(start);
70811                                 domBuilder.characters(xt,0,end-start);
70812                                 start = end;
70813                         }
70814                 }
70815                 function position(p,m){
70816                         while(p>=lineEnd && (m = linePattern.exec(source))){
70817                                 lineStart = m.index;
70818                                 lineEnd = lineStart + m[0].length;
70819                                 locator.lineNumber++;
70820                                 //console.log('line++:',locator,startPos,endPos)
70821                         }
70822                         locator.columnNumber = p-lineStart+1;
70823                 }
70824                 var lineStart = 0;
70825                 var lineEnd = 0;
70826                 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
70827                 var locator = domBuilder.locator;
70828                 
70829                 var parseStack = [{currentNSMap:defaultNSMapCopy}];
70830                 var closeMap = {};
70831                 var start = 0;
70832                 while(true){
70833                         try{
70834                                 var tagStart = source.indexOf('<',start);
70835                                 if(tagStart<0){
70836                                         if(!source.substr(start).match(/^\s*$/)){
70837                                                 var doc = domBuilder.doc;
70838                                         var text = doc.createTextNode(source.substr(start));
70839                                         doc.appendChild(text);
70840                                         domBuilder.currentElement = text;
70841                                         }
70842                                         return;
70843                                 }
70844                                 if(tagStart>start){
70845                                         appendText(tagStart);
70846                                 }
70847                                 switch(source.charAt(tagStart+1)){
70848                                 case '/':
70849                                         var end = source.indexOf('>',tagStart+3);
70850                                         var tagName = source.substring(tagStart+2,end);
70851                                         var config = parseStack.pop();
70852                                         if(end<0){
70853                                                 
70854                                         tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
70855                                         //console.error('#@@@@@@'+tagName)
70856                                         errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
70857                                         end = tagStart+1+tagName.length;
70858                                 }else if(tagName.match(/\s</)){
70859                                         tagName = tagName.replace(/[\s<].*/,'');
70860                                         errorHandler.error("end tag name: "+tagName+' maybe not complete');
70861                                         end = tagStart+1+tagName.length;
70862                                         }
70863                                         //console.error(parseStack.length,parseStack)
70864                                         //console.error(config);
70865                                         var localNSMap = config.localNSMap;
70866                                         var endMatch = config.tagName == tagName;
70867                                         var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
70868                                 if(endIgnoreCaseMach){
70869                                         domBuilder.endElement(config.uri,config.localName,tagName);
70870                                                 if(localNSMap){
70871                                                         for(var prefix in localNSMap){
70872                                                                 domBuilder.endPrefixMapping(prefix) ;
70873                                                         }
70874                                                 }
70875                                                 if(!endMatch){
70876                                         errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
70877                                                 }
70878                                 }else{
70879                                         parseStack.push(config);
70880                                 }
70881                                         
70882                                         end++;
70883                                         break;
70884                                         // end elment
70885                                 case '?':// <?...?>
70886                                         locator&&position(tagStart);
70887                                         end = parseInstruction(source,tagStart,domBuilder);
70888                                         break;
70889                                 case '!':// <!doctype,<![CDATA,<!--
70890                                         locator&&position(tagStart);
70891                                         end = parseDCC(source,tagStart,domBuilder,errorHandler);
70892                                         break;
70893                                 default:
70894                                         locator&&position(tagStart);
70895                                         var el = new ElementAttributes();
70896                                         var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
70897                                         //elStartEnd
70898                                         var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
70899                                         var len = el.length;
70900                                         
70901                                         
70902                                         if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
70903                                                 el.closed = true;
70904                                                 if(!entityMap.nbsp){
70905                                                         errorHandler.warning('unclosed xml attribute');
70906                                                 }
70907                                         }
70908                                         if(locator && len){
70909                                                 var locator2 = copyLocator(locator,{});
70910                                                 //try{//attribute position fixed
70911                                                 for(var i = 0;i<len;i++){
70912                                                         var a = el[i];
70913                                                         position(a.offset);
70914                                                         a.locator = copyLocator(locator,{});
70915                                                 }
70916                                                 //}catch(e){console.error('@@@@@'+e)}
70917                                                 domBuilder.locator = locator2;
70918                                                 if(appendElement(el,domBuilder,currentNSMap)){
70919                                                         parseStack.push(el);
70920                                                 }
70921                                                 domBuilder.locator = locator;
70922                                         }else{
70923                                                 if(appendElement(el,domBuilder,currentNSMap)){
70924                                                         parseStack.push(el);
70925                                                 }
70926                                         }
70927                                         
70928                                         
70929                                         
70930                                         if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
70931                                                 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
70932                                         }else{
70933                                                 end++;
70934                                         }
70935                                 }
70936                         }catch(e){
70937                                 errorHandler.error('element parse error: '+e);
70938                                 //errorHandler.error('element parse error: '+e);
70939                                 end = -1;
70940                                 //throw e;
70941                         }
70942                         if(end>start){
70943                                 start = end;
70944                         }else{
70945                                 //TODO: 这里有可能sax回退,有位置错误风险
70946                                 appendText(Math.max(tagStart,start)+1);
70947                         }
70948                 }
70949         }
70950         function copyLocator(f,t){
70951                 t.lineNumber = f.lineNumber;
70952                 t.columnNumber = f.columnNumber;
70953                 return t;
70954         }
70955
70956         /**
70957          * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
70958          * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
70959          */
70960         function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
70961                 var attrName;
70962                 var value;
70963                 var p = ++start;
70964                 var s = S_TAG;//status
70965                 while(true){
70966                         var c = source.charAt(p);
70967                         switch(c){
70968                         case '=':
70969                                 if(s === S_ATTR){//attrName
70970                                         attrName = source.slice(start,p);
70971                                         s = S_EQ;
70972                                 }else if(s === S_ATTR_SPACE){
70973                                         s = S_EQ;
70974                                 }else{
70975                                         //fatalError: equal must after attrName or space after attrName
70976                                         throw new Error('attribute equal must after attrName');
70977                                 }
70978                                 break;
70979                         case '\'':
70980                         case '"':
70981                                 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
70982                                         ){//equal
70983                                         if(s === S_ATTR){
70984                                                 errorHandler.warning('attribute value must after "="');
70985                                                 attrName = source.slice(start,p);
70986                                         }
70987                                         start = p+1;
70988                                         p = source.indexOf(c,start);
70989                                         if(p>0){
70990                                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70991                                                 el.add(attrName,value,start-1);
70992                                                 s = S_ATTR_END;
70993                                         }else{
70994                                                 //fatalError: no end quot match
70995                                                 throw new Error('attribute value no end \''+c+'\' match');
70996                                         }
70997                                 }else if(s == S_ATTR_NOQUOT_VALUE){
70998                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70999                                         //console.log(attrName,value,start,p)
71000                                         el.add(attrName,value,start);
71001                                         //console.dir(el)
71002                                         errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
71003                                         start = p+1;
71004                                         s = S_ATTR_END;
71005                                 }else{
71006                                         //fatalError: no equal before
71007                                         throw new Error('attribute value must after "="');
71008                                 }
71009                                 break;
71010                         case '/':
71011                                 switch(s){
71012                                 case S_TAG:
71013                                         el.setTagName(source.slice(start,p));
71014                                 case S_ATTR_END:
71015                                 case S_TAG_SPACE:
71016                                 case S_TAG_CLOSE:
71017                                         s =S_TAG_CLOSE;
71018                                         el.closed = true;
71019                                 case S_ATTR_NOQUOT_VALUE:
71020                                 case S_ATTR:
71021                                 case S_ATTR_SPACE:
71022                                         break;
71023                                 //case S_EQ:
71024                                 default:
71025                                         throw new Error("attribute invalid close char('/')")
71026                                 }
71027                                 break;
71028                         case ''://end document
71029                                 //throw new Error('unexpected end of input')
71030                                 errorHandler.error('unexpected end of input');
71031                                 if(s == S_TAG){
71032                                         el.setTagName(source.slice(start,p));
71033                                 }
71034                                 return p;
71035                         case '>':
71036                                 switch(s){
71037                                 case S_TAG:
71038                                         el.setTagName(source.slice(start,p));
71039                                 case S_ATTR_END:
71040                                 case S_TAG_SPACE:
71041                                 case S_TAG_CLOSE:
71042                                         break;//normal
71043                                 case S_ATTR_NOQUOT_VALUE://Compatible state
71044                                 case S_ATTR:
71045                                         value = source.slice(start,p);
71046                                         if(value.slice(-1) === '/'){
71047                                                 el.closed  = true;
71048                                                 value = value.slice(0,-1);
71049                                         }
71050                                 case S_ATTR_SPACE:
71051                                         if(s === S_ATTR_SPACE){
71052                                                 value = attrName;
71053                                         }
71054                                         if(s == S_ATTR_NOQUOT_VALUE){
71055                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71056                                                 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
71057                                         }else{
71058                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
71059                                                         errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
71060                                                 }
71061                                                 el.add(value,value,start);
71062                                         }
71063                                         break;
71064                                 case S_EQ:
71065                                         throw new Error('attribute value missed!!');
71066                                 }
71067         //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
71068                                 return p;
71069                         /*xml space '\x20' | #x9 | #xD | #xA; */
71070                         case '\u0080':
71071                                 c = ' ';
71072                         default:
71073                                 if(c<= ' '){//space
71074                                         switch(s){
71075                                         case S_TAG:
71076                                                 el.setTagName(source.slice(start,p));//tagName
71077                                                 s = S_TAG_SPACE;
71078                                                 break;
71079                                         case S_ATTR:
71080                                                 attrName = source.slice(start,p);
71081                                                 s = S_ATTR_SPACE;
71082                                                 break;
71083                                         case S_ATTR_NOQUOT_VALUE:
71084                                                 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71085                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71086                                                 el.add(attrName,value,start);
71087                                         case S_ATTR_END:
71088                                                 s = S_TAG_SPACE;
71089                                                 break;
71090                                         //case S_TAG_SPACE:
71091                                         //case S_EQ:
71092                                         //case S_ATTR_SPACE:
71093                                         //      void();break;
71094                                         //case S_TAG_CLOSE:
71095                                                 //ignore warning
71096                                         }
71097                                 }else{//not space
71098         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
71099         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
71100                                         switch(s){
71101                                         //case S_TAG:void();break;
71102                                         //case S_ATTR:void();break;
71103                                         //case S_ATTR_NOQUOT_VALUE:void();break;
71104                                         case S_ATTR_SPACE:
71105                                                 var tagName =  el.tagName;
71106                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
71107                                                         errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
71108                                                 }
71109                                                 el.add(attrName,attrName,start);
71110                                                 start = p;
71111                                                 s = S_ATTR;
71112                                                 break;
71113                                         case S_ATTR_END:
71114                                                 errorHandler.warning('attribute space is required"'+attrName+'"!!');
71115                                         case S_TAG_SPACE:
71116                                                 s = S_ATTR;
71117                                                 start = p;
71118                                                 break;
71119                                         case S_EQ:
71120                                                 s = S_ATTR_NOQUOT_VALUE;
71121                                                 start = p;
71122                                                 break;
71123                                         case S_TAG_CLOSE:
71124                                                 throw new Error("elements closed character '/' and '>' must be connected to");
71125                                         }
71126                                 }
71127                         }//end outer switch
71128                         //console.log('p++',p)
71129                         p++;
71130                 }
71131         }
71132         /**
71133          * @return true if has new namespace define
71134          */
71135         function appendElement(el,domBuilder,currentNSMap){
71136                 var tagName = el.tagName;
71137                 var localNSMap = null;
71138                 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
71139                 var i = el.length;
71140                 while(i--){
71141                         var a = el[i];
71142                         var qName = a.qName;
71143                         var value = a.value;
71144                         var nsp = qName.indexOf(':');
71145                         if(nsp>0){
71146                                 var prefix = a.prefix = qName.slice(0,nsp);
71147                                 var localName = qName.slice(nsp+1);
71148                                 var nsPrefix = prefix === 'xmlns' && localName;
71149                         }else{
71150                                 localName = qName;
71151                                 prefix = null;
71152                                 nsPrefix = qName === 'xmlns' && '';
71153                         }
71154                         //can not set prefix,because prefix !== ''
71155                         a.localName = localName ;
71156                         //prefix == null for no ns prefix attribute 
71157                         if(nsPrefix !== false){//hack!!
71158                                 if(localNSMap == null){
71159                                         localNSMap = {};
71160                                         //console.log(currentNSMap,0)
71161                                         _copy(currentNSMap,currentNSMap={});
71162                                         //console.log(currentNSMap,1)
71163                                 }
71164                                 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
71165                                 a.uri = 'http://www.w3.org/2000/xmlns/';
71166                                 domBuilder.startPrefixMapping(nsPrefix, value); 
71167                         }
71168                 }
71169                 var i = el.length;
71170                 while(i--){
71171                         a = el[i];
71172                         var prefix = a.prefix;
71173                         if(prefix){//no prefix attribute has no namespace
71174                                 if(prefix === 'xml'){
71175                                         a.uri = 'http://www.w3.org/XML/1998/namespace';
71176                                 }if(prefix !== 'xmlns'){
71177                                         a.uri = currentNSMap[prefix || ''];
71178                                         
71179                                         //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
71180                                 }
71181                         }
71182                 }
71183                 var nsp = tagName.indexOf(':');
71184                 if(nsp>0){
71185                         prefix = el.prefix = tagName.slice(0,nsp);
71186                         localName = el.localName = tagName.slice(nsp+1);
71187                 }else{
71188                         prefix = null;//important!!
71189                         localName = el.localName = tagName;
71190                 }
71191                 //no prefix element has default namespace
71192                 var ns = el.uri = currentNSMap[prefix || ''];
71193                 domBuilder.startElement(ns,localName,tagName,el);
71194                 //endPrefixMapping and startPrefixMapping have not any help for dom builder
71195                 //localNSMap = null
71196                 if(el.closed){
71197                         domBuilder.endElement(ns,localName,tagName);
71198                         if(localNSMap){
71199                                 for(prefix in localNSMap){
71200                                         domBuilder.endPrefixMapping(prefix); 
71201                                 }
71202                         }
71203                 }else{
71204                         el.currentNSMap = currentNSMap;
71205                         el.localNSMap = localNSMap;
71206                         //parseStack.push(el);
71207                         return true;
71208                 }
71209         }
71210         function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
71211                 if(/^(?:script|textarea)$/i.test(tagName)){
71212                         var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
71213                         var text = source.substring(elStartEnd+1,elEndStart);
71214                         if(/[&<]/.test(text)){
71215                                 if(/^script$/i.test(tagName)){
71216                                         //if(!/\]\]>/.test(text)){
71217                                                 //lexHandler.startCDATA();
71218                                                 domBuilder.characters(text,0,text.length);
71219                                                 //lexHandler.endCDATA();
71220                                                 return elEndStart;
71221                                         //}
71222                                 }//}else{//text area
71223                                         text = text.replace(/&#?\w+;/g,entityReplacer);
71224                                         domBuilder.characters(text,0,text.length);
71225                                         return elEndStart;
71226                                 //}
71227                                 
71228                         }
71229                 }
71230                 return elStartEnd+1;
71231         }
71232         function fixSelfClosed(source,elStartEnd,tagName,closeMap){
71233                 //if(tagName in closeMap){
71234                 var pos = closeMap[tagName];
71235                 if(pos == null){
71236                         //console.log(tagName)
71237                         pos =  source.lastIndexOf('</'+tagName+'>');
71238                         if(pos<elStartEnd){//忘记闭合
71239                                 pos = source.lastIndexOf('</'+tagName);
71240                         }
71241                         closeMap[tagName] =pos;
71242                 }
71243                 return pos<elStartEnd;
71244                 //} 
71245         }
71246         function _copy(source,target){
71247                 for(var n in source){target[n] = source[n];}
71248         }
71249         function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
71250                 var next= source.charAt(start+2);
71251                 switch(next){
71252                 case '-':
71253                         if(source.charAt(start + 3) === '-'){
71254                                 var end = source.indexOf('-->',start+4);
71255                                 //append comment source.substring(4,end)//<!--
71256                                 if(end>start){
71257                                         domBuilder.comment(source,start+4,end-start-4);
71258                                         return end+3;
71259                                 }else{
71260                                         errorHandler.error("Unclosed comment");
71261                                         return -1;
71262                                 }
71263                         }else{
71264                                 //error
71265                                 return -1;
71266                         }
71267                 default:
71268                         if(source.substr(start+3,6) == 'CDATA['){
71269                                 var end = source.indexOf(']]>',start+9);
71270                                 domBuilder.startCDATA();
71271                                 domBuilder.characters(source,start+9,end-start-9);
71272                                 domBuilder.endCDATA(); 
71273                                 return end+3;
71274                         }
71275                         //<!DOCTYPE
71276                         //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
71277                         var matchs = split(source,start);
71278                         var len = matchs.length;
71279                         if(len>1 && /!doctype/i.test(matchs[0][0])){
71280                                 var name = matchs[1][0];
71281                                 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
71282                                 var sysid = len>4 && matchs[4][0];
71283                                 var lastMatch = matchs[len-1];
71284                                 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
71285                                                 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
71286                                 domBuilder.endDTD();
71287                                 
71288                                 return lastMatch.index+lastMatch[0].length
71289                         }
71290                 }
71291                 return -1;
71292         }
71293
71294
71295
71296         function parseInstruction(source,start,domBuilder){
71297                 var end = source.indexOf('?>',start);
71298                 if(end){
71299                         var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
71300                         if(match){
71301                                 var len = match[0].length;
71302                                 domBuilder.processingInstruction(match[1], match[2]) ;
71303                                 return end+2;
71304                         }else{//error
71305                                 return -1;
71306                         }
71307                 }
71308                 return -1;
71309         }
71310
71311         /**
71312          * @param source
71313          */
71314         function ElementAttributes(source){
71315                 
71316         }
71317         ElementAttributes.prototype = {
71318                 setTagName:function(tagName){
71319                         if(!tagNamePattern.test(tagName)){
71320                                 throw new Error('invalid tagName:'+tagName)
71321                         }
71322                         this.tagName = tagName;
71323                 },
71324                 add:function(qName,value,offset){
71325                         if(!tagNamePattern.test(qName)){
71326                                 throw new Error('invalid attribute:'+qName)
71327                         }
71328                         this[this.length++] = {qName:qName,value:value,offset:offset};
71329                 },
71330                 length:0,
71331                 getLocalName:function(i){return this[i].localName},
71332                 getLocator:function(i){return this[i].locator},
71333                 getQName:function(i){return this[i].qName},
71334                 getURI:function(i){return this[i].uri},
71335                 getValue:function(i){return this[i].value}
71336         //      ,getIndex:function(uri, localName)){
71337         //              if(localName){
71338         //                      
71339         //              }else{
71340         //                      var qName = uri
71341         //              }
71342         //      },
71343         //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
71344         //      getType:function(uri,localName){}
71345         //      getType:function(i){},
71346         };
71347
71348
71349
71350
71351         function _set_proto_(thiz,parent){
71352                 thiz.__proto__ = parent;
71353                 return thiz;
71354         }
71355         if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
71356                 _set_proto_ = function(thiz,parent){
71357                         function p(){}          p.prototype = parent;
71358                         p = new p();
71359                         for(parent in thiz){
71360                                 p[parent] = thiz[parent];
71361                         }
71362                         return p;
71363                 };
71364         }
71365
71366         function split(source,start){
71367                 var match;
71368                 var buf = [];
71369                 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
71370                 reg.lastIndex = start;
71371                 reg.exec(source);//skip <
71372                 while(match = reg.exec(source)){
71373                         buf.push(match);
71374                         if(match[1])return buf;
71375                 }
71376         }
71377
71378         var XMLReader_1 = XMLReader;
71379
71380         var sax = {
71381                 XMLReader: XMLReader_1
71382         };
71383
71384         /*
71385          * DOM Level 2
71386          * Object DOMException
71387          * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
71388          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
71389          */
71390
71391         function copy$3(src,dest){
71392                 for(var p in src){
71393                         dest[p] = src[p];
71394                 }
71395         }
71396         /**
71397         ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
71398         ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
71399          */
71400         function _extends(Class,Super){
71401                 var pt = Class.prototype;
71402                 if(Object.create){
71403                         var ppt = Object.create(Super.prototype);
71404                         pt.__proto__ = ppt;
71405                 }
71406                 if(!(pt instanceof Super)){
71407                         function t(){}          t.prototype = Super.prototype;
71408                         t = new t();
71409                         copy$3(pt,t);
71410                         Class.prototype = pt = t;
71411                 }
71412                 if(pt.constructor != Class){
71413                         if(typeof Class != 'function'){
71414                                 console.error("unknow Class:"+Class);
71415                         }
71416                         pt.constructor = Class;
71417                 }
71418         }
71419         var htmlns = 'http://www.w3.org/1999/xhtml' ;
71420         // Node Types
71421         var NodeType = {};
71422         var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
71423         var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
71424         var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
71425         var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
71426         var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
71427         var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
71428         var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
71429         var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
71430         var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
71431         var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
71432         var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
71433         var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
71434
71435         // ExceptionCode
71436         var ExceptionCode = {};
71437         var ExceptionMessage = {};
71438         var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
71439         var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
71440         var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
71441         var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
71442         var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
71443         var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
71444         var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
71445         var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
71446         var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
71447         var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
71448         //level2
71449         var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
71450         var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
71451         var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
71452         var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
71453         var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
71454
71455
71456         function DOMException$2(code, message) {
71457                 if(message instanceof Error){
71458                         var error = message;
71459                 }else{
71460                         error = this;
71461                         Error.call(this, ExceptionMessage[code]);
71462                         this.message = ExceptionMessage[code];
71463                         if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
71464                 }
71465                 error.code = code;
71466                 if(message) this.message = this.message + ": " + message;
71467                 return error;
71468         }DOMException$2.prototype = Error.prototype;
71469         copy$3(ExceptionCode,DOMException$2);
71470         /**
71471          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
71472          * 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.
71473          * The items in the NodeList are accessible via an integral index, starting from 0.
71474          */
71475         function NodeList() {
71476         }NodeList.prototype = {
71477                 /**
71478                  * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
71479                  * @standard level1
71480                  */
71481                 length:0, 
71482                 /**
71483                  * 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.
71484                  * @standard level1
71485                  * @param index  unsigned long 
71486                  *   Index into the collection.
71487                  * @return Node
71488                  *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
71489                  */
71490                 item: function(index) {
71491                         return this[index] || null;
71492                 },
71493                 toString:function(isHTML,nodeFilter){
71494                         for(var buf = [], i = 0;i<this.length;i++){
71495                                 serializeToString(this[i],buf,isHTML,nodeFilter);
71496                         }
71497                         return buf.join('');
71498                 }
71499         };
71500         function LiveNodeList(node,refresh){
71501                 this._node = node;
71502                 this._refresh = refresh;
71503                 _updateLiveList(this);
71504         }
71505         function _updateLiveList(list){
71506                 var inc = list._node._inc || list._node.ownerDocument._inc;
71507                 if(list._inc != inc){
71508                         var ls = list._refresh(list._node);
71509                         //console.log(ls.length)
71510                         __set__(list,'length',ls.length);
71511                         copy$3(ls,list);
71512                         list._inc = inc;
71513                 }
71514         }
71515         LiveNodeList.prototype.item = function(i){
71516                 _updateLiveList(this);
71517                 return this[i];
71518         };
71519
71520         _extends(LiveNodeList,NodeList);
71521         /**
71522          * 
71523          * 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.
71524          * NamedNodeMap objects in the DOM are live.
71525          * used for attributes or DocumentType entities 
71526          */
71527         function NamedNodeMap() {
71528         }
71529         function _findNodeIndex(list,node){
71530                 var i = list.length;
71531                 while(i--){
71532                         if(list[i] === node){return i}
71533                 }
71534         }
71535
71536         function _addNamedNode(el,list,newAttr,oldAttr){
71537                 if(oldAttr){
71538                         list[_findNodeIndex(list,oldAttr)] = newAttr;
71539                 }else{
71540                         list[list.length++] = newAttr;
71541                 }
71542                 if(el){
71543                         newAttr.ownerElement = el;
71544                         var doc = el.ownerDocument;
71545                         if(doc){
71546                                 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
71547                                 _onAddAttribute(doc,el,newAttr);
71548                         }
71549                 }
71550         }
71551         function _removeNamedNode(el,list,attr){
71552                 //console.log('remove attr:'+attr)
71553                 var i = _findNodeIndex(list,attr);
71554                 if(i>=0){
71555                         var lastIndex = list.length-1;
71556                         while(i<lastIndex){
71557                                 list[i] = list[++i];
71558                         }
71559                         list.length = lastIndex;
71560                         if(el){
71561                                 var doc = el.ownerDocument;
71562                                 if(doc){
71563                                         _onRemoveAttribute(doc,el,attr);
71564                                         attr.ownerElement = null;
71565                                 }
71566                         }
71567                 }else{
71568                         throw DOMException$2(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
71569                 }
71570         }
71571         NamedNodeMap.prototype = {
71572                 length:0,
71573                 item:NodeList.prototype.item,
71574                 getNamedItem: function(key) {
71575         //              if(key.indexOf(':')>0 || key == 'xmlns'){
71576         //                      return null;
71577         //              }
71578                         //console.log()
71579                         var i = this.length;
71580                         while(i--){
71581                                 var attr = this[i];
71582                                 //console.log(attr.nodeName,key)
71583                                 if(attr.nodeName == key){
71584                                         return attr;
71585                                 }
71586                         }
71587                 },
71588                 setNamedItem: function(attr) {
71589                         var el = attr.ownerElement;
71590                         if(el && el!=this._ownerElement){
71591                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71592                         }
71593                         var oldAttr = this.getNamedItem(attr.nodeName);
71594                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71595                         return oldAttr;
71596                 },
71597                 /* returns Node */
71598                 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
71599                         var el = attr.ownerElement, oldAttr;
71600                         if(el && el!=this._ownerElement){
71601                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71602                         }
71603                         oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
71604                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71605                         return oldAttr;
71606                 },
71607
71608                 /* returns Node */
71609                 removeNamedItem: function(key) {
71610                         var attr = this.getNamedItem(key);
71611                         _removeNamedNode(this._ownerElement,this,attr);
71612                         return attr;
71613                         
71614                         
71615                 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
71616                 
71617                 //for level2
71618                 removeNamedItemNS:function(namespaceURI,localName){
71619                         var attr = this.getNamedItemNS(namespaceURI,localName);
71620                         _removeNamedNode(this._ownerElement,this,attr);
71621                         return attr;
71622                 },
71623                 getNamedItemNS: function(namespaceURI, localName) {
71624                         var i = this.length;
71625                         while(i--){
71626                                 var node = this[i];
71627                                 if(node.localName == localName && node.namespaceURI == namespaceURI){
71628                                         return node;
71629                                 }
71630                         }
71631                         return null;
71632                 }
71633         };
71634         /**
71635          * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
71636          */
71637         function DOMImplementation(/* Object */ features) {
71638                 this._features = {};
71639                 if (features) {
71640                         for (var feature in features) {
71641                                  this._features = features[feature];
71642                         }
71643                 }
71644         }
71645         DOMImplementation.prototype = {
71646                 hasFeature: function(/* string */ feature, /* string */ version) {
71647                         var versions = this._features[feature.toLowerCase()];
71648                         if (versions && (!version || version in versions)) {
71649                                 return true;
71650                         } else {
71651                                 return false;
71652                         }
71653                 },
71654                 // Introduced in DOM Level 2:
71655                 createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
71656                         var doc = new Document();
71657                         doc.implementation = this;
71658                         doc.childNodes = new NodeList();
71659                         doc.doctype = doctype;
71660                         if(doctype){
71661                                 doc.appendChild(doctype);
71662                         }
71663                         if(qualifiedName){
71664                                 var root = doc.createElementNS(namespaceURI,qualifiedName);
71665                                 doc.appendChild(root);
71666                         }
71667                         return doc;
71668                 },
71669                 // Introduced in DOM Level 2:
71670                 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
71671                         var node = new DocumentType();
71672                         node.name = qualifiedName;
71673                         node.nodeName = qualifiedName;
71674                         node.publicId = publicId;
71675                         node.systemId = systemId;
71676                         // Introduced in DOM Level 2:
71677                         //readonly attribute DOMString        internalSubset;
71678                         
71679                         //TODO:..
71680                         //  readonly attribute NamedNodeMap     entities;
71681                         //  readonly attribute NamedNodeMap     notations;
71682                         return node;
71683                 }
71684         };
71685
71686
71687         /**
71688          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
71689          */
71690
71691         function Node$2() {
71692         }
71693         Node$2.prototype = {
71694                 firstChild : null,
71695                 lastChild : null,
71696                 previousSibling : null,
71697                 nextSibling : null,
71698                 attributes : null,
71699                 parentNode : null,
71700                 childNodes : null,
71701                 ownerDocument : null,
71702                 nodeValue : null,
71703                 namespaceURI : null,
71704                 prefix : null,
71705                 localName : null,
71706                 // Modified in DOM Level 2:
71707                 insertBefore:function(newChild, refChild){//raises 
71708                         return _insertBefore(this,newChild,refChild);
71709                 },
71710                 replaceChild:function(newChild, oldChild){//raises 
71711                         this.insertBefore(newChild,oldChild);
71712                         if(oldChild){
71713                                 this.removeChild(oldChild);
71714                         }
71715                 },
71716                 removeChild:function(oldChild){
71717                         return _removeChild(this,oldChild);
71718                 },
71719                 appendChild:function(newChild){
71720                         return this.insertBefore(newChild,null);
71721                 },
71722                 hasChildNodes:function(){
71723                         return this.firstChild != null;
71724                 },
71725                 cloneNode:function(deep){
71726                         return cloneNode(this.ownerDocument||this,this,deep);
71727                 },
71728                 // Modified in DOM Level 2:
71729                 normalize:function(){
71730                         var child = this.firstChild;
71731                         while(child){
71732                                 var next = child.nextSibling;
71733                                 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
71734                                         this.removeChild(next);
71735                                         child.appendData(next.data);
71736                                 }else{
71737                                         child.normalize();
71738                                         child = next;
71739                                 }
71740                         }
71741                 },
71742                 // Introduced in DOM Level 2:
71743                 isSupported:function(feature, version){
71744                         return this.ownerDocument.implementation.hasFeature(feature,version);
71745                 },
71746             // Introduced in DOM Level 2:
71747             hasAttributes:function(){
71748                 return this.attributes.length>0;
71749             },
71750             lookupPrefix:function(namespaceURI){
71751                 var el = this;
71752                 while(el){
71753                         var map = el._nsMap;
71754                         //console.dir(map)
71755                         if(map){
71756                                 for(var n in map){
71757                                         if(map[n] == namespaceURI){
71758                                                 return n;
71759                                         }
71760                                 }
71761                         }
71762                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71763                 }
71764                 return null;
71765             },
71766             // Introduced in DOM Level 3:
71767             lookupNamespaceURI:function(prefix){
71768                 var el = this;
71769                 while(el){
71770                         var map = el._nsMap;
71771                         //console.dir(map)
71772                         if(map){
71773                                 if(prefix in map){
71774                                         return map[prefix] ;
71775                                 }
71776                         }
71777                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71778                 }
71779                 return null;
71780             },
71781             // Introduced in DOM Level 3:
71782             isDefaultNamespace:function(namespaceURI){
71783                 var prefix = this.lookupPrefix(namespaceURI);
71784                 return prefix == null;
71785             }
71786         };
71787
71788
71789         function _xmlEncoder(c){
71790                 return c == '<' && '&lt;' ||
71791                  c == '>' && '&gt;' ||
71792                  c == '&' && '&amp;' ||
71793                  c == '"' && '&quot;' ||
71794                  '&#'+c.charCodeAt()+';'
71795         }
71796
71797
71798         copy$3(NodeType,Node$2);
71799         copy$3(NodeType,Node$2.prototype);
71800
71801         /**
71802          * @param callback return true for continue,false for break
71803          * @return boolean true: break visit;
71804          */
71805         function _visitNode(node,callback){
71806                 if(callback(node)){
71807                         return true;
71808                 }
71809                 if(node = node.firstChild){
71810                         do{
71811                                 if(_visitNode(node,callback)){return true}
71812                 }while(node=node.nextSibling)
71813             }
71814         }
71815
71816
71817
71818         function Document(){
71819         }
71820         function _onAddAttribute(doc,el,newAttr){
71821                 doc && doc._inc++;
71822                 var ns = newAttr.namespaceURI ;
71823                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71824                         //update namespace
71825                         el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
71826                 }
71827         }
71828         function _onRemoveAttribute(doc,el,newAttr,remove){
71829                 doc && doc._inc++;
71830                 var ns = newAttr.namespaceURI ;
71831                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71832                         //update namespace
71833                         delete el._nsMap[newAttr.prefix?newAttr.localName:''];
71834                 }
71835         }
71836         function _onUpdateChild(doc,el,newChild){
71837                 if(doc && doc._inc){
71838                         doc._inc++;
71839                         //update childNodes
71840                         var cs = el.childNodes;
71841                         if(newChild){
71842                                 cs[cs.length++] = newChild;
71843                         }else{
71844                                 //console.log(1)
71845                                 var child = el.firstChild;
71846                                 var i = 0;
71847                                 while(child){
71848                                         cs[i++] = child;
71849                                         child =child.nextSibling;
71850                                 }
71851                                 cs.length = i;
71852                         }
71853                 }
71854         }
71855
71856         /**
71857          * attributes;
71858          * children;
71859          * 
71860          * writeable properties:
71861          * nodeValue,Attr:value,CharacterData:data
71862          * prefix
71863          */
71864         function _removeChild(parentNode,child){
71865                 var previous = child.previousSibling;
71866                 var next = child.nextSibling;
71867                 if(previous){
71868                         previous.nextSibling = next;
71869                 }else{
71870                         parentNode.firstChild = next;
71871                 }
71872                 if(next){
71873                         next.previousSibling = previous;
71874                 }else{
71875                         parentNode.lastChild = previous;
71876                 }
71877                 _onUpdateChild(parentNode.ownerDocument,parentNode);
71878                 return child;
71879         }
71880         /**
71881          * preformance key(refChild == null)
71882          */
71883         function _insertBefore(parentNode,newChild,nextChild){
71884                 var cp = newChild.parentNode;
71885                 if(cp){
71886                         cp.removeChild(newChild);//remove and update
71887                 }
71888                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71889                         var newFirst = newChild.firstChild;
71890                         if (newFirst == null) {
71891                                 return newChild;
71892                         }
71893                         var newLast = newChild.lastChild;
71894                 }else{
71895                         newFirst = newLast = newChild;
71896                 }
71897                 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
71898
71899                 newFirst.previousSibling = pre;
71900                 newLast.nextSibling = nextChild;
71901                 
71902                 
71903                 if(pre){
71904                         pre.nextSibling = newFirst;
71905                 }else{
71906                         parentNode.firstChild = newFirst;
71907                 }
71908                 if(nextChild == null){
71909                         parentNode.lastChild = newLast;
71910                 }else{
71911                         nextChild.previousSibling = newLast;
71912                 }
71913                 do{
71914                         newFirst.parentNode = parentNode;
71915                 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
71916                 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
71917                 //console.log(parentNode.lastChild.nextSibling == null)
71918                 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
71919                         newChild.firstChild = newChild.lastChild = null;
71920                 }
71921                 return newChild;
71922         }
71923         function _appendSingleChild(parentNode,newChild){
71924                 var cp = newChild.parentNode;
71925                 if(cp){
71926                         var pre = parentNode.lastChild;
71927                         cp.removeChild(newChild);//remove and update
71928                         var pre = parentNode.lastChild;
71929                 }
71930                 var pre = parentNode.lastChild;
71931                 newChild.parentNode = parentNode;
71932                 newChild.previousSibling = pre;
71933                 newChild.nextSibling = null;
71934                 if(pre){
71935                         pre.nextSibling = newChild;
71936                 }else{
71937                         parentNode.firstChild = newChild;
71938                 }
71939                 parentNode.lastChild = newChild;
71940                 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
71941                 return newChild;
71942                 //console.log("__aa",parentNode.lastChild.nextSibling == null)
71943         }
71944         Document.prototype = {
71945                 //implementation : null,
71946                 nodeName :  '#document',
71947                 nodeType :  DOCUMENT_NODE,
71948                 doctype :  null,
71949                 documentElement :  null,
71950                 _inc : 1,
71951                 
71952                 insertBefore :  function(newChild, refChild){//raises 
71953                         if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
71954                                 var child = newChild.firstChild;
71955                                 while(child){
71956                                         var next = child.nextSibling;
71957                                         this.insertBefore(child,refChild);
71958                                         child = next;
71959                                 }
71960                                 return newChild;
71961                         }
71962                         if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
71963                                 this.documentElement = newChild;
71964                         }
71965                         
71966                         return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
71967                 },
71968                 removeChild :  function(oldChild){
71969                         if(this.documentElement == oldChild){
71970                                 this.documentElement = null;
71971                         }
71972                         return _removeChild(this,oldChild);
71973                 },
71974                 // Introduced in DOM Level 2:
71975                 importNode : function(importedNode,deep){
71976                         return importNode(this,importedNode,deep);
71977                 },
71978                 // Introduced in DOM Level 2:
71979                 getElementById :        function(id){
71980                         var rtv = null;
71981                         _visitNode(this.documentElement,function(node){
71982                                 if(node.nodeType == ELEMENT_NODE){
71983                                         if(node.getAttribute('id') == id){
71984                                                 rtv = node;
71985                                                 return true;
71986                                         }
71987                                 }
71988                         });
71989                         return rtv;
71990                 },
71991                 
71992                 //document factory method:
71993                 createElement : function(tagName){
71994                         var node = new Element();
71995                         node.ownerDocument = this;
71996                         node.nodeName = tagName;
71997                         node.tagName = tagName;
71998                         node.childNodes = new NodeList();
71999                         var attrs       = node.attributes = new NamedNodeMap();
72000                         attrs._ownerElement = node;
72001                         return node;
72002                 },
72003                 createDocumentFragment :        function(){
72004                         var node = new DocumentFragment();
72005                         node.ownerDocument = this;
72006                         node.childNodes = new NodeList();
72007                         return node;
72008                 },
72009                 createTextNode :        function(data){
72010                         var node = new Text();
72011                         node.ownerDocument = this;
72012                         node.appendData(data);
72013                         return node;
72014                 },
72015                 createComment : function(data){
72016                         var node = new Comment();
72017                         node.ownerDocument = this;
72018                         node.appendData(data);
72019                         return node;
72020                 },
72021                 createCDATASection :    function(data){
72022                         var node = new CDATASection();
72023                         node.ownerDocument = this;
72024                         node.appendData(data);
72025                         return node;
72026                 },
72027                 createProcessingInstruction :   function(target,data){
72028                         var node = new ProcessingInstruction();
72029                         node.ownerDocument = this;
72030                         node.tagName = node.target = target;
72031                         node.nodeValue= node.data = data;
72032                         return node;
72033                 },
72034                 createAttribute :       function(name){
72035                         var node = new Attr();
72036                         node.ownerDocument      = this;
72037                         node.name = name;
72038                         node.nodeName   = name;
72039                         node.localName = name;
72040                         node.specified = true;
72041                         return node;
72042                 },
72043                 createEntityReference : function(name){
72044                         var node = new EntityReference();
72045                         node.ownerDocument      = this;
72046                         node.nodeName   = name;
72047                         return node;
72048                 },
72049                 // Introduced in DOM Level 2:
72050                 createElementNS :       function(namespaceURI,qualifiedName){
72051                         var node = new Element();
72052                         var pl = qualifiedName.split(':');
72053                         var attrs       = node.attributes = new NamedNodeMap();
72054                         node.childNodes = new NodeList();
72055                         node.ownerDocument = this;
72056                         node.nodeName = qualifiedName;
72057                         node.tagName = qualifiedName;
72058                         node.namespaceURI = namespaceURI;
72059                         if(pl.length == 2){
72060                                 node.prefix = pl[0];
72061                                 node.localName = pl[1];
72062                         }else{
72063                                 //el.prefix = null;
72064                                 node.localName = qualifiedName;
72065                         }
72066                         attrs._ownerElement = node;
72067                         return node;
72068                 },
72069                 // Introduced in DOM Level 2:
72070                 createAttributeNS :     function(namespaceURI,qualifiedName){
72071                         var node = new Attr();
72072                         var pl = qualifiedName.split(':');
72073                         node.ownerDocument = this;
72074                         node.nodeName = qualifiedName;
72075                         node.name = qualifiedName;
72076                         node.namespaceURI = namespaceURI;
72077                         node.specified = true;
72078                         if(pl.length == 2){
72079                                 node.prefix = pl[0];
72080                                 node.localName = pl[1];
72081                         }else{
72082                                 //el.prefix = null;
72083                                 node.localName = qualifiedName;
72084                         }
72085                         return node;
72086                 }
72087         };
72088         _extends(Document,Node$2);
72089
72090
72091         function Element() {
72092                 this._nsMap = {};
72093         }Element.prototype = {
72094                 nodeType : ELEMENT_NODE,
72095                 hasAttribute : function(name){
72096                         return this.getAttributeNode(name)!=null;
72097                 },
72098                 getAttribute : function(name){
72099                         var attr = this.getAttributeNode(name);
72100                         return attr && attr.value || '';
72101                 },
72102                 getAttributeNode : function(name){
72103                         return this.attributes.getNamedItem(name);
72104                 },
72105                 setAttribute : function(name, value){
72106                         var attr = this.ownerDocument.createAttribute(name);
72107                         attr.value = attr.nodeValue = "" + value;
72108                         this.setAttributeNode(attr);
72109                 },
72110                 removeAttribute : function(name){
72111                         var attr = this.getAttributeNode(name);
72112                         attr && this.removeAttributeNode(attr);
72113                 },
72114                 
72115                 //four real opeartion method
72116                 appendChild:function(newChild){
72117                         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
72118                                 return this.insertBefore(newChild,null);
72119                         }else{
72120                                 return _appendSingleChild(this,newChild);
72121                         }
72122                 },
72123                 setAttributeNode : function(newAttr){
72124                         return this.attributes.setNamedItem(newAttr);
72125                 },
72126                 setAttributeNodeNS : function(newAttr){
72127                         return this.attributes.setNamedItemNS(newAttr);
72128                 },
72129                 removeAttributeNode : function(oldAttr){
72130                         //console.log(this == oldAttr.ownerElement)
72131                         return this.attributes.removeNamedItem(oldAttr.nodeName);
72132                 },
72133                 //get real attribute name,and remove it by removeAttributeNode
72134                 removeAttributeNS : function(namespaceURI, localName){
72135                         var old = this.getAttributeNodeNS(namespaceURI, localName);
72136                         old && this.removeAttributeNode(old);
72137                 },
72138                 
72139                 hasAttributeNS : function(namespaceURI, localName){
72140                         return this.getAttributeNodeNS(namespaceURI, localName)!=null;
72141                 },
72142                 getAttributeNS : function(namespaceURI, localName){
72143                         var attr = this.getAttributeNodeNS(namespaceURI, localName);
72144                         return attr && attr.value || '';
72145                 },
72146                 setAttributeNS : function(namespaceURI, qualifiedName, value){
72147                         var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
72148                         attr.value = attr.nodeValue = "" + value;
72149                         this.setAttributeNode(attr);
72150                 },
72151                 getAttributeNodeNS : function(namespaceURI, localName){
72152                         return this.attributes.getNamedItemNS(namespaceURI, localName);
72153                 },
72154                 
72155                 getElementsByTagName : function(tagName){
72156                         return new LiveNodeList(this,function(base){
72157                                 var ls = [];
72158                                 _visitNode(base,function(node){
72159                                         if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
72160                                                 ls.push(node);
72161                                         }
72162                                 });
72163                                 return ls;
72164                         });
72165                 },
72166                 getElementsByTagNameNS : function(namespaceURI, localName){
72167                         return new LiveNodeList(this,function(base){
72168                                 var ls = [];
72169                                 _visitNode(base,function(node){
72170                                         if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
72171                                                 ls.push(node);
72172                                         }
72173                                 });
72174                                 return ls;
72175                                 
72176                         });
72177                 }
72178         };
72179         Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
72180         Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
72181
72182
72183         _extends(Element,Node$2);
72184         function Attr() {
72185         }Attr.prototype.nodeType = ATTRIBUTE_NODE;
72186         _extends(Attr,Node$2);
72187
72188
72189         function CharacterData() {
72190         }CharacterData.prototype = {
72191                 data : '',
72192                 substringData : function(offset, count) {
72193                         return this.data.substring(offset, offset+count);
72194                 },
72195                 appendData: function(text) {
72196                         text = this.data+text;
72197                         this.nodeValue = this.data = text;
72198                         this.length = text.length;
72199                 },
72200                 insertData: function(offset,text) {
72201                         this.replaceData(offset,0,text);
72202                 
72203                 },
72204                 appendChild:function(newChild){
72205                         throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
72206                 },
72207                 deleteData: function(offset, count) {
72208                         this.replaceData(offset,count,"");
72209                 },
72210                 replaceData: function(offset, count, text) {
72211                         var start = this.data.substring(0,offset);
72212                         var end = this.data.substring(offset+count);
72213                         text = start + text + end;
72214                         this.nodeValue = this.data = text;
72215                         this.length = text.length;
72216                 }
72217         };
72218         _extends(CharacterData,Node$2);
72219         function Text() {
72220         }Text.prototype = {
72221                 nodeName : "#text",
72222                 nodeType : TEXT_NODE,
72223                 splitText : function(offset) {
72224                         var text = this.data;
72225                         var newText = text.substring(offset);
72226                         text = text.substring(0, offset);
72227                         this.data = this.nodeValue = text;
72228                         this.length = text.length;
72229                         var newNode = this.ownerDocument.createTextNode(newText);
72230                         if(this.parentNode){
72231                                 this.parentNode.insertBefore(newNode, this.nextSibling);
72232                         }
72233                         return newNode;
72234                 }
72235         };
72236         _extends(Text,CharacterData);
72237         function Comment() {
72238         }Comment.prototype = {
72239                 nodeName : "#comment",
72240                 nodeType : COMMENT_NODE
72241         };
72242         _extends(Comment,CharacterData);
72243
72244         function CDATASection() {
72245         }CDATASection.prototype = {
72246                 nodeName : "#cdata-section",
72247                 nodeType : CDATA_SECTION_NODE
72248         };
72249         _extends(CDATASection,CharacterData);
72250
72251
72252         function DocumentType() {
72253         }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
72254         _extends(DocumentType,Node$2);
72255
72256         function Notation() {
72257         }Notation.prototype.nodeType = NOTATION_NODE;
72258         _extends(Notation,Node$2);
72259
72260         function Entity() {
72261         }Entity.prototype.nodeType = ENTITY_NODE;
72262         _extends(Entity,Node$2);
72263
72264         function EntityReference() {
72265         }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
72266         _extends(EntityReference,Node$2);
72267
72268         function DocumentFragment() {
72269         }DocumentFragment.prototype.nodeName =  "#document-fragment";
72270         DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
72271         _extends(DocumentFragment,Node$2);
72272
72273
72274         function ProcessingInstruction() {
72275         }
72276         ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
72277         _extends(ProcessingInstruction,Node$2);
72278         function XMLSerializer$1(){}
72279         XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
72280                 return nodeSerializeToString.call(node,isHtml,nodeFilter);
72281         };
72282         Node$2.prototype.toString = nodeSerializeToString;
72283         function nodeSerializeToString(isHtml,nodeFilter){
72284                 var buf = [];
72285                 var refNode = this.nodeType == 9?this.documentElement:this;
72286                 var prefix = refNode.prefix;
72287                 var uri = refNode.namespaceURI;
72288                 
72289                 if(uri && prefix == null){
72290                         //console.log(prefix)
72291                         var prefix = refNode.lookupPrefix(uri);
72292                         if(prefix == null){
72293                                 //isHTML = true;
72294                                 var visibleNamespaces=[
72295                                 {namespace:uri,prefix:null}
72296                                 //{namespace:uri,prefix:''}
72297                                 ];
72298                         }
72299                 }
72300                 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
72301                 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
72302                 return buf.join('');
72303         }
72304         function needNamespaceDefine(node,isHTML, visibleNamespaces) {
72305                 var prefix = node.prefix||'';
72306                 var uri = node.namespaceURI;
72307                 if (!prefix && !uri){
72308                         return false;
72309                 }
72310                 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
72311                         || uri == 'http://www.w3.org/2000/xmlns/'){
72312                         return false;
72313                 }
72314                 
72315                 var i = visibleNamespaces.length; 
72316                 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
72317                 while (i--) {
72318                         var ns = visibleNamespaces[i];
72319                         // get namespace prefix
72320                         //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
72321                         if (ns.prefix == prefix){
72322                                 return ns.namespace != uri;
72323                         }
72324                 }
72325                 //console.log(isHTML,uri,prefix=='')
72326                 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
72327                 //      return false;
72328                 //}
72329                 //node.flag = '11111'
72330                 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
72331                 return true;
72332         }
72333         function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
72334                 if(nodeFilter){
72335                         node = nodeFilter(node);
72336                         if(node){
72337                                 if(typeof node == 'string'){
72338                                         buf.push(node);
72339                                         return;
72340                                 }
72341                         }else{
72342                                 return;
72343                         }
72344                         //buf.sort.apply(attrs, attributeSorter);
72345                 }
72346                 switch(node.nodeType){
72347                 case ELEMENT_NODE:
72348                         if (!visibleNamespaces) visibleNamespaces = [];
72349                         var startVisibleNamespaces = visibleNamespaces.length;
72350                         var attrs = node.attributes;
72351                         var len = attrs.length;
72352                         var child = node.firstChild;
72353                         var nodeName = node.tagName;
72354                         
72355                         isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
72356                         buf.push('<',nodeName);
72357                         
72358                         
72359                         
72360                         for(var i=0;i<len;i++){
72361                                 // add namespaces for attributes
72362                                 var attr = attrs.item(i);
72363                                 if (attr.prefix == 'xmlns') {
72364                                         visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
72365                                 }else if(attr.nodeName == 'xmlns'){
72366                                         visibleNamespaces.push({ prefix: '', namespace: attr.value });
72367                                 }
72368                         }
72369                         for(var i=0;i<len;i++){
72370                                 var attr = attrs.item(i);
72371                                 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
72372                                         var prefix = attr.prefix||'';
72373                                         var uri = attr.namespaceURI;
72374                                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72375                                         buf.push(ns, '="' , uri , '"');
72376                                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
72377                                 }
72378                                 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
72379                         }
72380                         // add namespace for current node               
72381                         if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
72382                                 var prefix = node.prefix||'';
72383                                 var uri = node.namespaceURI;
72384                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72385                                 buf.push(ns, '="' , uri , '"');
72386                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
72387                         }
72388                         
72389                         if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
72390                                 buf.push('>');
72391                                 //if is cdata child node
72392                                 if(isHTML && /^script$/i.test(nodeName)){
72393                                         while(child){
72394                                                 if(child.data){
72395                                                         buf.push(child.data);
72396                                                 }else{
72397                                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72398                                                 }
72399                                                 child = child.nextSibling;
72400                                         }
72401                                 }else
72402                                 {
72403                                         while(child){
72404                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72405                                                 child = child.nextSibling;
72406                                         }
72407                                 }
72408                                 buf.push('</',nodeName,'>');
72409                         }else{
72410                                 buf.push('/>');
72411                         }
72412                         // remove added visible namespaces
72413                         //visibleNamespaces.length = startVisibleNamespaces;
72414                         return;
72415                 case DOCUMENT_NODE:
72416                 case DOCUMENT_FRAGMENT_NODE:
72417                         var child = node.firstChild;
72418                         while(child){
72419                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72420                                 child = child.nextSibling;
72421                         }
72422                         return;
72423                 case ATTRIBUTE_NODE:
72424                         return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
72425                 case TEXT_NODE:
72426                         return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
72427                 case CDATA_SECTION_NODE:
72428                         return buf.push( '<![CDATA[',node.data,']]>');
72429                 case COMMENT_NODE:
72430                         return buf.push( "<!--",node.data,"-->");
72431                 case DOCUMENT_TYPE_NODE:
72432                         var pubid = node.publicId;
72433                         var sysid = node.systemId;
72434                         buf.push('<!DOCTYPE ',node.name);
72435                         if(pubid){
72436                                 buf.push(' PUBLIC "',pubid);
72437                                 if (sysid && sysid!='.') {
72438                                         buf.push( '" "',sysid);
72439                                 }
72440                                 buf.push('">');
72441                         }else if(sysid && sysid!='.'){
72442                                 buf.push(' SYSTEM "',sysid,'">');
72443                         }else{
72444                                 var sub = node.internalSubset;
72445                                 if(sub){
72446                                         buf.push(" [",sub,"]");
72447                                 }
72448                                 buf.push(">");
72449                         }
72450                         return;
72451                 case PROCESSING_INSTRUCTION_NODE:
72452                         return buf.push( "<?",node.target," ",node.data,"?>");
72453                 case ENTITY_REFERENCE_NODE:
72454                         return buf.push( '&',node.nodeName,';');
72455                 //case ENTITY_NODE:
72456                 //case NOTATION_NODE:
72457                 default:
72458                         buf.push('??',node.nodeName);
72459                 }
72460         }
72461         function importNode(doc,node,deep){
72462                 var node2;
72463                 switch (node.nodeType) {
72464                 case ELEMENT_NODE:
72465                         node2 = node.cloneNode(false);
72466                         node2.ownerDocument = doc;
72467                         //var attrs = node2.attributes;
72468                         //var len = attrs.length;
72469                         //for(var i=0;i<len;i++){
72470                                 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
72471                         //}
72472                 case DOCUMENT_FRAGMENT_NODE:
72473                         break;
72474                 case ATTRIBUTE_NODE:
72475                         deep = true;
72476                         break;
72477                 //case ENTITY_REFERENCE_NODE:
72478                 //case PROCESSING_INSTRUCTION_NODE:
72479                 ////case TEXT_NODE:
72480                 //case CDATA_SECTION_NODE:
72481                 //case COMMENT_NODE:
72482                 //      deep = false;
72483                 //      break;
72484                 //case DOCUMENT_NODE:
72485                 //case DOCUMENT_TYPE_NODE:
72486                 //cannot be imported.
72487                 //case ENTITY_NODE:
72488                 //case NOTATION_NODE:
72489                 //can not hit in level3
72490                 //default:throw e;
72491                 }
72492                 if(!node2){
72493                         node2 = node.cloneNode(false);//false
72494                 }
72495                 node2.ownerDocument = doc;
72496                 node2.parentNode = null;
72497                 if(deep){
72498                         var child = node.firstChild;
72499                         while(child){
72500                                 node2.appendChild(importNode(doc,child,deep));
72501                                 child = child.nextSibling;
72502                         }
72503                 }
72504                 return node2;
72505         }
72506         //
72507         //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
72508         //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
72509         function cloneNode(doc,node,deep){
72510                 var node2 = new node.constructor();
72511                 for(var n in node){
72512                         var v = node[n];
72513                         if(typeof v != 'object' ){
72514                                 if(v != node2[n]){
72515                                         node2[n] = v;
72516                                 }
72517                         }
72518                 }
72519                 if(node.childNodes){
72520                         node2.childNodes = new NodeList();
72521                 }
72522                 node2.ownerDocument = doc;
72523                 switch (node2.nodeType) {
72524                 case ELEMENT_NODE:
72525                         var attrs       = node.attributes;
72526                         var attrs2      = node2.attributes = new NamedNodeMap();
72527                         var len = attrs.length;
72528                         attrs2._ownerElement = node2;
72529                         for(var i=0;i<len;i++){
72530                                 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
72531                         }
72532                         break;
72533                 case ATTRIBUTE_NODE:
72534                         deep = true;
72535                 }
72536                 if(deep){
72537                         var child = node.firstChild;
72538                         while(child){
72539                                 node2.appendChild(cloneNode(doc,child,deep));
72540                                 child = child.nextSibling;
72541                         }
72542                 }
72543                 return node2;
72544         }
72545
72546         function __set__(object,key,value){
72547                 object[key] = value;
72548         }
72549         //do dynamic
72550         try{
72551                 if(Object.defineProperty){
72552                         Object.defineProperty(LiveNodeList.prototype,'length',{
72553                                 get:function(){
72554                                         _updateLiveList(this);
72555                                         return this.$$length;
72556                                 }
72557                         });
72558                         Object.defineProperty(Node$2.prototype,'textContent',{
72559                                 get:function(){
72560                                         return getTextContent(this);
72561                                 },
72562                                 set:function(data){
72563                                         switch(this.nodeType){
72564                                         case ELEMENT_NODE:
72565                                         case DOCUMENT_FRAGMENT_NODE:
72566                                                 while(this.firstChild){
72567                                                         this.removeChild(this.firstChild);
72568                                                 }
72569                                                 if(data || String(data)){
72570                                                         this.appendChild(this.ownerDocument.createTextNode(data));
72571                                                 }
72572                                                 break;
72573                                         default:
72574                                                 //TODO:
72575                                                 this.data = data;
72576                                                 this.value = data;
72577                                                 this.nodeValue = data;
72578                                         }
72579                                 }
72580                         });
72581                         
72582                         function getTextContent(node){
72583                                 switch(node.nodeType){
72584                                 case ELEMENT_NODE:
72585                                 case DOCUMENT_FRAGMENT_NODE:
72586                                         var buf = [];
72587                                         node = node.firstChild;
72588                                         while(node){
72589                                                 if(node.nodeType!==7 && node.nodeType !==8){
72590                                                         buf.push(getTextContent(node));
72591                                                 }
72592                                                 node = node.nextSibling;
72593                                         }
72594                                         return buf.join('');
72595                                 default:
72596                                         return node.nodeValue;
72597                                 }
72598                         }
72599                         __set__ = function(object,key,value){
72600                                 //console.log(value)
72601                                 object['$$'+key] = value;
72602                         };
72603                 }
72604         }catch(e){//ie8
72605         }
72606
72607         //if(typeof require == 'function'){
72608                 var DOMImplementation_1 = DOMImplementation;
72609                 var XMLSerializer_1 = XMLSerializer$1;
72610         //}
72611
72612         var dom = {
72613                 DOMImplementation: DOMImplementation_1,
72614                 XMLSerializer: XMLSerializer_1
72615         };
72616
72617         var domParser = createCommonjsModule(function (module, exports) {
72618         function DOMParser(options){
72619                 this.options = options ||{locator:{}};
72620                 
72621         }
72622         DOMParser.prototype.parseFromString = function(source,mimeType){
72623                 var options = this.options;
72624                 var sax =  new XMLReader();
72625                 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
72626                 var errorHandler = options.errorHandler;
72627                 var locator = options.locator;
72628                 var defaultNSMap = options.xmlns||{};
72629                 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
72630                 if(locator){
72631                         domBuilder.setDocumentLocator(locator);
72632                 }
72633                 
72634                 sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
72635                 sax.domBuilder = options.domBuilder || domBuilder;
72636                 if(/\/x?html?$/.test(mimeType)){
72637                         entityMap.nbsp = '\xa0';
72638                         entityMap.copy = '\xa9';
72639                         defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
72640                 }
72641                 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
72642                 if(source){
72643                         sax.parse(source,defaultNSMap,entityMap);
72644                 }else{
72645                         sax.errorHandler.error("invalid doc source");
72646                 }
72647                 return domBuilder.doc;
72648         };
72649         function buildErrorHandler(errorImpl,domBuilder,locator){
72650                 if(!errorImpl){
72651                         if(domBuilder instanceof DOMHandler){
72652                                 return domBuilder;
72653                         }
72654                         errorImpl = domBuilder ;
72655                 }
72656                 var errorHandler = {};
72657                 var isCallback = errorImpl instanceof Function;
72658                 locator = locator||{};
72659                 function build(key){
72660                         var fn = errorImpl[key];
72661                         if(!fn && isCallback){
72662                                 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
72663                         }
72664                         errorHandler[key] = fn && function(msg){
72665                                 fn('[xmldom '+key+']\t'+msg+_locator(locator));
72666                         }||function(){};
72667                 }
72668                 build('warning');
72669                 build('error');
72670                 build('fatalError');
72671                 return errorHandler;
72672         }
72673
72674         //console.log('#\n\n\n\n\n\n\n####')
72675         /**
72676          * +ContentHandler+ErrorHandler
72677          * +LexicalHandler+EntityResolver2
72678          * -DeclHandler-DTDHandler 
72679          * 
72680          * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
72681          * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
72682          * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
72683          */
72684         function DOMHandler() {
72685             this.cdata = false;
72686         }
72687         function position(locator,node){
72688                 node.lineNumber = locator.lineNumber;
72689                 node.columnNumber = locator.columnNumber;
72690         }
72691         /**
72692          * @see org.xml.sax.ContentHandler#startDocument
72693          * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
72694          */ 
72695         DOMHandler.prototype = {
72696                 startDocument : function() {
72697                 this.doc = new DOMImplementation().createDocument(null, null, null);
72698                 if (this.locator) {
72699                         this.doc.documentURI = this.locator.systemId;
72700                 }
72701                 },
72702                 startElement:function(namespaceURI, localName, qName, attrs) {
72703                         var doc = this.doc;
72704                     var el = doc.createElementNS(namespaceURI, qName||localName);
72705                     var len = attrs.length;
72706                     appendElement(this, el);
72707                     this.currentElement = el;
72708                     
72709                         this.locator && position(this.locator,el);
72710                     for (var i = 0 ; i < len; i++) {
72711                         var namespaceURI = attrs.getURI(i);
72712                         var value = attrs.getValue(i);
72713                         var qName = attrs.getQName(i);
72714                                 var attr = doc.createAttributeNS(namespaceURI, qName);
72715                                 this.locator &&position(attrs.getLocator(i),attr);
72716                                 attr.value = attr.nodeValue = value;
72717                                 el.setAttributeNode(attr);
72718                     }
72719                 },
72720                 endElement:function(namespaceURI, localName, qName) {
72721                         var current = this.currentElement;
72722                         var tagName = current.tagName;
72723                         this.currentElement = current.parentNode;
72724                 },
72725                 startPrefixMapping:function(prefix, uri) {
72726                 },
72727                 endPrefixMapping:function(prefix) {
72728                 },
72729                 processingInstruction:function(target, data) {
72730                     var ins = this.doc.createProcessingInstruction(target, data);
72731                     this.locator && position(this.locator,ins);
72732                     appendElement(this, ins);
72733                 },
72734                 ignorableWhitespace:function(ch, start, length) {
72735                 },
72736                 characters:function(chars, start, length) {
72737                         chars = _toString.apply(this,arguments);
72738                         //console.log(chars)
72739                         if(chars){
72740                                 if (this.cdata) {
72741                                         var charNode = this.doc.createCDATASection(chars);
72742                                 } else {
72743                                         var charNode = this.doc.createTextNode(chars);
72744                                 }
72745                                 if(this.currentElement){
72746                                         this.currentElement.appendChild(charNode);
72747                                 }else if(/^\s*$/.test(chars)){
72748                                         this.doc.appendChild(charNode);
72749                                         //process xml
72750                                 }
72751                                 this.locator && position(this.locator,charNode);
72752                         }
72753                 },
72754                 skippedEntity:function(name) {
72755                 },
72756                 endDocument:function() {
72757                         this.doc.normalize();
72758                 },
72759                 setDocumentLocator:function (locator) {
72760                     if(this.locator = locator){// && !('lineNumber' in locator)){
72761                         locator.lineNumber = 0;
72762                     }
72763                 },
72764                 //LexicalHandler
72765                 comment:function(chars, start, length) {
72766                         chars = _toString.apply(this,arguments);
72767                     var comm = this.doc.createComment(chars);
72768                     this.locator && position(this.locator,comm);
72769                     appendElement(this, comm);
72770                 },
72771                 
72772                 startCDATA:function() {
72773                     //used in characters() methods
72774                     this.cdata = true;
72775                 },
72776                 endCDATA:function() {
72777                     this.cdata = false;
72778                 },
72779                 
72780                 startDTD:function(name, publicId, systemId) {
72781                         var impl = this.doc.implementation;
72782                     if (impl && impl.createDocumentType) {
72783                         var dt = impl.createDocumentType(name, publicId, systemId);
72784                         this.locator && position(this.locator,dt);
72785                         appendElement(this, dt);
72786                     }
72787                 },
72788                 /**
72789                  * @see org.xml.sax.ErrorHandler
72790                  * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
72791                  */
72792                 warning:function(error) {
72793                         console.warn('[xmldom warning]\t'+error,_locator(this.locator));
72794                 },
72795                 error:function(error) {
72796                         console.error('[xmldom error]\t'+error,_locator(this.locator));
72797                 },
72798                 fatalError:function(error) {
72799                         console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
72800                     throw error;
72801                 }
72802         };
72803         function _locator(l){
72804                 if(l){
72805                         return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
72806                 }
72807         }
72808         function _toString(chars,start,length){
72809                 if(typeof chars == 'string'){
72810                         return chars.substr(start,length)
72811                 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
72812                         if(chars.length >= start+length || start){
72813                                 return new java.lang.String(chars,start,length)+'';
72814                         }
72815                         return chars;
72816                 }
72817         }
72818
72819         /*
72820          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
72821          * used method of org.xml.sax.ext.LexicalHandler:
72822          *  #comment(chars, start, length)
72823          *  #startCDATA()
72824          *  #endCDATA()
72825          *  #startDTD(name, publicId, systemId)
72826          *
72827          *
72828          * IGNORED method of org.xml.sax.ext.LexicalHandler:
72829          *  #endDTD()
72830          *  #startEntity(name)
72831          *  #endEntity(name)
72832          *
72833          *
72834          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
72835          * IGNORED method of org.xml.sax.ext.DeclHandler
72836          *      #attributeDecl(eName, aName, type, mode, value)
72837          *  #elementDecl(name, model)
72838          *  #externalEntityDecl(name, publicId, systemId)
72839          *  #internalEntityDecl(name, value)
72840          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
72841          * IGNORED method of org.xml.sax.EntityResolver2
72842          *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
72843          *  #resolveEntity(publicId, systemId)
72844          *  #getExternalSubset(name, baseURI)
72845          * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
72846          * IGNORED method of org.xml.sax.DTDHandler
72847          *  #notationDecl(name, publicId, systemId) {};
72848          *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
72849          */
72850         "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
72851                 DOMHandler.prototype[key] = function(){return null};
72852         });
72853
72854         /* 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 */
72855         function appendElement (hander,node) {
72856             if (!hander.currentElement) {
72857                 hander.doc.appendChild(node);
72858             } else {
72859                 hander.currentElement.appendChild(node);
72860             }
72861         }//appendChild and setAttributeNS are preformance key
72862
72863         //if(typeof require == 'function'){
72864                 var XMLReader = sax.XMLReader;
72865                 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
72866                 exports.XMLSerializer = dom.XMLSerializer ;
72867                 exports.DOMParser = DOMParser;
72868         //}
72869         });
72870         var domParser_1 = domParser.DOMImplementation;
72871         var domParser_2 = domParser.XMLSerializer;
72872         var domParser_3 = domParser.DOMParser;
72873
72874         var togeojson = createCommonjsModule(function (module, exports) {
72875         var toGeoJSON = (function() {
72876
72877             var removeSpace = /\s*/g,
72878                 trimSpace = /^\s*|\s*$/g,
72879                 splitSpace = /\s+/;
72880             // generate a short, numeric hash of a string
72881             function okhash(x) {
72882                 if (!x || !x.length) return 0;
72883                 for (var i = 0, h = 0; i < x.length; i++) {
72884                     h = ((h << 5) - h) + x.charCodeAt(i) | 0;
72885                 } return h;
72886             }
72887             // all Y children of X
72888             function get(x, y) { return x.getElementsByTagName(y); }
72889             function attr(x, y) { return x.getAttribute(y); }
72890             function attrf(x, y) { return parseFloat(attr(x, y)); }
72891             // one Y child of X, if any, otherwise null
72892             function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
72893             // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
72894             function norm(el) { if (el.normalize) { el.normalize(); } return el; }
72895             // cast array x into numbers
72896             function numarray(x) {
72897                 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
72898                 return o;
72899             }
72900             // get the content of a text node, if any
72901             function nodeVal(x) {
72902                 if (x) { norm(x); }
72903                 return (x && x.textContent) || '';
72904             }
72905             // get the contents of multiple text nodes, if present
72906             function getMulti(x, ys) {
72907                 var o = {}, n, k;
72908                 for (k = 0; k < ys.length; k++) {
72909                     n = get1(x, ys[k]);
72910                     if (n) o[ys[k]] = nodeVal(n);
72911                 }
72912                 return o;
72913             }
72914             // add properties of Y to X, overwriting if present in both
72915             function extend(x, y) { for (var k in y) x[k] = y[k]; }
72916             // get one coordinate from a coordinate array, if any
72917             function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
72918             // get all coordinates from a coordinate array as [[],[]]
72919             function coord(v) {
72920                 var coords = v.replace(trimSpace, '').split(splitSpace),
72921                     o = [];
72922                 for (var i = 0; i < coords.length; i++) {
72923                     o.push(coord1(coords[i]));
72924                 }
72925                 return o;
72926             }
72927             function coordPair(x) {
72928                 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
72929                     ele = get1(x, 'ele'),
72930                     // handle namespaced attribute in browser
72931                     heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
72932                     time = get1(x, 'time'),
72933                     e;
72934                 if (ele) {
72935                     e = parseFloat(nodeVal(ele));
72936                     if (!isNaN(e)) {
72937                         ll.push(e);
72938                     }
72939                 }
72940                 return {
72941                     coordinates: ll,
72942                     time: time ? nodeVal(time) : null,
72943                     heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
72944                 };
72945             }
72946
72947             // create a new feature collection parent object
72948             function fc() {
72949                 return {
72950                     type: 'FeatureCollection',
72951                     features: []
72952                 };
72953             }
72954
72955             var serializer;
72956             if (typeof XMLSerializer !== 'undefined') {
72957                 /* istanbul ignore next */
72958                 serializer = new XMLSerializer();
72959             // only require xmldom in a node environment
72960             } else if (typeof process === 'object' && !process.browser) {
72961                 serializer = new (domParser.XMLSerializer)();
72962             }
72963             function xml2str(str) {
72964                 // IE9 will create a new XMLSerializer but it'll crash immediately.
72965                 // This line is ignored because we don't run coverage tests in IE9
72966                 /* istanbul ignore next */
72967                 if (str.xml !== undefined) return str.xml;
72968                 return serializer.serializeToString(str);
72969             }
72970
72971             var t = {
72972                 kml: function(doc) {
72973
72974                     var gj = fc(),
72975                         // styleindex keeps track of hashed styles in order to match features
72976                         styleIndex = {}, styleByHash = {},
72977                         // stylemapindex keeps track of style maps to expose in properties
72978                         styleMapIndex = {},
72979                         // atomic geospatial types supported by KML - MultiGeometry is
72980                         // handled separately
72981                         geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
72982                         // all root placemarks in the file
72983                         placemarks = get(doc, 'Placemark'),
72984                         styles = get(doc, 'Style'),
72985                         styleMaps = get(doc, 'StyleMap');
72986
72987                     for (var k = 0; k < styles.length; k++) {
72988                         var hash = okhash(xml2str(styles[k])).toString(16);
72989                         styleIndex['#' + attr(styles[k], 'id')] = hash;
72990                         styleByHash[hash] = styles[k];
72991                     }
72992                     for (var l = 0; l < styleMaps.length; l++) {
72993                         styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
72994                         var pairs = get(styleMaps[l], 'Pair');
72995                         var pairsMap = {};
72996                         for (var m = 0; m < pairs.length; m++) {
72997                             pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
72998                         }
72999                         styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
73000
73001                     }
73002                     for (var j = 0; j < placemarks.length; j++) {
73003                         gj.features = gj.features.concat(getPlacemark(placemarks[j]));
73004                     }
73005                     function kmlColor(v) {
73006                         var color, opacity;
73007                         v = v || '';
73008                         if (v.substr(0, 1) === '#') { v = v.substr(1); }
73009                         if (v.length === 6 || v.length === 3) { color = v; }
73010                         if (v.length === 8) {
73011                             opacity = parseInt(v.substr(0, 2), 16) / 255;
73012                             color = '#' + v.substr(6, 2) +
73013                                 v.substr(4, 2) +
73014                                 v.substr(2, 2);
73015                         }
73016                         return [color, isNaN(opacity) ? undefined : opacity];
73017                     }
73018                     function gxCoord(v) { return numarray(v.split(' ')); }
73019                     function gxCoords(root) {
73020                         var elems = get(root, 'coord'), coords = [], times = [];
73021                         if (elems.length === 0) elems = get(root, 'gx:coord');
73022                         for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
73023                         var timeElems = get(root, 'when');
73024                         for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
73025                         return {
73026                             coords: coords,
73027                             times: times
73028                         };
73029                     }
73030                     function getGeometry(root) {
73031                         var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
73032                         if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
73033                         if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
73034                         if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
73035                         for (i = 0; i < geotypes.length; i++) {
73036                             geomNodes = get(root, geotypes[i]);
73037                             if (geomNodes) {
73038                                 for (j = 0; j < geomNodes.length; j++) {
73039                                     geomNode = geomNodes[j];
73040                                     if (geotypes[i] === 'Point') {
73041                                         geoms.push({
73042                                             type: 'Point',
73043                                             coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
73044                                         });
73045                                     } else if (geotypes[i] === 'LineString') {
73046                                         geoms.push({
73047                                             type: 'LineString',
73048                                             coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
73049                                         });
73050                                     } else if (geotypes[i] === 'Polygon') {
73051                                         var rings = get(geomNode, 'LinearRing'),
73052                                             coords = [];
73053                                         for (k = 0; k < rings.length; k++) {
73054                                             coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
73055                                         }
73056                                         geoms.push({
73057                                             type: 'Polygon',
73058                                             coordinates: coords
73059                                         });
73060                                     } else if (geotypes[i] === 'Track' ||
73061                                         geotypes[i] === 'gx:Track') {
73062                                         var track = gxCoords(geomNode);
73063                                         geoms.push({
73064                                             type: 'LineString',
73065                                             coordinates: track.coords
73066                                         });
73067                                         if (track.times.length) coordTimes.push(track.times);
73068                                     }
73069                                 }
73070                             }
73071                         }
73072                         return {
73073                             geoms: geoms,
73074                             coordTimes: coordTimes
73075                         };
73076                     }
73077                     function getPlacemark(root) {
73078                         var geomsAndTimes = getGeometry(root), i, properties = {},
73079                             name = nodeVal(get1(root, 'name')),
73080                             address = nodeVal(get1(root, 'address')),
73081                             styleUrl = nodeVal(get1(root, 'styleUrl')),
73082                             description = nodeVal(get1(root, 'description')),
73083                             timeSpan = get1(root, 'TimeSpan'),
73084                             timeStamp = get1(root, 'TimeStamp'),
73085                             extendedData = get1(root, 'ExtendedData'),
73086                             lineStyle = get1(root, 'LineStyle'),
73087                             polyStyle = get1(root, 'PolyStyle'),
73088                             visibility = get1(root, 'visibility');
73089
73090                         if (!geomsAndTimes.geoms.length) return [];
73091                         if (name) properties.name = name;
73092                         if (address) properties.address = address;
73093                         if (styleUrl) {
73094                             if (styleUrl[0] !== '#') {
73095                                 styleUrl = '#' + styleUrl;
73096                             }
73097
73098                             properties.styleUrl = styleUrl;
73099                             if (styleIndex[styleUrl]) {
73100                                 properties.styleHash = styleIndex[styleUrl];
73101                             }
73102                             if (styleMapIndex[styleUrl]) {
73103                                 properties.styleMapHash = styleMapIndex[styleUrl];
73104                                 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
73105                             }
73106                             // Try to populate the lineStyle or polyStyle since we got the style hash
73107                             var style = styleByHash[properties.styleHash];
73108                             if (style) {
73109                                 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
73110                                 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
73111                             }
73112                         }
73113                         if (description) properties.description = description;
73114                         if (timeSpan) {
73115                             var begin = nodeVal(get1(timeSpan, 'begin'));
73116                             var end = nodeVal(get1(timeSpan, 'end'));
73117                             properties.timespan = { begin: begin, end: end };
73118                         }
73119                         if (timeStamp) {
73120                             properties.timestamp = nodeVal(get1(timeStamp, 'when'));
73121                         }
73122                         if (lineStyle) {
73123                             var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
73124                                 color = linestyles[0],
73125                                 opacity = linestyles[1],
73126                                 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73127                             if (color) properties.stroke = color;
73128                             if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
73129                             if (!isNaN(width)) properties['stroke-width'] = width;
73130                         }
73131                         if (polyStyle) {
73132                             var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
73133                                 pcolor = polystyles[0],
73134                                 popacity = polystyles[1],
73135                                 fill = nodeVal(get1(polyStyle, 'fill')),
73136                                 outline = nodeVal(get1(polyStyle, 'outline'));
73137                             if (pcolor) properties.fill = pcolor;
73138                             if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
73139                             if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
73140                             if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
73141                         }
73142                         if (extendedData) {
73143                             var datas = get(extendedData, 'Data'),
73144                                 simpleDatas = get(extendedData, 'SimpleData');
73145
73146                             for (i = 0; i < datas.length; i++) {
73147                                 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
73148                             }
73149                             for (i = 0; i < simpleDatas.length; i++) {
73150                                 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
73151                             }
73152                         }
73153                         if (visibility) {
73154                             properties.visibility = nodeVal(visibility);
73155                         }
73156                         if (geomsAndTimes.coordTimes.length) {
73157                             properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
73158                                 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
73159                         }
73160                         var feature = {
73161                             type: 'Feature',
73162                             geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
73163                                 type: 'GeometryCollection',
73164                                 geometries: geomsAndTimes.geoms
73165                             },
73166                             properties: properties
73167                         };
73168                         if (attr(root, 'id')) feature.id = attr(root, 'id');
73169                         return [feature];
73170                     }
73171                     return gj;
73172                 },
73173                 gpx: function(doc) {
73174                     var i,
73175                         tracks = get(doc, 'trk'),
73176                         routes = get(doc, 'rte'),
73177                         waypoints = get(doc, 'wpt'),
73178                         // a feature collection
73179                         gj = fc(),
73180                         feature;
73181                     for (i = 0; i < tracks.length; i++) {
73182                         feature = getTrack(tracks[i]);
73183                         if (feature) gj.features.push(feature);
73184                     }
73185                     for (i = 0; i < routes.length; i++) {
73186                         feature = getRoute(routes[i]);
73187                         if (feature) gj.features.push(feature);
73188                     }
73189                     for (i = 0; i < waypoints.length; i++) {
73190                         gj.features.push(getPoint(waypoints[i]));
73191                     }
73192                     function getPoints(node, pointname) {
73193                         var pts = get(node, pointname),
73194                             line = [],
73195                             times = [],
73196                             heartRates = [],
73197                             l = pts.length;
73198                         if (l < 2) return {};  // Invalid line in GeoJSON
73199                         for (var i = 0; i < l; i++) {
73200                             var c = coordPair(pts[i]);
73201                             line.push(c.coordinates);
73202                             if (c.time) times.push(c.time);
73203                             if (c.heartRate) heartRates.push(c.heartRate);
73204                         }
73205                         return {
73206                             line: line,
73207                             times: times,
73208                             heartRates: heartRates
73209                         };
73210                     }
73211                     function getTrack(node) {
73212                         var segments = get(node, 'trkseg'),
73213                             track = [],
73214                             times = [],
73215                             heartRates = [],
73216                             line;
73217                         for (var i = 0; i < segments.length; i++) {
73218                             line = getPoints(segments[i], 'trkpt');
73219                             if (line) {
73220                                 if (line.line) track.push(line.line);
73221                                 if (line.times && line.times.length) times.push(line.times);
73222                                 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
73223                             }
73224                         }
73225                         if (track.length === 0) return;
73226                         var properties = getProperties(node);
73227                         extend(properties, getLineStyle(get1(node, 'extensions')));
73228                         if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
73229                         if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
73230                         return {
73231                             type: 'Feature',
73232                             properties: properties,
73233                             geometry: {
73234                                 type: track.length === 1 ? 'LineString' : 'MultiLineString',
73235                                 coordinates: track.length === 1 ? track[0] : track
73236                             }
73237                         };
73238                     }
73239                     function getRoute(node) {
73240                         var line = getPoints(node, 'rtept');
73241                         if (!line.line) return;
73242                         var prop = getProperties(node);
73243                         extend(prop, getLineStyle(get1(node, 'extensions')));
73244                         var routeObj = {
73245                             type: 'Feature',
73246                             properties: prop,
73247                             geometry: {
73248                                 type: 'LineString',
73249                                 coordinates: line.line
73250                             }
73251                         };
73252                         return routeObj;
73253                     }
73254                     function getPoint(node) {
73255                         var prop = getProperties(node);
73256                         extend(prop, getMulti(node, ['sym']));
73257                         return {
73258                             type: 'Feature',
73259                             properties: prop,
73260                             geometry: {
73261                                 type: 'Point',
73262                                 coordinates: coordPair(node).coordinates
73263                             }
73264                         };
73265                     }
73266                     function getLineStyle(extensions) {
73267                         var style = {};
73268                         if (extensions) {
73269                             var lineStyle = get1(extensions, 'line');
73270                             if (lineStyle) {
73271                                 var color = nodeVal(get1(lineStyle, 'color')),
73272                                     opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
73273                                     width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73274                                 if (color) style.stroke = color;
73275                                 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
73276                                 // GPX width is in mm, convert to px with 96 px per inch
73277                                 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
73278                             }
73279                         }
73280                         return style;
73281                     }
73282                     function getProperties(node) {
73283                         var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
73284                             links = get(node, 'link');
73285                         if (links.length) prop.links = [];
73286                         for (var i = 0, link; i < links.length; i++) {
73287                             link = { href: attr(links[i], 'href') };
73288                             extend(link, getMulti(links[i], ['text', 'type']));
73289                             prop.links.push(link);
73290                         }
73291                         return prop;
73292                     }
73293                     return gj;
73294                 }
73295             };
73296             return t;
73297         })();
73298
73299         module.exports = toGeoJSON;
73300         });
73301
73302         var _initialized = false;
73303         var _enabled = false;
73304         var _geojson;
73305
73306
73307         function svgData(projection, context, dispatch) {
73308             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73309             var _showLabels = true;
73310             var detected = utilDetect();
73311             var layer = d3_select(null);
73312             var _vtService;
73313             var _fileList;
73314             var _template;
73315             var _src;
73316
73317
73318             function init() {
73319                 if (_initialized) return;  // run once
73320
73321                 _geojson = {};
73322                 _enabled = true;
73323
73324                 function over() {
73325                     event.stopPropagation();
73326                     event.preventDefault();
73327                     event.dataTransfer.dropEffect = 'copy';
73328                 }
73329
73330                 d3_select('body')
73331                     .attr('dropzone', 'copy')
73332                     .on('drop.svgData', function() {
73333                         event.stopPropagation();
73334                         event.preventDefault();
73335                         if (!detected.filedrop) return;
73336                         drawData.fileList(event.dataTransfer.files);
73337                     })
73338                     .on('dragenter.svgData', over)
73339                     .on('dragexit.svgData', over)
73340                     .on('dragover.svgData', over);
73341
73342                 _initialized = true;
73343             }
73344
73345
73346             function getService() {
73347                 if (services$1.vectorTile && !_vtService) {
73348                     _vtService = services$1.vectorTile;
73349                     _vtService.event.on('loadedData', throttledRedraw);
73350                 } else if (!services$1.vectorTile && _vtService) {
73351                     _vtService = null;
73352                 }
73353
73354                 return _vtService;
73355             }
73356
73357
73358             function showLayer() {
73359                 layerOn();
73360
73361                 layer
73362                     .style('opacity', 0)
73363                     .transition()
73364                     .duration(250)
73365                     .style('opacity', 1)
73366                     .on('end', function () { dispatch.call('change'); });
73367             }
73368
73369
73370             function hideLayer() {
73371                 throttledRedraw.cancel();
73372
73373                 layer
73374                     .transition()
73375                     .duration(250)
73376                     .style('opacity', 0)
73377                     .on('end', layerOff);
73378             }
73379
73380
73381             function layerOn() {
73382                 layer.style('display', 'block');
73383             }
73384
73385
73386             function layerOff() {
73387                 layer.selectAll('.viewfield-group').remove();
73388                 layer.style('display', 'none');
73389             }
73390
73391
73392             // ensure that all geojson features in a collection have IDs
73393             function ensureIDs(gj) {
73394                 if (!gj) return null;
73395
73396                 if (gj.type === 'FeatureCollection') {
73397                     for (var i = 0; i < gj.features.length; i++) {
73398                         ensureFeatureID(gj.features[i]);
73399                     }
73400                 } else {
73401                     ensureFeatureID(gj);
73402                 }
73403                 return gj;
73404             }
73405
73406
73407             // ensure that each single Feature object has a unique ID
73408             function ensureFeatureID(feature) {
73409                 if (!feature) return;
73410                 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
73411                 return feature;
73412             }
73413
73414
73415             // Prefer an array of Features instead of a FeatureCollection
73416             function getFeatures(gj) {
73417                 if (!gj) return [];
73418
73419                 if (gj.type === 'FeatureCollection') {
73420                     return gj.features;
73421                 } else {
73422                     return [gj];
73423                 }
73424             }
73425
73426
73427             function featureKey(d) {
73428                 return d.__featurehash__;
73429             }
73430
73431
73432             function isPolygon(d) {
73433                 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
73434             }
73435
73436
73437             function clipPathID(d) {
73438                 return 'data-' + d.__featurehash__ + '-clippath';
73439             }
73440
73441
73442             function featureClasses(d) {
73443                 return [
73444                     'data' + d.__featurehash__,
73445                     d.geometry.type,
73446                     isPolygon(d) ? 'area' : '',
73447                     d.__layerID__ || ''
73448                 ].filter(Boolean).join(' ');
73449             }
73450
73451
73452             function drawData(selection) {
73453                 var vtService = getService();
73454                 var getPath = svgPath(projection).geojson;
73455                 var getAreaPath = svgPath(projection, null, true).geojson;
73456                 var hasData = drawData.hasData();
73457
73458                 layer = selection.selectAll('.layer-mapdata')
73459                     .data(_enabled && hasData ? [0] : []);
73460
73461                 layer.exit()
73462                     .remove();
73463
73464                 layer = layer.enter()
73465                     .append('g')
73466                     .attr('class', 'layer-mapdata')
73467                     .merge(layer);
73468
73469                 var surface = context.surface();
73470                 if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
73471
73472
73473                 // Gather data
73474                 var geoData, polygonData;
73475                 if (_template && vtService) {   // fetch data from vector tile service
73476                     var sourceID = _template;
73477                     vtService.loadTiles(sourceID, _template, projection);
73478                     geoData = vtService.data(sourceID, projection);
73479                 } else {
73480                     geoData = getFeatures(_geojson);
73481                 }
73482                 geoData = geoData.filter(getPath);
73483                 polygonData = geoData.filter(isPolygon);
73484
73485
73486                 // Draw clip paths for polygons
73487                 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
73488                    .data(polygonData, featureKey);
73489
73490                 clipPaths.exit()
73491                    .remove();
73492
73493                 var clipPathsEnter = clipPaths.enter()
73494                    .append('clipPath')
73495                    .attr('class', 'clipPath-data')
73496                    .attr('id', clipPathID);
73497
73498                 clipPathsEnter
73499                    .append('path');
73500
73501                 clipPaths.merge(clipPathsEnter)
73502                    .selectAll('path')
73503                    .attr('d', getAreaPath);
73504
73505
73506                 // Draw fill, shadow, stroke layers
73507                 var datagroups = layer
73508                     .selectAll('g.datagroup')
73509                     .data(['fill', 'shadow', 'stroke']);
73510
73511                 datagroups = datagroups.enter()
73512                     .append('g')
73513                     .attr('class', function(d) { return 'datagroup datagroup-' + d; })
73514                     .merge(datagroups);
73515
73516
73517                 // Draw paths
73518                 var pathData = {
73519                     fill: polygonData,
73520                     shadow: geoData,
73521                     stroke: geoData
73522                 };
73523
73524                 var paths = datagroups
73525                     .selectAll('path')
73526                     .data(function(layer) { return pathData[layer]; }, featureKey);
73527
73528                 // exit
73529                 paths.exit()
73530                     .remove();
73531
73532                 // enter/update
73533                 paths = paths.enter()
73534                     .append('path')
73535                     .attr('class', function(d) {
73536                         var datagroup = this.parentNode.__data__;
73537                         return 'pathdata ' + datagroup + ' ' + featureClasses(d);
73538                     })
73539                     .attr('clip-path', function(d) {
73540                         var datagroup = this.parentNode.__data__;
73541                         return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
73542                     })
73543                     .merge(paths)
73544                     .attr('d', function(d) {
73545                         var datagroup = this.parentNode.__data__;
73546                         return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
73547                     });
73548
73549
73550                 // Draw labels
73551                 layer
73552                     .call(drawLabels, 'label-halo', geoData)
73553                     .call(drawLabels, 'label', geoData);
73554
73555
73556                 function drawLabels(selection, textClass, data) {
73557                     var labelPath = d3_geoPath(projection);
73558                     var labelData = data.filter(function(d) {
73559                         return _showLabels && d.properties && (d.properties.desc || d.properties.name);
73560                     });
73561
73562                     var labels = selection.selectAll('text.' + textClass)
73563                         .data(labelData, featureKey);
73564
73565                     // exit
73566                     labels.exit()
73567                         .remove();
73568
73569                     // enter/update
73570                     labels = labels.enter()
73571                         .append('text')
73572                         .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
73573                         .merge(labels)
73574                         .text(function(d) {
73575                             return d.properties.desc || d.properties.name;
73576                         })
73577                         .attr('x', function(d) {
73578                             var centroid = labelPath.centroid(d);
73579                             return centroid[0] + 11;
73580                         })
73581                         .attr('y', function(d) {
73582                             var centroid = labelPath.centroid(d);
73583                             return centroid[1];
73584                         });
73585                 }
73586             }
73587
73588
73589             function getExtension(fileName) {
73590                 if (!fileName) return;
73591
73592                 var re = /\.(gpx|kml|(geo)?json)$/i;
73593                 var match = fileName.toLowerCase().match(re);
73594                 return match && match.length && match[0];
73595             }
73596
73597
73598             function xmlToDom(textdata) {
73599                 return (new DOMParser()).parseFromString(textdata, 'text/xml');
73600             }
73601
73602
73603             drawData.setFile = function(extension, data) {
73604                 _template = null;
73605                 _fileList = null;
73606                 _geojson = null;
73607                 _src = null;
73608
73609                 var gj;
73610                 switch (extension) {
73611                     case '.gpx':
73612                         gj = togeojson.gpx(xmlToDom(data));
73613                         break;
73614                     case '.kml':
73615                         gj = togeojson.kml(xmlToDom(data));
73616                         break;
73617                     case '.geojson':
73618                     case '.json':
73619                         gj = JSON.parse(data);
73620                         break;
73621                 }
73622
73623                 gj = gj || {};
73624                 if (Object.keys(gj).length) {
73625                     _geojson = ensureIDs(gj);
73626                     _src = extension + ' data file';
73627                     this.fitZoom();
73628                 }
73629
73630                 dispatch.call('change');
73631                 return this;
73632             };
73633
73634
73635             drawData.showLabels = function(val) {
73636                 if (!arguments.length) return _showLabels;
73637
73638                 _showLabels = val;
73639                 return this;
73640             };
73641
73642
73643             drawData.enabled = function(val) {
73644                 if (!arguments.length) return _enabled;
73645
73646                 _enabled = val;
73647                 if (_enabled) {
73648                     showLayer();
73649                 } else {
73650                     hideLayer();
73651                 }
73652
73653                 dispatch.call('change');
73654                 return this;
73655             };
73656
73657
73658             drawData.hasData = function() {
73659                 var gj = _geojson || {};
73660                 return !!(_template || Object.keys(gj).length);
73661             };
73662
73663
73664             drawData.template = function(val, src) {
73665                 if (!arguments.length) return _template;
73666
73667                 // test source against OSM imagery blacklists..
73668                 var osm = context.connection();
73669                 if (osm) {
73670                     var blacklists = osm.imageryBlacklists();
73671                     var fail = false;
73672                     var tested = 0;
73673                     var regex;
73674
73675                     for (var i = 0; i < blacklists.length; i++) {
73676                         try {
73677                             regex = new RegExp(blacklists[i]);
73678                             fail = regex.test(val);
73679                             tested++;
73680                             if (fail) break;
73681                         } catch (e) {
73682                             /* noop */
73683                         }
73684                     }
73685
73686                     // ensure at least one test was run.
73687                     if (!tested) {
73688                         regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73689                         fail = regex.test(val);
73690                     }
73691                 }
73692
73693                 _template = val;
73694                 _fileList = null;
73695                 _geojson = null;
73696
73697                 // strip off the querystring/hash from the template,
73698                 // it often includes the access token
73699                 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
73700
73701                 dispatch.call('change');
73702                 return this;
73703             };
73704
73705
73706             drawData.geojson = function(gj, src) {
73707                 if (!arguments.length) return _geojson;
73708
73709                 _template = null;
73710                 _fileList = null;
73711                 _geojson = null;
73712                 _src = null;
73713
73714                 gj = gj || {};
73715                 if (Object.keys(gj).length) {
73716                     _geojson = ensureIDs(gj);
73717                     _src = src || 'unknown.geojson';
73718                 }
73719
73720                 dispatch.call('change');
73721                 return this;
73722             };
73723
73724
73725             drawData.fileList = function(fileList) {
73726                 if (!arguments.length) return _fileList;
73727
73728                 _template = null;
73729                 _fileList = fileList;
73730                 _geojson = null;
73731                 _src = null;
73732
73733                 if (!fileList || !fileList.length) return this;
73734                 var f = fileList[0];
73735                 var extension = getExtension(f.name);
73736                 var reader = new FileReader();
73737                 reader.onload = (function() {
73738                     return function(e) {
73739                         drawData.setFile(extension, e.target.result);
73740                     };
73741                 })();
73742
73743                 reader.readAsText(f);
73744
73745                 return this;
73746             };
73747
73748
73749             drawData.url = function(url, defaultExtension) {
73750                 _template = null;
73751                 _fileList = null;
73752                 _geojson = null;
73753                 _src = null;
73754
73755                 // strip off any querystring/hash from the url before checking extension
73756                 var testUrl = url.split(/[?#]/)[0];
73757                 var extension = getExtension(testUrl) || defaultExtension;
73758                 if (extension) {
73759                     _template = null;
73760                     d3_text(url)
73761                         .then(function(data) {
73762                             drawData.setFile(extension, data);
73763                         })
73764                         .catch(function() {
73765                             /* ignore */
73766                         });
73767
73768                 } else {
73769                     drawData.template(url);
73770                 }
73771
73772                 return this;
73773             };
73774
73775
73776             drawData.getSrc = function() {
73777                 return _src || '';
73778             };
73779
73780
73781             drawData.fitZoom = function() {
73782                 var features = getFeatures(_geojson);
73783                 if (!features.length) return;
73784
73785                 var map = context.map();
73786                 var viewport = map.trimmedExtent().polygon();
73787                 var coords = features.reduce(function(coords, feature) {
73788                     var c = feature.geometry.coordinates;
73789
73790                     /* eslint-disable no-fallthrough */
73791                     switch (feature.geometry.type) {
73792                         case 'Point':
73793                             c = [c];
73794                         case 'MultiPoint':
73795                         case 'LineString':
73796                             break;
73797
73798                         case 'MultiPolygon':
73799                             c = utilArrayFlatten(c);
73800                         case 'Polygon':
73801                         case 'MultiLineString':
73802                             c = utilArrayFlatten(c);
73803                             break;
73804                     }
73805                     /* eslint-enable no-fallthrough */
73806
73807                     return utilArrayUnion(coords, c);
73808                 }, []);
73809
73810                 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
73811                     var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
73812                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
73813                 }
73814
73815                 return this;
73816             };
73817
73818
73819             init();
73820             return drawData;
73821         }
73822
73823         function svgDebug(projection, context) {
73824
73825             function drawDebug(selection) {
73826                 var showsTile = context.getDebug('tile');
73827                 var showsCollision = context.getDebug('collision');
73828                 var showsImagery = context.getDebug('imagery');
73829                 var showsCommunity = context.getDebug('community');
73830                 var showsImperial = context.getDebug('imperial');
73831                 var showsDriveLeft = context.getDebug('driveLeft');
73832                 var showsTouchTargets = context.getDebug('target');
73833                 var showsDownloaded = context.getDebug('downloaded');
73834
73835                 var debugData = [];
73836                 if (showsTile) {
73837                     debugData.push({ class: 'red', label: 'tile' });
73838                 }
73839                 if (showsCollision) {
73840                     debugData.push({ class: 'yellow', label: 'collision' });
73841                 }
73842                 if (showsImagery) {
73843                     debugData.push({ class: 'orange', label: 'imagery' });
73844                 }
73845                 if (showsCommunity) {
73846                     debugData.push({ class: 'blue', label: 'community' });
73847                 }
73848                 if (showsImperial) {
73849                     debugData.push({ class: 'cyan', label: 'imperial' });
73850                 }
73851                 if (showsDriveLeft) {
73852                     debugData.push({ class: 'green', label: 'driveLeft' });
73853                 }
73854                 if (showsTouchTargets) {
73855                     debugData.push({ class: 'pink', label: 'touchTargets' });
73856                 }
73857                 if (showsDownloaded) {
73858                     debugData.push({ class: 'purple', label: 'downloaded' });
73859                 }
73860
73861
73862                 var legend = d3_select('#content')
73863                     .selectAll('.debug-legend')
73864                     .data(debugData.length ? [0] : []);
73865
73866                 legend.exit()
73867                     .remove();
73868
73869                 legend = legend.enter()
73870                     .append('div')
73871                     .attr('class', 'fillD debug-legend')
73872                     .merge(legend);
73873
73874
73875                 var legendItems = legend.selectAll('.debug-legend-item')
73876                     .data(debugData, function(d) { return d.label; });
73877
73878                 legendItems.exit()
73879                     .remove();
73880
73881                 legendItems.enter()
73882                     .append('span')
73883                     .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
73884                     .text(function(d) { return d.label; });
73885
73886
73887                 var layer = selection.selectAll('.layer-debug')
73888                     .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft || showsDownloaded ? [0] : []);
73889
73890                 layer.exit()
73891                     .remove();
73892
73893                 layer = layer.enter()
73894                     .append('g')
73895                     .attr('class', 'layer-debug')
73896                     .merge(layer);
73897
73898
73899                 // imagery
73900                 var extent = context.map().extent();
73901                 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
73902                 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
73903
73904                 var imagery = layer.selectAll('path.debug-imagery')
73905                     .data(features);
73906
73907                 imagery.exit()
73908                     .remove();
73909
73910                 imagery.enter()
73911                     .append('path')
73912                     .attr('class', 'debug-imagery debug orange');
73913
73914
73915                 // community index
73916                 var community = layer.selectAll('path.debug-community')
73917                     .data(showsCommunity ? Object.values(data.community.features) : []);
73918
73919                 community.exit()
73920                     .remove();
73921
73922                 community.enter()
73923                     .append('path')
73924                     .attr('class', 'debug-community debug blue');
73925
73926
73927                 // imperial
73928                 var imperial = layer
73929                     .selectAll('path.debug-imperial')
73930                     .data(showsImperial ? [dataImperial] : []);
73931
73932                 imperial.exit()
73933                     .remove();
73934
73935                 imperial.enter()
73936                     .append('path')
73937                     .attr('class', 'debug-imperial debug cyan');
73938
73939
73940                 // driveleft
73941                 var driveLeft = layer
73942                     .selectAll('path.debug-drive-left')
73943                     .data(showsDriveLeft ? [dataDriveLeft] : []);
73944
73945                 driveLeft.exit()
73946                     .remove();
73947
73948                 driveLeft.enter()
73949                     .append('path')
73950                     .attr('class', 'debug-drive-left debug green');
73951
73952
73953                 // downloaded
73954                 var osm = context.connection();
73955                 var dataDownloaded = [];
73956
73957                 if (osm) {
73958                     var rtree = osm.caches('get').tile.rtree;
73959                     dataDownloaded = rtree.all().map(function(bbox) {
73960                         return {
73961                             type: 'Feature',
73962                             properties: { id: bbox.id },
73963                             geometry: {
73964                                 type: 'Polygon',
73965                                 coordinates: [[
73966                                     [ bbox.minX, bbox.minY ],
73967                                     [ bbox.minX, bbox.maxY ],
73968                                     [ bbox.maxX, bbox.maxY ],
73969                                     [ bbox.maxX, bbox.minY ],
73970                                     [ bbox.minX, bbox.minY ]
73971                                 ]]
73972                             }
73973                         };
73974                     });
73975                 }
73976
73977
73978                 var downloaded = layer
73979                     .selectAll('path.debug-downloaded')
73980                     .data(showsDownloaded ? dataDownloaded : []);
73981
73982                 downloaded.exit()
73983                     .remove();
73984
73985                 downloaded.enter()
73986                     .append('path')
73987                     .attr('class', 'debug-downloaded debug purple');
73988
73989
73990                 // update
73991                 layer.selectAll('path')
73992                     .attr('d', svgPath(projection).geojson);
73993             }
73994
73995
73996             // This looks strange because `enabled` methods on other layers are
73997             // chainable getter/setters, and this one is just a getter.
73998             drawDebug.enabled = function() {
73999                 if (!arguments.length) {
74000                     return context.getDebug('tile') ||
74001                         context.getDebug('collision') ||
74002                         context.getDebug('imagery') ||
74003                         context.getDebug('imperial') ||
74004                         context.getDebug('driveLeft') ||
74005                         context.getDebug('target') ||
74006                         context.getDebug('downloaded');
74007                 } else {
74008                     return this;
74009                 }
74010             };
74011
74012
74013             return drawDebug;
74014         }
74015
74016         var _keepRightEnabled = false;
74017         var _keepRightService;
74018
74019
74020         function svgKeepRight(projection, context, dispatch) {
74021             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
74022             var minZoom = 12;
74023             var touchLayer = d3_select(null);
74024             var drawLayer = d3_select(null);
74025             var _keepRightVisible = false;
74026
74027
74028             function markerPath(selection, klass) {
74029                 selection
74030                     .attr('class', klass)
74031                     .attr('transform', 'translate(-4, -24)')
74032                     .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');
74033             }
74034
74035
74036             // Loosely-coupled keepRight service for fetching errors.
74037             function getService() {
74038                 if (services$1.keepRight && !_keepRightService) {
74039                     _keepRightService = services$1.keepRight;
74040                     _keepRightService.on('loaded', throttledRedraw);
74041                 } else if (!services$1.keepRight && _keepRightService) {
74042                     _keepRightService = null;
74043                 }
74044
74045                 return _keepRightService;
74046             }
74047
74048
74049             // Show the errors
74050             function editOn() {
74051                 if (!_keepRightVisible) {
74052                     _keepRightVisible = true;
74053                     drawLayer
74054                         .style('display', 'block');
74055                 }
74056             }
74057
74058
74059             // Immediately remove the errors and their touch targets
74060             function editOff() {
74061                 if (_keepRightVisible) {
74062                     _keepRightVisible = false;
74063                     drawLayer
74064                         .style('display', 'none');
74065                     drawLayer.selectAll('.qa_error.keepRight')
74066                         .remove();
74067                     touchLayer.selectAll('.qa_error.keepRight')
74068                         .remove();
74069                 }
74070             }
74071
74072
74073             // Enable the layer.  This shows the errors and transitions them to visible.
74074             function layerOn() {
74075                 editOn();
74076
74077                 drawLayer
74078                     .style('opacity', 0)
74079                     .transition()
74080                     .duration(250)
74081                     .style('opacity', 1)
74082                     .on('end interrupt', function () {
74083                         dispatch.call('change');
74084                     });
74085             }
74086
74087
74088             // Disable the layer.  This transitions the layer invisible and then hides the errors.
74089             function layerOff() {
74090                 throttledRedraw.cancel();
74091                 drawLayer.interrupt();
74092                 touchLayer.selectAll('.qa_error.keepRight')
74093                     .remove();
74094
74095                 drawLayer
74096                     .transition()
74097                     .duration(250)
74098                     .style('opacity', 0)
74099                     .on('end interrupt', function () {
74100                         editOff();
74101                         dispatch.call('change');
74102                     });
74103             }
74104
74105
74106             // Update the error markers
74107             function updateMarkers() {
74108                 if (!_keepRightVisible || !_keepRightEnabled) return;
74109
74110                 var service = getService();
74111                 var selectedID = context.selectedErrorID();
74112                 var data = (service ? service.getErrors(projection) : []);
74113                 var getTransform = svgPointTransform(projection);
74114
74115                 // Draw markers..
74116                 var markers = drawLayer.selectAll('.qa_error.keepRight')
74117                     .data(data, function(d) { return d.id; });
74118
74119                 // exit
74120                 markers.exit()
74121                     .remove();
74122
74123                 // enter
74124                 var markersEnter = markers.enter()
74125                     .append('g')
74126                     .attr('class', function(d) {
74127                         return [
74128                             'qa_error',
74129                             d.service,
74130                             'error_id-' + d.id,
74131                             'error_type-' + d.parent_error_type
74132                         ].join(' ');
74133                     });
74134
74135                 markersEnter
74136                     .append('ellipse')
74137                     .attr('cx', 0.5)
74138                     .attr('cy', 1)
74139                     .attr('rx', 6.5)
74140                     .attr('ry', 3)
74141                     .attr('class', 'stroke');
74142
74143                 markersEnter
74144                     .append('path')
74145                     .call(markerPath, 'shadow');
74146
74147                 markersEnter
74148                     .append('use')
74149                     .attr('class', 'qa_error-fill')
74150                     .attr('width', '20px')
74151                     .attr('height', '20px')
74152                     .attr('x', '-8px')
74153                     .attr('y', '-22px')
74154                     .attr('xlink:href', '#iD-icon-bolt');
74155
74156                 // update
74157                 markers
74158                     .merge(markersEnter)
74159                     .sort(sortY)
74160                     .classed('selected', function(d) { return d.id === selectedID; })
74161                     .attr('transform', getTransform);
74162
74163
74164                 // Draw targets..
74165                 if (touchLayer.empty()) return;
74166                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
74167
74168                 var targets = touchLayer.selectAll('.qa_error.keepRight')
74169                     .data(data, function(d) { return d.id; });
74170
74171                 // exit
74172                 targets.exit()
74173                     .remove();
74174
74175                 // enter/update
74176                 targets.enter()
74177                     .append('rect')
74178                     .attr('width', '20px')
74179                     .attr('height', '20px')
74180                     .attr('x', '-8px')
74181                     .attr('y', '-22px')
74182                     .merge(targets)
74183                     .sort(sortY)
74184                     .attr('class', function(d) {
74185                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
74186                     })
74187                     .attr('transform', getTransform);
74188
74189
74190                 function sortY(a, b) {
74191                     return (a.id === selectedID) ? 1
74192                         : (b.id === selectedID) ? -1
74193                         : (a.severity === 'error' && b.severity !== 'error') ? 1
74194                         : (b.severity === 'error' && a.severity !== 'error') ? -1
74195                         : b.loc[1] - a.loc[1];
74196                 }
74197             }
74198
74199
74200             // Draw the keepRight layer and schedule loading errors and updating markers.
74201             function drawKeepRight(selection) {
74202                 var service = getService();
74203
74204                 var surface = context.surface();
74205                 if (surface && !surface.empty()) {
74206                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
74207                 }
74208
74209                 drawLayer = selection.selectAll('.layer-keepRight')
74210                     .data(service ? [0] : []);
74211
74212                 drawLayer.exit()
74213                     .remove();
74214
74215                 drawLayer = drawLayer.enter()
74216                     .append('g')
74217                     .attr('class', 'layer-keepRight')
74218                     .style('display', _keepRightEnabled ? 'block' : 'none')
74219                     .merge(drawLayer);
74220
74221                 if (_keepRightEnabled) {
74222                     if (service && ~~context.map().zoom() >= minZoom) {
74223                         editOn();
74224                         service.loadErrors(projection);
74225                         updateMarkers();
74226                     } else {
74227                         editOff();
74228                     }
74229                 }
74230             }
74231
74232
74233             // Toggles the layer on and off
74234             drawKeepRight.enabled = function(val) {
74235                 if (!arguments.length) return _keepRightEnabled;
74236
74237                 _keepRightEnabled = val;
74238                 if (_keepRightEnabled) {
74239                     layerOn();
74240                 } else {
74241                     layerOff();
74242                     if (context.selectedErrorID()) {
74243                         context.enter(modeBrowse(context));
74244                     }
74245                 }
74246
74247                 dispatch.call('change');
74248                 return this;
74249             };
74250
74251
74252             drawKeepRight.supported = function() {
74253                 return !!getService();
74254             };
74255
74256
74257             return drawKeepRight;
74258         }
74259
74260         function svgGeolocate(projection) {
74261             var layer = d3_select(null);
74262             var _position;
74263
74264
74265             function init() {
74266                 if (svgGeolocate.initialized) return;  // run once
74267                 svgGeolocate.enabled = false;
74268                 svgGeolocate.initialized = true;
74269             }
74270
74271             function showLayer() {
74272                 layer.style('display', 'block');
74273             }
74274
74275
74276             function hideLayer() {
74277                 layer
74278                     .transition()
74279                     .duration(250)
74280                     .style('opacity', 0);
74281             }
74282
74283             function layerOn() {
74284                 layer
74285                     .style('opacity', 0)
74286                     .transition()
74287                     .duration(250)
74288                     .style('opacity', 1);
74289
74290             }
74291
74292             function layerOff() {
74293                 layer.style('display', 'none');
74294             }
74295
74296             function transform(d) {
74297                 return svgPointTransform(projection)(d);
74298             }
74299
74300             function accuracy(accuracy, loc) { // converts accuracy to pixels...
74301                 var degreesRadius = geoMetersToLat(accuracy),
74302                     tangentLoc = [loc[0], loc[1] + degreesRadius],
74303                     projectedTangent = projection(tangentLoc),
74304                     projectedLoc = projection([loc[0], loc[1]]);
74305
74306                 // southern most point will have higher pixel value...
74307                return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
74308             }
74309
74310             function update() {
74311                 var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
74312
74313                 var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
74314                     .data([geolocation]);
74315
74316                 groups.exit()
74317                     .remove();
74318
74319                 var pointsEnter = groups.enter()
74320                     .append('g')
74321                     .attr('class', 'geolocation');
74322
74323                 pointsEnter
74324                     .append('circle')
74325                     .attr('id', 'geolocate-radius')
74326                     .attr('dx', '0')
74327                     .attr('dy', '0')
74328                     .attr('fill', 'rgb(15,128,225)')
74329                     .attr('fill-opacity', '0.3')
74330                     .attr('r', '0');
74331
74332                 pointsEnter
74333                     .append('circle')
74334                     .attr('dx', '0')
74335                     .attr('dy', '0')
74336                     .attr('fill', 'rgb(15,128,225)')
74337                     .attr('stroke', 'white')
74338                     .attr('stroke-width', '1.5')
74339                     .attr('r', '6');
74340
74341                 groups.merge(pointsEnter)
74342                     .attr('transform', transform);
74343
74344                 d3_select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
74345             }
74346
74347             function drawLocation(selection) {
74348                 var enabled = svgGeolocate.enabled;
74349
74350                 layer = selection.selectAll('.layer-geolocate')
74351                     .data([0]);
74352
74353                 layer.exit()
74354                     .remove();
74355
74356                 var layerEnter = layer.enter()
74357                     .append('g')
74358                     .attr('class', 'layer-geolocate')
74359                     .style('display', enabled ? 'block' : 'none');
74360
74361                 layerEnter
74362                     .append('g')
74363                     .attr('class', 'geolocations');
74364
74365                 layer = layerEnter
74366                     .merge(layer);
74367
74368                 if (enabled) {
74369                     update();
74370                 } else {
74371                     layerOff();
74372                 }
74373             }
74374
74375             drawLocation.enabled = function (position, enabled) {
74376                 if (!arguments.length) return svgGeolocate.enabled;
74377                 _position = position;
74378                 svgGeolocate.enabled = enabled;
74379                 if (svgGeolocate.enabled) {
74380                     showLayer();
74381                     layerOn();
74382                 } else {
74383                     hideLayer();
74384                 }
74385                 return this;
74386             };
74387
74388             init();
74389             return drawLocation;
74390         }
74391
74392         function svgLabels(projection, context) {
74393             var path = d3_geoPath(projection);
74394             var detected = utilDetect();
74395             var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
74396             var _rdrawn = rbush_1();
74397             var _rskipped = rbush_1();
74398             var _textWidthCache = {};
74399             var _entitybboxes = {};
74400
74401             // Listed from highest to lowest priority
74402             var labelStack = [
74403                 ['line', 'aeroway', '*', 12],
74404                 ['line', 'highway', 'motorway', 12],
74405                 ['line', 'highway', 'trunk', 12],
74406                 ['line', 'highway', 'primary', 12],
74407                 ['line', 'highway', 'secondary', 12],
74408                 ['line', 'highway', 'tertiary', 12],
74409                 ['line', 'highway', '*', 12],
74410                 ['line', 'railway', '*', 12],
74411                 ['line', 'waterway', '*', 12],
74412                 ['area', 'aeroway', '*', 12],
74413                 ['area', 'amenity', '*', 12],
74414                 ['area', 'building', '*', 12],
74415                 ['area', 'historic', '*', 12],
74416                 ['area', 'leisure', '*', 12],
74417                 ['area', 'man_made', '*', 12],
74418                 ['area', 'natural', '*', 12],
74419                 ['area', 'shop', '*', 12],
74420                 ['area', 'tourism', '*', 12],
74421                 ['area', 'camp_site', '*', 12],
74422                 ['point', 'aeroway', '*', 10],
74423                 ['point', 'amenity', '*', 10],
74424                 ['point', 'building', '*', 10],
74425                 ['point', 'historic', '*', 10],
74426                 ['point', 'leisure', '*', 10],
74427                 ['point', 'man_made', '*', 10],
74428                 ['point', 'natural', '*', 10],
74429                 ['point', 'shop', '*', 10],
74430                 ['point', 'tourism', '*', 10],
74431                 ['point', 'camp_site', '*', 10],
74432                 ['line', 'name', '*', 12],
74433                 ['area', 'name', '*', 12],
74434                 ['point', 'name', '*', 10]
74435             ];
74436
74437
74438             function blacklisted(preset) {
74439                 var noIcons = ['building', 'landuse', 'natural'];
74440                 return noIcons.some(function(s) {
74441                     return preset.id.indexOf(s) >= 0;
74442                 });
74443             }
74444
74445
74446             function get(array, prop) {
74447                 return function(d, i) { return array[i][prop]; };
74448             }
74449
74450
74451             function textWidth(text, size, elem) {
74452                 var c = _textWidthCache[size];
74453                 if (!c) c = _textWidthCache[size] = {};
74454
74455                 if (c[text]) {
74456                     return c[text];
74457
74458                 } else if (elem) {
74459                     c[text] = elem.getComputedTextLength();
74460                     return c[text];
74461
74462                 } else {
74463                     var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
74464                     if (str === null) {
74465                         return size / 3 * 2 * text.length;
74466                     } else {
74467                         return size / 3 * (2 * text.length + str.length);
74468                     }
74469                 }
74470             }
74471
74472
74473             function drawLinePaths(selection, entities, filter, classes, labels) {
74474                 var paths = selection.selectAll('path')
74475                     .filter(filter)
74476                     .data(entities, osmEntity.key);
74477
74478                 // exit
74479                 paths.exit()
74480                     .remove();
74481
74482                 // enter/update
74483                 paths.enter()
74484                     .append('path')
74485                     .style('stroke-width', get(labels, 'font-size'))
74486                     .attr('id', function(d) { return 'labelpath-' + d.id; })
74487                     .attr('class', classes)
74488                     .merge(paths)
74489                     .attr('d', get(labels, 'lineString'));
74490             }
74491
74492
74493             function drawLineLabels(selection, entities, filter, classes, labels) {
74494                 var texts = selection.selectAll('text.' + classes)
74495                     .filter(filter)
74496                     .data(entities, osmEntity.key);
74497
74498                 // exit
74499                 texts.exit()
74500                     .remove();
74501
74502                 // enter
74503                 texts.enter()
74504                     .append('text')
74505                     .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
74506                     .attr('dy', baselineHack ? '0.35em' : null)
74507                     .append('textPath')
74508                     .attr('class', 'textpath');
74509
74510                 // update
74511                 selection.selectAll('text.' + classes).selectAll('.textpath')
74512                     .filter(filter)
74513                     .data(entities, osmEntity.key)
74514                     .attr('startOffset', '50%')
74515                     .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
74516                     .text(utilDisplayNameForPath);
74517             }
74518
74519
74520             function drawPointLabels(selection, entities, filter, classes, labels) {
74521                 var texts = selection.selectAll('text.' + classes)
74522                     .filter(filter)
74523                     .data(entities, osmEntity.key);
74524
74525                 // exit
74526                 texts.exit()
74527                     .remove();
74528
74529                 // enter/update
74530                 texts.enter()
74531                     .append('text')
74532                     .attr('class', function(d, i) {
74533                         return classes + ' ' + labels[i].classes + ' ' + d.id;
74534                     })
74535                     .merge(texts)
74536                     .attr('x', get(labels, 'x'))
74537                     .attr('y', get(labels, 'y'))
74538                     .style('text-anchor', get(labels, 'textAnchor'))
74539                     .text(utilDisplayName)
74540                     .each(function(d, i) {
74541                         textWidth(utilDisplayName(d), labels[i].height, this);
74542                     });
74543             }
74544
74545
74546             function drawAreaLabels(selection, entities, filter, classes, labels) {
74547                 entities = entities.filter(hasText);
74548                 labels = labels.filter(hasText);
74549                 drawPointLabels(selection, entities, filter, classes, labels);
74550
74551                 function hasText(d, i) {
74552                     return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
74553                 }
74554             }
74555
74556
74557             function drawAreaIcons(selection, entities, filter, classes, labels) {
74558                 var icons = selection.selectAll('use.' + classes)
74559                     .filter(filter)
74560                     .data(entities, osmEntity.key);
74561
74562                 // exit
74563                 icons.exit()
74564                     .remove();
74565
74566                 // enter/update
74567                 icons.enter()
74568                     .append('use')
74569                     .attr('class', 'icon ' + classes)
74570                     .attr('width', '17px')
74571                     .attr('height', '17px')
74572                     .merge(icons)
74573                     .attr('transform', get(labels, 'transform'))
74574                     .attr('xlink:href', function(d) {
74575                         var preset = context.presets().match(d, context.graph());
74576                         var picon = preset && preset.icon;
74577
74578                         if (!picon) {
74579                             return '';
74580                         } else {
74581                             var isMaki = /^maki-/.test(picon);
74582                             return '#' + picon + (isMaki ? '-15' : '');
74583                         }
74584                     });
74585             }
74586
74587
74588             function drawCollisionBoxes(selection, rtree, which) {
74589                 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
74590
74591                 var gj = [];
74592                 if (context.getDebug('collision')) {
74593                     gj = rtree.all().map(function(d) {
74594                         return { type: 'Polygon', coordinates: [[
74595                             [d.minX, d.minY],
74596                             [d.maxX, d.minY],
74597                             [d.maxX, d.maxY],
74598                             [d.minX, d.maxY],
74599                             [d.minX, d.minY]
74600                         ]]};
74601                     });
74602                 }
74603
74604                 var boxes = selection.selectAll('.' + which)
74605                     .data(gj);
74606
74607                 // exit
74608                 boxes.exit()
74609                     .remove();
74610
74611                 // enter/update
74612                 boxes.enter()
74613                     .append('path')
74614                     .attr('class', classes)
74615                     .merge(boxes)
74616                     .attr('d', d3_geoPath());
74617             }
74618
74619
74620             function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
74621                 var wireframe = context.surface().classed('fill-wireframe');
74622                 var zoom = geoScaleToZoom(projection.scale());
74623
74624                 var labelable = [];
74625                 var renderNodeAs = {};
74626                 var i, j, k, entity, geometry;
74627
74628                 for (i = 0; i < labelStack.length; i++) {
74629                     labelable.push([]);
74630                 }
74631
74632                 if (fullRedraw) {
74633                     _rdrawn.clear();
74634                     _rskipped.clear();
74635                     _entitybboxes = {};
74636
74637                 } else {
74638                     for (i = 0; i < entities.length; i++) {
74639                         entity = entities[i];
74640                         var toRemove = []
74641                             .concat(_entitybboxes[entity.id] || [])
74642                             .concat(_entitybboxes[entity.id + 'I'] || []);
74643
74644                         for (j = 0; j < toRemove.length; j++) {
74645                             _rdrawn.remove(toRemove[j]);
74646                             _rskipped.remove(toRemove[j]);
74647                         }
74648                     }
74649                 }
74650
74651                 // Loop through all the entities to do some preprocessing
74652                 for (i = 0; i < entities.length; i++) {
74653                     entity = entities[i];
74654                     geometry = entity.geometry(graph);
74655
74656                     // Insert collision boxes around interesting points/vertices
74657                     if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
74658                         var hasDirections = entity.directions(graph, projection).length;
74659                         var markerPadding;
74660
74661                         if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
74662                             renderNodeAs[entity.id] = 'point';
74663                             markerPadding = 20;   // extra y for marker height
74664                         } else {
74665                             renderNodeAs[entity.id] = 'vertex';
74666                             markerPadding = 0;
74667                         }
74668
74669                         var coord = projection(entity.loc);
74670                         var nodePadding = 10;
74671                         var bbox = {
74672                             minX: coord[0] - nodePadding,
74673                             minY: coord[1] - nodePadding - markerPadding,
74674                             maxX: coord[0] + nodePadding,
74675                             maxY: coord[1] + nodePadding
74676                         };
74677
74678                         doInsert(bbox, entity.id + 'P');
74679                     }
74680
74681                     // From here on, treat vertices like points
74682                     if (geometry === 'vertex') {
74683                         geometry = 'point';
74684                     }
74685
74686                     // Determine which entities are label-able
74687                     var preset = geometry === 'area' && context.presets().match(entity, graph);
74688                     var icon = preset && !blacklisted(preset) && preset.icon;
74689
74690                     if (!icon && !utilDisplayName(entity))
74691                         continue;
74692
74693                     for (k = 0; k < labelStack.length; k++) {
74694                         var matchGeom = labelStack[k][0];
74695                         var matchKey = labelStack[k][1];
74696                         var matchVal = labelStack[k][2];
74697                         var hasVal = entity.tags[matchKey];
74698
74699                         if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
74700                             labelable[k].push(entity);
74701                             break;
74702                         }
74703                     }
74704                 }
74705
74706                 var positions = {
74707                     point: [],
74708                     line: [],
74709                     area: []
74710                 };
74711
74712                 var labelled = {
74713                     point: [],
74714                     line: [],
74715                     area: []
74716                 };
74717
74718                 // Try and find a valid label for labellable entities
74719                 for (k = 0; k < labelable.length; k++) {
74720                     var fontSize = labelStack[k][3];
74721
74722                     for (i = 0; i < labelable[k].length; i++) {
74723                         entity = labelable[k][i];
74724                         geometry = entity.geometry(graph);
74725
74726                         var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
74727                         var name = getName(entity);
74728                         var width = name && textWidth(name, fontSize);
74729                         var p = null;
74730
74731                         if (geometry === 'point' || geometry === 'vertex') {
74732                             // no point or vertex labels in wireframe mode
74733                             // no vertex labels at low zooms (vertices have no icons)
74734                             if (wireframe) continue;
74735                             var renderAs = renderNodeAs[entity.id];
74736                             if (renderAs === 'vertex' && zoom < 17) continue;
74737
74738                             p = getPointLabel(entity, width, fontSize, renderAs);
74739
74740                         } else if (geometry === 'line') {
74741                             p = getLineLabel(entity, width, fontSize);
74742
74743                         } else if (geometry === 'area') {
74744                             p = getAreaLabel(entity, width, fontSize);
74745                         }
74746
74747                         if (p) {
74748                             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
74749                             p.classes = geometry + ' tag-' + labelStack[k][1];
74750                             positions[geometry].push(p);
74751                             labelled[geometry].push(entity);
74752                         }
74753                     }
74754                 }
74755
74756
74757                 function isInterestingVertex(entity) {
74758                     var selectedIDs = context.selectedIDs();
74759
74760                     return entity.hasInterestingTags() ||
74761                         entity.isEndpoint(graph) ||
74762                         entity.isConnected(graph) ||
74763                         selectedIDs.indexOf(entity.id) !== -1 ||
74764                         graph.parentWays(entity).some(function(parent) {
74765                             return selectedIDs.indexOf(parent.id) !== -1;
74766                         });
74767                 }
74768
74769
74770                 function getPointLabel(entity, width, height, geometry) {
74771                     var y = (geometry === 'point' ? -12 : 0);
74772                     var pointOffsets = {
74773                         ltr: [15, y, 'start'],
74774                         rtl: [-15, y, 'end']
74775                     };
74776
74777                     var coord = projection(entity.loc);
74778                     var textPadding = 2;
74779                     var offset = pointOffsets[textDirection];
74780                     var p = {
74781                         height: height,
74782                         width: width,
74783                         x: coord[0] + offset[0],
74784                         y: coord[1] + offset[1],
74785                         textAnchor: offset[2]
74786                     };
74787
74788                     // insert a collision box for the text label..
74789                     var bbox;
74790                     if (textDirection === 'rtl') {
74791                         bbox = {
74792                             minX: p.x - width - textPadding,
74793                             minY: p.y - (height / 2) - textPadding,
74794                             maxX: p.x + textPadding,
74795                             maxY: p.y + (height / 2) + textPadding
74796                         };
74797                     } else {
74798                         bbox = {
74799                             minX: p.x - textPadding,
74800                             minY: p.y - (height / 2) - textPadding,
74801                             maxX: p.x + width + textPadding,
74802                             maxY: p.y + (height / 2) + textPadding
74803                         };
74804                     }
74805
74806                     if (tryInsert([bbox], entity.id, true)) {
74807                         return p;
74808                     }
74809                 }
74810
74811
74812                 function getLineLabel(entity, width, height) {
74813                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
74814                     var points = graph.childNodes(entity)
74815                         .map(function(node) { return projection(node.loc); });
74816                     var length = geoPathLength(points);
74817
74818                     if (length < width + 20) return;
74819
74820                     // todo: properly clip points to viewport
74821
74822                     // % along the line to attempt to place the label
74823                     var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
74824                                        25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
74825                     var padding = 3;
74826
74827                     for (var i = 0; i < lineOffsets.length; i++) {
74828                         var offset = lineOffsets[i];
74829                         var middle = offset / 100 * length;
74830                         var start = middle - width / 2;
74831
74832                         if (start < 0 || start + width > length) continue;
74833
74834                         // generate subpath and ignore paths that are invalid or don't cross viewport.
74835                         var sub = subpath(points, start, start + width);
74836                         if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
74837                             continue;
74838                         }
74839
74840                         var isReverse = reverse(sub);
74841                         if (isReverse) {
74842                             sub = sub.reverse();
74843                         }
74844
74845                         var bboxes = [];
74846                         var boxsize = (height + 2) / 2;
74847
74848                         for (var j = 0; j < sub.length - 1; j++) {
74849                             var a = sub[j];
74850                             var b = sub[j + 1];
74851
74852                             // split up the text into small collision boxes
74853                             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
74854
74855                             for (var box = 0; box < num; box++) {
74856                                 var p = geoVecInterp(a, b, box / num);
74857                                 var x0 = p[0] - boxsize - padding;
74858                                 var y0 = p[1] - boxsize - padding;
74859                                 var x1 = p[0] + boxsize + padding;
74860                                 var y1 = p[1] + boxsize + padding;
74861
74862                                 bboxes.push({
74863                                     minX: Math.min(x0, x1),
74864                                     minY: Math.min(y0, y1),
74865                                     maxX: Math.max(x0, x1),
74866                                     maxY: Math.max(y0, y1)
74867                                 });
74868                             }
74869                         }
74870
74871                         if (tryInsert(bboxes, entity.id, false)) {   // accept this one
74872                             return {
74873                                 'font-size': height + 2,
74874                                 lineString: lineString(sub),
74875                                 startOffset: offset + '%'
74876                             };
74877                         }
74878                     }
74879
74880                     function reverse(p) {
74881                         var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
74882                         return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
74883                     }
74884
74885                     function lineString(points) {
74886                         return 'M' + points.join('L');
74887                     }
74888
74889                     function subpath(points, from, to) {
74890                         var sofar = 0;
74891                         var start, end, i0, i1;
74892
74893                         for (var i = 0; i < points.length - 1; i++) {
74894                             var a = points[i];
74895                             var b = points[i + 1];
74896                             var current = geoVecLength(a, b);
74897                             var portion;
74898                             if (!start && sofar + current >= from) {
74899                                 portion = (from - sofar) / current;
74900                                 start = [
74901                                     a[0] + portion * (b[0] - a[0]),
74902                                     a[1] + portion * (b[1] - a[1])
74903                                 ];
74904                                 i0 = i + 1;
74905                             }
74906                             if (!end && sofar + current >= to) {
74907                                 portion = (to - sofar) / current;
74908                                 end = [
74909                                     a[0] + portion * (b[0] - a[0]),
74910                                     a[1] + portion * (b[1] - a[1])
74911                                 ];
74912                                 i1 = i + 1;
74913                             }
74914                             sofar += current;
74915                         }
74916
74917                         var result = points.slice(i0, i1);
74918                         result.unshift(start);
74919                         result.push(end);
74920                         return result;
74921                     }
74922                 }
74923
74924
74925                 function getAreaLabel(entity, width, height) {
74926                     var centroid = path.centroid(entity.asGeoJSON(graph, true));
74927                     var extent = entity.extent(graph);
74928                     var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
74929
74930                     if (isNaN(centroid[0]) || areaWidth < 20) return;
74931
74932                     var preset = context.presets().match(entity, context.graph());
74933                     var picon = preset && preset.icon;
74934                     var iconSize = 17;
74935                     var padding = 2;
74936                     var p = {};
74937
74938                     if (picon) {  // icon and label..
74939                         if (addIcon()) {
74940                             addLabel(iconSize + padding);
74941                             return p;
74942                         }
74943                     } else {   // label only..
74944                         if (addLabel(0)) {
74945                             return p;
74946                         }
74947                     }
74948
74949
74950                     function addIcon() {
74951                         var iconX = centroid[0] - (iconSize / 2);
74952                         var iconY = centroid[1] - (iconSize / 2);
74953                         var bbox = {
74954                             minX: iconX,
74955                             minY: iconY,
74956                             maxX: iconX + iconSize,
74957                             maxY: iconY + iconSize
74958                         };
74959
74960                         if (tryInsert([bbox], entity.id + 'I', true)) {
74961                             p.transform = 'translate(' + iconX + ',' + iconY + ')';
74962                             return true;
74963                         }
74964                         return false;
74965                     }
74966
74967                     function addLabel(yOffset) {
74968                         if (width && areaWidth >= width + 20) {
74969                             var labelX = centroid[0];
74970                             var labelY = centroid[1] + yOffset;
74971                             var bbox = {
74972                                 minX: labelX - (width / 2) - padding,
74973                                 minY: labelY - (height / 2) - padding,
74974                                 maxX: labelX + (width / 2) + padding,
74975                                 maxY: labelY + (height / 2) + padding
74976                             };
74977
74978                             if (tryInsert([bbox], entity.id, true)) {
74979                                 p.x = labelX;
74980                                 p.y = labelY;
74981                                 p.textAnchor = 'middle';
74982                                 p.height = height;
74983                                 return true;
74984                             }
74985                         }
74986                         return false;
74987                     }
74988                 }
74989
74990
74991                 // force insert a singular bounding box
74992                 // singular box only, no array, id better be unique
74993                 function doInsert(bbox, id) {
74994                     bbox.id = id;
74995
74996                     var oldbox = _entitybboxes[id];
74997                     if (oldbox) {
74998                         _rdrawn.remove(oldbox);
74999                     }
75000                     _entitybboxes[id] = bbox;
75001                     _rdrawn.insert(bbox);
75002                 }
75003
75004
75005                 function tryInsert(bboxes, id, saveSkipped) {
75006                     var skipped = false;
75007
75008                     for (var i = 0; i < bboxes.length; i++) {
75009                         var bbox = bboxes[i];
75010                         bbox.id = id;
75011
75012                         // Check that label is visible
75013                         if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
75014                             skipped = true;
75015                             break;
75016                         }
75017                         if (_rdrawn.collides(bbox)) {
75018                             skipped = true;
75019                             break;
75020                         }
75021                     }
75022
75023                     _entitybboxes[id] = bboxes;
75024
75025                     if (skipped) {
75026                         if (saveSkipped) {
75027                             _rskipped.load(bboxes);
75028                         }
75029                     } else {
75030                         _rdrawn.load(bboxes);
75031                     }
75032
75033                     return !skipped;
75034                 }
75035
75036
75037                 var layer = selection.selectAll('.layer-osm.labels');
75038                 layer.selectAll('.labels-group')
75039                     .data(['halo', 'label', 'debug'])
75040                     .enter()
75041                     .append('g')
75042                     .attr('class', function(d) { return 'labels-group ' + d; });
75043
75044                 var halo = layer.selectAll('.labels-group.halo');
75045                 var label = layer.selectAll('.labels-group.label');
75046                 var debug = layer.selectAll('.labels-group.debug');
75047
75048                 // points
75049                 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
75050                 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
75051
75052                 // lines
75053                 drawLinePaths(layer, labelled.line, filter, '', positions.line);
75054                 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
75055                 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
75056
75057                 // areas
75058                 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
75059                 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
75060                 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
75061                 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
75062
75063                 // debug
75064                 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
75065                 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
75066
75067                 layer.call(filterLabels);
75068             }
75069
75070
75071             function filterLabels(selection) {
75072                 var drawLayer = selection.selectAll('.layer-osm.labels');
75073                 var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
75074
75075                 layers.selectAll('.nolabel')
75076                     .classed('nolabel', false);
75077
75078                 var mouse = context.mouse();
75079                 var graph = context.graph();
75080                 var selectedIDs = context.selectedIDs();
75081                 var ids = [];
75082                 var pad, bbox;
75083
75084                 // hide labels near the mouse
75085                 if (mouse) {
75086                     pad = 20;
75087                     bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
75088                     var nearMouse = _rdrawn.search(bbox).map(function(entity) { return entity.id; });
75089                     ids.push.apply(ids, nearMouse);
75090                 }
75091
75092                 // hide labels on selected nodes (they look weird when dragging / haloed)
75093                 for (var i = 0; i < selectedIDs.length; i++) {
75094                     var entity = graph.hasEntity(selectedIDs[i]);
75095                     if (entity && entity.type === 'node') {
75096                         ids.push(selectedIDs[i]);
75097                     }
75098                 }
75099
75100                 layers.selectAll(utilEntitySelector(ids))
75101                     .classed('nolabel', true);
75102
75103
75104                 // draw the mouse bbox if debugging is on..
75105                 var debug = selection.selectAll('.labels-group.debug');
75106                 var gj = [];
75107                 if (context.getDebug('collision')) {
75108                     gj = bbox ? [{
75109                         type: 'Polygon',
75110                         coordinates: [[
75111                             [bbox.minX, bbox.minY],
75112                             [bbox.maxX, bbox.minY],
75113                             [bbox.maxX, bbox.maxY],
75114                             [bbox.minX, bbox.maxY],
75115                             [bbox.minX, bbox.minY]
75116                         ]]
75117                     }] : [];
75118                 }
75119
75120                 var box = debug.selectAll('.debug-mouse')
75121                     .data(gj);
75122
75123                 // exit
75124                 box.exit()
75125                     .remove();
75126
75127                 // enter/update
75128                 box.enter()
75129                     .append('path')
75130                     .attr('class', 'debug debug-mouse yellow')
75131                     .merge(box)
75132                     .attr('d', d3_geoPath());
75133             }
75134
75135
75136             var throttleFilterLabels = throttle(filterLabels, 100);
75137
75138
75139             drawLabels.observe = function(selection) {
75140                 var listener = function() { throttleFilterLabels(selection); };
75141                 selection.on('mousemove.hidelabels', listener);
75142                 context.on('enter.hidelabels', listener);
75143             };
75144
75145
75146             drawLabels.off = function(selection) {
75147                 throttleFilterLabels.cancel();
75148                 selection.on('mousemove.hidelabels', null);
75149                 context.on('enter.hidelabels', null);
75150             };
75151
75152
75153             return drawLabels;
75154         }
75155
75156         var _improveOsmEnabled = false;
75157         var _errorService;
75158
75159
75160         function svgImproveOSM(projection, context, dispatch) {
75161             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75162             var minZoom = 12;
75163             var touchLayer = d3_select(null);
75164             var drawLayer = d3_select(null);
75165             var _improveOsmVisible = false;
75166
75167             function markerPath(selection, klass) {
75168                 selection
75169                     .attr('class', klass)
75170                     .attr('transform', 'translate(-10, -28)')
75171                     .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');
75172             }
75173
75174
75175             // Loosely-coupled improveOSM service for fetching errors.
75176             function getService() {
75177                 if (services$1.improveOSM && !_errorService) {
75178                     _errorService = services$1.improveOSM;
75179                     _errorService.on('loaded', throttledRedraw);
75180                 } else if (!services$1.improveOSM && _errorService) {
75181                     _errorService = null;
75182                 }
75183
75184                 return _errorService;
75185             }
75186
75187
75188             // Show the errors
75189             function editOn() {
75190                 if (!_improveOsmVisible) {
75191                     _improveOsmVisible = true;
75192                     drawLayer
75193                         .style('display', 'block');
75194                 }
75195             }
75196
75197
75198             // Immediately remove the errors and their touch targets
75199             function editOff() {
75200                 if (_improveOsmVisible) {
75201                     _improveOsmVisible = false;
75202                     drawLayer
75203                         .style('display', 'none');
75204                     drawLayer.selectAll('.qa_error.improveOSM')
75205                         .remove();
75206                     touchLayer.selectAll('.qa_error.improveOSM')
75207                         .remove();
75208                 }
75209             }
75210
75211
75212             // Enable the layer.  This shows the errors and transitions them to visible.
75213             function layerOn() {
75214                 editOn();
75215
75216                 drawLayer
75217                     .style('opacity', 0)
75218                     .transition()
75219                     .duration(250)
75220                     .style('opacity', 1)
75221                     .on('end interrupt', function () {
75222                         dispatch.call('change');
75223                     });
75224             }
75225
75226
75227             // Disable the layer.  This transitions the layer invisible and then hides the errors.
75228             function layerOff() {
75229                 throttledRedraw.cancel();
75230                 drawLayer.interrupt();
75231                 touchLayer.selectAll('.qa_error.improveOSM')
75232                     .remove();
75233
75234                 drawLayer
75235                     .transition()
75236                     .duration(250)
75237                     .style('opacity', 0)
75238                     .on('end interrupt', function () {
75239                         editOff();
75240                         dispatch.call('change');
75241                     });
75242             }
75243
75244
75245             // Update the error markers
75246             function updateMarkers() {
75247                 if (!_improveOsmVisible || !_improveOsmEnabled) return;
75248
75249                 var service = getService();
75250                 var selectedID = context.selectedErrorID();
75251                 var data = (service ? service.getErrors(projection) : []);
75252                 var getTransform = svgPointTransform(projection);
75253
75254                 // Draw markers..
75255                 var markers = drawLayer.selectAll('.qa_error.improveOSM')
75256                     .data(data, function(d) { return d.id; });
75257
75258                 // exit
75259                 markers.exit()
75260                     .remove();
75261
75262                 // enter
75263                 var markersEnter = markers.enter()
75264                     .append('g')
75265                     .attr('class', function(d) {
75266                         return [
75267                             'qa_error',
75268                             d.service,
75269                             'error_id-' + d.id,
75270                             'error_type-' + d.error_type,
75271                             'category-' + d.category
75272                         ].join(' ');
75273                     });
75274
75275                 markersEnter
75276                     .append('polygon')
75277                     .call(markerPath, 'shadow');
75278
75279                 markersEnter
75280                     .append('ellipse')
75281                     .attr('cx', 0)
75282                     .attr('cy', 0)
75283                     .attr('rx', 4.5)
75284                     .attr('ry', 2)
75285                     .attr('class', 'stroke');
75286
75287                 markersEnter
75288                     .append('polygon')
75289                     .attr('fill', 'currentColor')
75290                     .call(markerPath, 'qa_error-fill');
75291
75292                 markersEnter
75293                     .append('use')
75294                     .attr('transform', 'translate(-5.5, -21)')
75295                     .attr('class', 'icon-annotation')
75296                     .attr('width', '11px')
75297                     .attr('height', '11px')
75298                     .attr('xlink:href', function(d) {
75299                         var picon = d.icon;
75300
75301                         if (!picon) {
75302                             return '';
75303                         } else {
75304                             var isMaki = /^maki-/.test(picon);
75305                             return '#' + picon + (isMaki ? '-11' : '');
75306                         }
75307                     });
75308
75309                 // update
75310                 markers
75311                     .merge(markersEnter)
75312                     .sort(sortY)
75313                     .classed('selected', function(d) { return d.id === selectedID; })
75314                     .attr('transform', getTransform);
75315
75316
75317                 // Draw targets..
75318                 if (touchLayer.empty()) return;
75319                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
75320
75321                 var targets = touchLayer.selectAll('.qa_error.improveOSM')
75322                     .data(data, function(d) { return d.id; });
75323
75324                 // exit
75325                 targets.exit()
75326                     .remove();
75327
75328                 // enter/update
75329                 targets.enter()
75330                     .append('rect')
75331                     .attr('width', '20px')
75332                     .attr('height', '30px')
75333                     .attr('x', '-10px')
75334                     .attr('y', '-28px')
75335                     .merge(targets)
75336                     .sort(sortY)
75337                     .attr('class', function(d) {
75338                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
75339                     })
75340                     .attr('transform', getTransform);
75341
75342
75343                 function sortY(a, b) {
75344                     return (a.id === selectedID) ? 1
75345                         : (b.id === selectedID) ? -1
75346                         : b.loc[1] - a.loc[1];
75347                 }
75348             }
75349
75350
75351             // Draw the ImproveOSM layer and schedule loading errors and updating markers.
75352             function drawImproveOSM(selection) {
75353                 var service = getService();
75354
75355                 var surface = context.surface();
75356                 if (surface && !surface.empty()) {
75357                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
75358                 }
75359
75360                 drawLayer = selection.selectAll('.layer-improveOSM')
75361                     .data(service ? [0] : []);
75362
75363                 drawLayer.exit()
75364                     .remove();
75365
75366                 drawLayer = drawLayer.enter()
75367                     .append('g')
75368                     .attr('class', 'layer-improveOSM')
75369                     .style('display', _improveOsmEnabled ? 'block' : 'none')
75370                     .merge(drawLayer);
75371
75372                 if (_improveOsmEnabled) {
75373                     if (service && ~~context.map().zoom() >= minZoom) {
75374                         editOn();
75375                         service.loadErrors(projection);
75376                         updateMarkers();
75377                     } else {
75378                         editOff();
75379                     }
75380                 }
75381             }
75382
75383
75384             // Toggles the layer on and off
75385             drawImproveOSM.enabled = function(val) {
75386                 if (!arguments.length) return _improveOsmEnabled;
75387
75388                 _improveOsmEnabled = val;
75389                 if (_improveOsmEnabled) {
75390                     layerOn();
75391                 } else {
75392                     layerOff();
75393                     if (context.selectedErrorID()) {
75394                         context.enter(modeBrowse(context));
75395                     }
75396                 }
75397
75398                 dispatch.call('change');
75399                 return this;
75400             };
75401
75402
75403             drawImproveOSM.supported = function() {
75404                 return !!getService();
75405             };
75406
75407
75408             return drawImproveOSM;
75409         }
75410
75411         function svgStreetside(projection, context, dispatch) {
75412             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75413             var minZoom = 14;
75414             var minMarkerZoom = 16;
75415             var minViewfieldZoom = 18;
75416             var layer = d3_select(null);
75417             var _viewerYaw = 0;
75418             var _selectedSequence = null;
75419             var _streetside;
75420
75421             /**
75422              * init().
75423              */
75424             function init() {
75425                 if (svgStreetside.initialized) return;  // run once
75426                 svgStreetside.enabled = false;
75427                 svgStreetside.initialized = true;
75428             }
75429
75430             /**
75431              * getService().
75432              */
75433             function getService() {
75434                 if (services$1.streetside && !_streetside) {
75435                     _streetside = services$1.streetside;
75436                     _streetside.event
75437                         .on('viewerChanged', viewerChanged)
75438                         .on('loadedBubbles', throttledRedraw);
75439                 } else if (!services$1.streetside && _streetside) {
75440                     _streetside = null;
75441                 }
75442
75443                 return _streetside;
75444             }
75445
75446             /**
75447              * showLayer().
75448              */
75449             function showLayer() {
75450                 var service = getService();
75451                 if (!service) return;
75452
75453                 editOn();
75454
75455                 layer
75456                     .style('opacity', 0)
75457                     .transition()
75458                     .duration(250)
75459                     .style('opacity', 1)
75460                     .on('end', function () { dispatch.call('change'); });
75461             }
75462
75463             /**
75464              * hideLayer().
75465              */
75466             function hideLayer() {
75467                 throttledRedraw.cancel();
75468
75469                 layer
75470                     .transition()
75471                     .duration(250)
75472                     .style('opacity', 0)
75473                     .on('end', editOff);
75474             }
75475
75476             /**
75477              * editOn().
75478              */
75479             function editOn() {
75480                 layer.style('display', 'block');
75481             }
75482
75483             /**
75484              * editOff().
75485              */
75486             function editOff() {
75487                 layer.selectAll('.viewfield-group').remove();
75488                 layer.style('display', 'none');
75489             }
75490
75491             /**
75492              * click() Handles 'bubble' point click event.
75493              */
75494             function click(d) {
75495                 var service = getService();
75496                 if (!service) return;
75497
75498                 // try to preserve the viewer rotation when staying on the same sequence
75499                 if (d.sequenceKey !== _selectedSequence) {
75500                     _viewerYaw = 0;  // reset
75501                 }
75502                 _selectedSequence = d.sequenceKey;
75503
75504                 service
75505                     .selectImage(d)
75506                     .then(function(r) {
75507                         if (r.status === 'ok'){
75508                             service.showViewer(_viewerYaw);
75509                         }
75510                     });
75511
75512
75513                 context.map().centerEase(d.loc);
75514             }
75515
75516             /**
75517              * mouseover().
75518              */
75519             function mouseover(d) {
75520                 var service = getService();
75521                 if (service) service.setStyles(d);
75522             }
75523
75524             /**
75525              * mouseout().
75526              */
75527             function mouseout() {
75528                 var service = getService();
75529                 if (service) service.setStyles(null);
75530             }
75531
75532             /**
75533              * transform().
75534              */
75535             function transform(d) {
75536                 var t = svgPointTransform(projection)(d);
75537                 var rot = d.ca + _viewerYaw;
75538                 if (rot) {
75539                     t += ' rotate(' + Math.floor(rot) + ',0,0)';
75540                 }
75541                 return t;
75542             }
75543
75544
75545             function viewerChanged() {
75546                 var service = getService();
75547                 if (!service) return;
75548
75549                 var viewer = service.viewer();
75550                 if (!viewer) return;
75551
75552                 // update viewfield rotation
75553                 _viewerYaw = viewer.getYaw();
75554
75555                 // avoid updating if the map is currently transformed
75556                 // e.g. during drags or easing.
75557                 if (context.map().isTransformed()) return;
75558
75559                 layer.selectAll('.viewfield-group.currentView')
75560                     .attr('transform', transform);
75561             }
75562
75563
75564             context.photos().on('change.streetside', update);
75565
75566             /**
75567              * update().
75568              */
75569             function update() {
75570                 var viewer = d3_select('#photoviewer');
75571                 var selected = viewer.empty() ? undefined : viewer.datum();
75572                 var z = ~~context.map().zoom();
75573                 var showMarkers = (z >= minMarkerZoom);
75574                 var showViewfields = (z >= minViewfieldZoom);
75575                 var service = getService();
75576
75577                 var sequences = [];
75578                 var bubbles = [];
75579
75580                 if (context.photos().showsPanoramic()) {
75581                     sequences = (service ? service.sequences(projection) : []);
75582                     bubbles = (service && showMarkers ? service.bubbles(projection) : []);
75583                 }
75584
75585                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75586                     .data(sequences, function(d) { return d.properties.key; });
75587
75588                 // exit
75589                 traces.exit()
75590                     .remove();
75591
75592                 // enter/update
75593                 traces = traces.enter()
75594                     .append('path')
75595                     .attr('class', 'sequence')
75596                     .merge(traces)
75597                     .attr('d', svgPath(projection).geojson);
75598
75599
75600                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75601                     .data(bubbles, function(d) {
75602                         // force reenter once bubbles are attached to a sequence
75603                         return d.key + (d.sequenceKey ? 'v1' : 'v0');
75604                     });
75605
75606                 // exit
75607                 groups.exit()
75608                     .remove();
75609
75610                 // enter
75611                 var groupsEnter = groups.enter()
75612                     .append('g')
75613                     .attr('class', 'viewfield-group')
75614                     .on('mouseenter', mouseover)
75615                     .on('mouseleave', mouseout)
75616                     .on('click', click);
75617
75618                 groupsEnter
75619                     .append('g')
75620                     .attr('class', 'viewfield-scale');
75621
75622                 // update
75623                 var markers = groups
75624                     .merge(groupsEnter)
75625                     .sort(function(a, b) {
75626                         return (a === selected) ? 1
75627                             : (b === selected) ? -1
75628                             : b.loc[1] - a.loc[1];
75629                     })
75630                     .attr('transform', transform)
75631                     .select('.viewfield-scale');
75632
75633
75634                 markers.selectAll('circle')
75635                     .data([0])
75636                     .enter()
75637                     .append('circle')
75638                     .attr('dx', '0')
75639                     .attr('dy', '0')
75640                     .attr('r', '6');
75641
75642                 var viewfields = markers.selectAll('.viewfield')
75643                     .data(showViewfields ? [0] : []);
75644
75645                 viewfields.exit()
75646                     .remove();
75647
75648                 // viewfields may or may not be drawn...
75649                 // but if they are, draw below the circles
75650                 viewfields.enter()
75651                     .insert('path', 'circle')
75652                     .attr('class', 'viewfield')
75653                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75654                     .attr('d', viewfieldPath);
75655
75656                 function viewfieldPath() {
75657                     var d = this.parentNode.__data__;
75658                     if (d.pano) {
75659                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75660                     } else {
75661                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75662                     }
75663                 }
75664
75665             }
75666
75667             /**
75668              * drawImages()
75669              * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
75670              * 'svgStreetside()' is called from index.js
75671              */
75672             function drawImages(selection) {
75673                 var enabled = svgStreetside.enabled;
75674                 var service = getService();
75675
75676                 layer = selection.selectAll('.layer-streetside-images')
75677                     .data(service ? [0] : []);
75678
75679                 layer.exit()
75680                     .remove();
75681
75682                 var layerEnter = layer.enter()
75683                     .append('g')
75684                     .attr('class', 'layer-streetside-images')
75685                     .style('display', enabled ? 'block' : 'none');
75686
75687                 layerEnter
75688                     .append('g')
75689                     .attr('class', 'sequences');
75690
75691                 layerEnter
75692                     .append('g')
75693                     .attr('class', 'markers');
75694
75695                 layer = layerEnter
75696                     .merge(layer);
75697
75698                 if (enabled) {
75699                     if (service && ~~context.map().zoom() >= minZoom) {
75700                         editOn();
75701                         update();
75702                         service.loadBubbles(projection);
75703                     } else {
75704                         editOff();
75705                     }
75706                 }
75707             }
75708
75709
75710             /**
75711              * drawImages.enabled().
75712              */
75713             drawImages.enabled = function(_) {
75714                 if (!arguments.length) return svgStreetside.enabled;
75715                 svgStreetside.enabled = _;
75716                 if (svgStreetside.enabled) {
75717                     showLayer();
75718                 } else {
75719                     hideLayer();
75720                 }
75721                 dispatch.call('change');
75722                 return this;
75723             };
75724
75725             /**
75726              * drawImages.supported().
75727              */
75728             drawImages.supported = function() {
75729                 return !!getService();
75730             };
75731
75732             init();
75733
75734             return drawImages;
75735         }
75736
75737         function svgMapillaryImages(projection, context, dispatch) {
75738             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75739             var minZoom = 12;
75740             var minMarkerZoom = 16;
75741             var minViewfieldZoom = 18;
75742             var layer = d3_select(null);
75743             var _mapillary;
75744             var viewerCompassAngle;
75745
75746
75747             function init() {
75748                 if (svgMapillaryImages.initialized) return;  // run once
75749                 svgMapillaryImages.enabled = false;
75750                 svgMapillaryImages.initialized = true;
75751             }
75752
75753
75754             function getService() {
75755                 if (services$1.mapillary && !_mapillary) {
75756                     _mapillary = services$1.mapillary;
75757                     _mapillary.event.on('loadedImages', throttledRedraw);
75758                     _mapillary.event.on('bearingChanged', function(e) {
75759                         viewerCompassAngle = e;
75760
75761                         // avoid updating if the map is currently transformed
75762                         // e.g. during drags or easing.
75763                         if (context.map().isTransformed()) return;
75764
75765                         layer.selectAll('.viewfield-group.currentView')
75766                             .filter(function(d) {
75767                                 return d.pano;
75768                             })
75769                             .attr('transform', transform);
75770                     });
75771                 } else if (!services$1.mapillary && _mapillary) {
75772                     _mapillary = null;
75773                 }
75774
75775                 return _mapillary;
75776             }
75777
75778
75779             function showLayer() {
75780                 var service = getService();
75781                 if (!service) return;
75782
75783                 editOn();
75784
75785                 layer
75786                     .style('opacity', 0)
75787                     .transition()
75788                     .duration(250)
75789                     .style('opacity', 1)
75790                     .on('end', function () { dispatch.call('change'); });
75791             }
75792
75793
75794             function hideLayer() {
75795                 throttledRedraw.cancel();
75796
75797                 layer
75798                     .transition()
75799                     .duration(250)
75800                     .style('opacity', 0)
75801                     .on('end', editOff);
75802             }
75803
75804
75805             function editOn() {
75806                 layer.style('display', 'block');
75807             }
75808
75809
75810             function editOff() {
75811                 layer.selectAll('.viewfield-group').remove();
75812                 layer.style('display', 'none');
75813             }
75814
75815
75816             function click(d) {
75817                 var service = getService();
75818                 if (!service) return;
75819
75820                 service
75821                     .selectImage(d)
75822                     .updateViewer(d.key, context)
75823                     .showViewer();
75824
75825                 context.map().centerEase(d.loc);
75826             }
75827
75828
75829             function mouseover(d) {
75830                 var service = getService();
75831                 if (service) service.setStyles(d);
75832             }
75833
75834
75835             function mouseout() {
75836                 var service = getService();
75837                 if (service) service.setStyles(null);
75838             }
75839
75840
75841             function transform(d) {
75842                 var t = svgPointTransform(projection)(d);
75843                 if (d.pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
75844                     t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
75845                 } else if (d.ca) {
75846                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
75847                 }
75848                 return t;
75849             }
75850
75851             context.photos().on('change.mapillary_images', update);
75852
75853             function filterImages(images) {
75854                 var showsPano = context.photos().showsPanoramic();
75855                 var showsFlat = context.photos().showsFlat();
75856                 if (!showsPano || !showsFlat) {
75857                     images = images.filter(function(image) {
75858                         if (image.pano) return showsPano;
75859                         return showsFlat;
75860                     });
75861                 }
75862                 return images;
75863             }
75864
75865             function filterSequences(sequences, service) {
75866                 var showsPano = context.photos().showsPanoramic();
75867                 var showsFlat = context.photos().showsFlat();
75868                 if (!showsPano || !showsFlat) {
75869                     sequences = sequences.filter(function(sequence) {
75870                         if (sequence.properties.hasOwnProperty('pano')) {
75871                             if (sequence.properties.pano) return showsPano;
75872                             return showsFlat;
75873                         } else {
75874                             // if the sequence doesn't specify pano or not, search its images
75875                             var cProps = sequence.properties.coordinateProperties;
75876                             if (cProps && cProps.image_keys && cProps.image_keys.length > 0) {
75877                                 for (var index in cProps.image_keys) {
75878                                     var imageKey = cProps.image_keys[index];
75879                                     var image = service.cachedImage(imageKey);
75880                                     if (image && image.hasOwnProperty('pano')) {
75881                                         if (image.pano) return showsPano;
75882                                         return showsFlat;
75883                                     }
75884                                 }
75885                             }
75886                         }
75887                     });
75888                 }
75889                 return sequences;
75890             }
75891
75892             function update() {
75893                 var viewer = d3_select('#photoviewer');
75894                 var selected = viewer.empty() ? undefined : viewer.datum();
75895
75896                 var z = ~~context.map().zoom();
75897                 var showMarkers = (z >= minMarkerZoom);
75898                 var showViewfields = (z >= minViewfieldZoom);
75899
75900                 var service = getService();
75901                 var sequences = (service ? service.sequences(projection) : []);
75902                 var images = (service && showMarkers ? service.images(projection) : []);
75903
75904                 images = filterImages(images);
75905                 sequences = filterSequences(sequences, service);
75906
75907                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75908                     .data(sequences, function(d) { return d.properties.key; });
75909
75910                 // exit
75911                 traces.exit()
75912                     .remove();
75913
75914                 // enter/update
75915                 traces = traces.enter()
75916                     .append('path')
75917                     .attr('class', 'sequence')
75918                     .merge(traces)
75919                     .attr('d', svgPath(projection).geojson);
75920
75921
75922                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75923                     .data(images, function(d) { return d.key; });
75924
75925                 // exit
75926                 groups.exit()
75927                     .remove();
75928
75929                 // enter
75930                 var groupsEnter = groups.enter()
75931                     .append('g')
75932                     .attr('class', 'viewfield-group')
75933                     .on('mouseenter', mouseover)
75934                     .on('mouseleave', mouseout)
75935                     .on('click', click);
75936
75937                 groupsEnter
75938                     .append('g')
75939                     .attr('class', 'viewfield-scale');
75940
75941                 // update
75942                 var markers = groups
75943                     .merge(groupsEnter)
75944                     .sort(function(a, b) {
75945                         return (a === selected) ? 1
75946                             : (b === selected) ? -1
75947                             : b.loc[1] - a.loc[1];  // sort Y
75948                     })
75949                     .attr('transform', transform)
75950                     .select('.viewfield-scale');
75951
75952
75953                 markers.selectAll('circle')
75954                     .data([0])
75955                     .enter()
75956                     .append('circle')
75957                     .attr('dx', '0')
75958                     .attr('dy', '0')
75959                     .attr('r', '6');
75960
75961                 var viewfields = markers.selectAll('.viewfield')
75962                     .data(showViewfields ? [0] : []);
75963
75964                 viewfields.exit()
75965                     .remove();
75966
75967                 viewfields.enter()               // viewfields may or may not be drawn...
75968                     .insert('path', 'circle')    // but if they are, draw below the circles
75969                     .attr('class', 'viewfield')
75970                     .classed('pano', function() { return this.parentNode.__data__.pano; })
75971                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75972                     .attr('d', viewfieldPath);
75973
75974                 function viewfieldPath() {
75975                     var d = this.parentNode.__data__;
75976                     if (d.pano) {
75977                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75978                     } else {
75979                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75980                     }
75981                 }
75982             }
75983
75984
75985             function drawImages(selection) {
75986                 var enabled = svgMapillaryImages.enabled;
75987                 var service = getService();
75988
75989                 layer = selection.selectAll('.layer-mapillary')
75990                     .data(service ? [0] : []);
75991
75992                 layer.exit()
75993                     .remove();
75994
75995                 var layerEnter = layer.enter()
75996                     .append('g')
75997                     .attr('class', 'layer-mapillary')
75998                     .style('display', enabled ? 'block' : 'none');
75999
76000                 layerEnter
76001                     .append('g')
76002                     .attr('class', 'sequences');
76003
76004                 layerEnter
76005                     .append('g')
76006                     .attr('class', 'markers');
76007
76008                 layer = layerEnter
76009                     .merge(layer);
76010
76011                 if (enabled) {
76012                     if (service && ~~context.map().zoom() >= minZoom) {
76013                         editOn();
76014                         update();
76015                         service.loadImages(projection);
76016                     } else {
76017                         editOff();
76018                     }
76019                 }
76020             }
76021
76022
76023             drawImages.enabled = function(_) {
76024                 if (!arguments.length) return svgMapillaryImages.enabled;
76025                 svgMapillaryImages.enabled = _;
76026                 if (svgMapillaryImages.enabled) {
76027                     showLayer();
76028                 } else {
76029                     hideLayer();
76030                 }
76031                 dispatch.call('change');
76032                 return this;
76033             };
76034
76035
76036             drawImages.supported = function() {
76037                 return !!getService();
76038             };
76039
76040
76041             init();
76042             return drawImages;
76043         }
76044
76045         function svgMapillarySigns(projection, context, dispatch) {
76046             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76047             var minZoom = 12;
76048             var layer = d3_select(null);
76049             var _mapillary;
76050
76051
76052             function init() {
76053                 if (svgMapillarySigns.initialized) return;  // run once
76054                 svgMapillarySigns.enabled = false;
76055                 svgMapillarySigns.initialized = true;
76056             }
76057
76058
76059             function getService() {
76060                 if (services$1.mapillary && !_mapillary) {
76061                     _mapillary = services$1.mapillary;
76062                     _mapillary.event.on('loadedSigns', throttledRedraw);
76063                 } else if (!services$1.mapillary && _mapillary) {
76064                     _mapillary = null;
76065                 }
76066                 return _mapillary;
76067             }
76068
76069
76070             function showLayer() {
76071                 var service = getService();
76072                 if (!service) return;
76073
76074                 editOn();
76075             }
76076
76077
76078             function hideLayer() {
76079                 throttledRedraw.cancel();
76080                 editOff();
76081             }
76082
76083
76084             function editOn() {
76085                 layer.style('display', 'block');
76086             }
76087
76088
76089             function editOff() {
76090                 layer.selectAll('.icon-sign').remove();
76091                 layer.style('display', 'none');
76092             }
76093
76094
76095             function click(d) {
76096                 var service = getService();
76097                 if (!service) return;
76098
76099                 context.map().centerEase(d.loc);
76100
76101                 var selected = service.getSelectedImage();
76102                 var selectedImageKey = selected && selected.key;
76103                 var imageKey;
76104
76105                 // Pick one of the images the sign was detected in,
76106                 // preference given to an image already selected.
76107                 d.detections.forEach(function(detection) {
76108                     if (!imageKey || selectedImageKey === detection.image_key) {
76109                         imageKey = detection.image_key;
76110                     }
76111                 });
76112
76113                 service
76114                     .selectImage(null, imageKey)
76115                     .updateViewer(imageKey, context)
76116                     .showViewer();
76117             }
76118
76119
76120             function update() {
76121                 var service = getService();
76122                 var data = (service ? service.signs(projection) : []);
76123                 var viewer = d3_select('#photoviewer');
76124                 var selected = viewer.empty() ? undefined : viewer.datum();
76125                 var selectedImageKey = selected && selected.key;
76126                 var transform = svgPointTransform(projection);
76127
76128                 var signs = layer.selectAll('.icon-sign')
76129                     .data(data, function(d) { return d.key; });
76130
76131                 // exit
76132                 signs.exit()
76133                     .remove();
76134
76135                 // enter
76136                 var enter = signs.enter()
76137                     .append('use')
76138                     .attr('class', 'icon-sign')
76139                     .attr('width', '24px')
76140                     .attr('height', '24px')
76141                     .attr('x', '-12px')
76142                     .attr('y', '-12px')
76143                     .attr('xlink:href', function(d) { return '#' + d.value; })
76144                     .classed('currentView', function(d) {
76145                         return d.detections.some(function(detection) {
76146                             return detection.image_key === selectedImageKey;
76147                         });
76148                     })
76149                     .on('click', click);
76150
76151                 // update
76152                 signs
76153                     .merge(enter)
76154                     .sort(function(a, b) {
76155                         return (a === selected) ? 1
76156                             : (b === selected) ? -1
76157                             : b.loc[1] - a.loc[1];  // sort Y
76158                     })
76159                     .attr('transform', transform);
76160             }
76161
76162
76163             function drawSigns(selection) {
76164                 var enabled = svgMapillarySigns.enabled;
76165                 var service = getService();
76166
76167                 layer = selection.selectAll('.layer-mapillary-signs')
76168                     .data(service ? [0] : []);
76169
76170                 layer.exit()
76171                     .remove();
76172
76173                 layer = layer.enter()
76174                     .append('g')
76175                     .attr('class', 'layer-mapillary-signs')
76176                     .style('display', enabled ? 'block' : 'none')
76177                     .merge(layer);
76178
76179                 if (enabled) {
76180                     if (service && ~~context.map().zoom() >= minZoom) {
76181                         editOn();
76182                         update();
76183                         service.loadSigns(projection);
76184                     } else {
76185                         editOff();
76186                     }
76187                 }
76188             }
76189
76190
76191             drawSigns.enabled = function(_) {
76192                 if (!arguments.length) return svgMapillarySigns.enabled;
76193                 svgMapillarySigns.enabled = _;
76194                 if (svgMapillarySigns.enabled) {
76195                     showLayer();
76196                 } else {
76197                     hideLayer();
76198                 }
76199                 dispatch.call('change');
76200                 return this;
76201             };
76202
76203
76204             drawSigns.supported = function() {
76205                 return !!getService();
76206             };
76207
76208
76209             init();
76210             return drawSigns;
76211         }
76212
76213         function svgOpenstreetcamImages(projection, context, dispatch) {
76214             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76215             var minZoom = 12;
76216             var minMarkerZoom = 16;
76217             var minViewfieldZoom = 18;
76218             var layer = d3_select(null);
76219             var _openstreetcam;
76220
76221
76222             function init() {
76223                 if (svgOpenstreetcamImages.initialized) return;  // run once
76224                 svgOpenstreetcamImages.enabled = false;
76225                 svgOpenstreetcamImages.initialized = true;
76226             }
76227
76228
76229             function getService() {
76230                 if (services$1.openstreetcam && !_openstreetcam) {
76231                     _openstreetcam = services$1.openstreetcam;
76232                     _openstreetcam.event.on('loadedImages', throttledRedraw);
76233                 } else if (!services$1.openstreetcam && _openstreetcam) {
76234                     _openstreetcam = null;
76235                 }
76236
76237                 return _openstreetcam;
76238             }
76239
76240
76241             function showLayer() {
76242                 var service = getService();
76243                 if (!service) return;
76244
76245                 editOn();
76246
76247                 layer
76248                     .style('opacity', 0)
76249                     .transition()
76250                     .duration(250)
76251                     .style('opacity', 1)
76252                     .on('end', function () { dispatch.call('change'); });
76253             }
76254
76255
76256             function hideLayer() {
76257                 throttledRedraw.cancel();
76258
76259                 layer
76260                     .transition()
76261                     .duration(250)
76262                     .style('opacity', 0)
76263                     .on('end', editOff);
76264             }
76265
76266
76267             function editOn() {
76268                 layer.style('display', 'block');
76269             }
76270
76271
76272             function editOff() {
76273                 layer.selectAll('.viewfield-group').remove();
76274                 layer.style('display', 'none');
76275             }
76276
76277
76278             function click(d) {
76279                 var service = getService();
76280                 if (!service) return;
76281
76282                 service
76283                     .selectImage(d)
76284                     .updateViewer(d)
76285                     .showViewer();
76286
76287                 context.map().centerEase(d.loc);
76288             }
76289
76290
76291             function mouseover(d) {
76292                 var service = getService();
76293                 if (service) service.setStyles(d);
76294             }
76295
76296
76297             function mouseout() {
76298                 var service = getService();
76299                 if (service) service.setStyles(null);
76300             }
76301
76302
76303             function transform(d) {
76304                 var t = svgPointTransform(projection)(d);
76305                 if (d.ca) {
76306                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
76307                 }
76308                 return t;
76309             }
76310
76311
76312             context.photos().on('change.openstreetcam_images', update);
76313
76314             function update() {
76315                 var viewer = d3_select('#photoviewer');
76316                 var selected = viewer.empty() ? undefined : viewer.datum();
76317
76318                 var z = ~~context.map().zoom();
76319                 var showMarkers = (z >= minMarkerZoom);
76320                 var showViewfields = (z >= minViewfieldZoom);
76321
76322                 var service = getService();
76323                 var sequences = [];
76324                 var images = [];
76325
76326                 if (context.photos().showsFlat()) {
76327                     sequences = (service ? service.sequences(projection) : []);
76328                     images = (service && showMarkers ? service.images(projection) : []);
76329                 }
76330
76331                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
76332                     .data(sequences, function(d) { return d.properties.key; });
76333
76334                 // exit
76335                 traces.exit()
76336                     .remove();
76337
76338                 // enter/update
76339                 traces = traces.enter()
76340                     .append('path')
76341                     .attr('class', 'sequence')
76342                     .merge(traces)
76343                     .attr('d', svgPath(projection).geojson);
76344
76345
76346                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
76347                     .data(images, function(d) { return d.key; });
76348
76349                 // exit
76350                 groups.exit()
76351                     .remove();
76352
76353                 // enter
76354                 var groupsEnter = groups.enter()
76355                     .append('g')
76356                     .attr('class', 'viewfield-group')
76357                     .on('mouseenter', mouseover)
76358                     .on('mouseleave', mouseout)
76359                     .on('click', click);
76360
76361                 groupsEnter
76362                     .append('g')
76363                     .attr('class', 'viewfield-scale');
76364
76365                 // update
76366                 var markers = groups
76367                     .merge(groupsEnter)
76368                     .sort(function(a, b) {
76369                         return (a === selected) ? 1
76370                             : (b === selected) ? -1
76371                             : b.loc[1] - a.loc[1];  // sort Y
76372                     })
76373                     .attr('transform', transform)
76374                     .select('.viewfield-scale');
76375
76376
76377                 markers.selectAll('circle')
76378                     .data([0])
76379                     .enter()
76380                     .append('circle')
76381                     .attr('dx', '0')
76382                     .attr('dy', '0')
76383                     .attr('r', '6');
76384
76385                 var viewfields = markers.selectAll('.viewfield')
76386                     .data(showViewfields ? [0] : []);
76387
76388                 viewfields.exit()
76389                     .remove();
76390
76391                 viewfields.enter()               // viewfields may or may not be drawn...
76392                     .insert('path', 'circle')    // but if they are, draw below the circles
76393                     .attr('class', 'viewfield')
76394                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76395                     .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');
76396             }
76397
76398
76399             function drawImages(selection) {
76400                 var enabled = svgOpenstreetcamImages.enabled,
76401                     service = getService();
76402
76403                 layer = selection.selectAll('.layer-openstreetcam')
76404                     .data(service ? [0] : []);
76405
76406                 layer.exit()
76407                     .remove();
76408
76409                 var layerEnter = layer.enter()
76410                     .append('g')
76411                     .attr('class', 'layer-openstreetcam')
76412                     .style('display', enabled ? 'block' : 'none');
76413
76414                 layerEnter
76415                     .append('g')
76416                     .attr('class', 'sequences');
76417
76418                 layerEnter
76419                     .append('g')
76420                     .attr('class', 'markers');
76421
76422                 layer = layerEnter
76423                     .merge(layer);
76424
76425                 if (enabled) {
76426                     if (service && ~~context.map().zoom() >= minZoom) {
76427                         editOn();
76428                         update();
76429                         service.loadImages(projection);
76430                     } else {
76431                         editOff();
76432                     }
76433                 }
76434             }
76435
76436
76437             drawImages.enabled = function(_) {
76438                 if (!arguments.length) return svgOpenstreetcamImages.enabled;
76439                 svgOpenstreetcamImages.enabled = _;
76440                 if (svgOpenstreetcamImages.enabled) {
76441                     showLayer();
76442                 } else {
76443                     hideLayer();
76444                 }
76445                 dispatch.call('change');
76446                 return this;
76447             };
76448
76449
76450             drawImages.supported = function() {
76451                 return !!getService();
76452             };
76453
76454
76455             init();
76456             return drawImages;
76457         }
76458
76459         function svgOsm(projection, context, dispatch) {
76460             var enabled = true;
76461
76462
76463             function drawOsm(selection) {
76464                 selection.selectAll('.layer-osm')
76465                     .data(['covered', 'areas', 'lines', 'points', 'labels'])
76466                     .enter()
76467                     .append('g')
76468                     .attr('class', function(d) { return 'layer-osm ' + d; });
76469
76470                 selection.selectAll('.layer-osm.points').selectAll('.points-group')
76471                     .data(['points', 'midpoints', 'vertices', 'turns'])
76472                     .enter()
76473                     .append('g')
76474                     .attr('class', function(d) { return 'points-group ' + d; });
76475             }
76476
76477
76478             function showLayer() {
76479                 var layer = context.surface().selectAll('.data-layer.osm');
76480                 layer.interrupt();
76481
76482                 layer
76483                     .classed('disabled', false)
76484                     .style('opacity', 0)
76485                     .transition()
76486                     .duration(250)
76487                     .style('opacity', 1)
76488                     .on('end interrupt', function () {
76489                         dispatch.call('change');
76490                     });
76491             }
76492
76493
76494             function hideLayer() {
76495                 var layer = context.surface().selectAll('.data-layer.osm');
76496                 layer.interrupt();
76497
76498                 layer
76499                     .transition()
76500                     .duration(250)
76501                     .style('opacity', 0)
76502                     .on('end interrupt', function () {
76503                         layer.classed('disabled', true);
76504                         dispatch.call('change');
76505                     });
76506             }
76507
76508
76509             drawOsm.enabled = function(val) {
76510                 if (!arguments.length) return enabled;
76511                 enabled = val;
76512
76513                 if (enabled) {
76514                     showLayer();
76515                 } else {
76516                     hideLayer();
76517                 }
76518
76519                 dispatch.call('change');
76520                 return this;
76521             };
76522
76523
76524             return drawOsm;
76525         }
76526
76527         var _notesEnabled = false;
76528         var _osmService;
76529
76530
76531         function svgNotes(projection, context, dispatch$1) {
76532             if (!dispatch$1) { dispatch$1 = dispatch('change'); }
76533             var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
76534             var minZoom = 12;
76535             var touchLayer = d3_select(null);
76536             var drawLayer = d3_select(null);
76537             var _notesVisible = false;
76538
76539
76540             function markerPath(selection, klass) {
76541                 selection
76542                     .attr('class', klass)
76543                     .attr('transform', 'translate(-8, -22)')
76544                     .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');
76545             }
76546
76547
76548             // Loosely-coupled osm service for fetching notes.
76549             function getService() {
76550                 if (services$1.osm && !_osmService) {
76551                     _osmService = services$1.osm;
76552                     _osmService.on('loadedNotes', throttledRedraw);
76553                 } else if (!services$1.osm && _osmService) {
76554                     _osmService = null;
76555                 }
76556
76557                 return _osmService;
76558             }
76559
76560
76561             // Show the notes
76562             function editOn() {
76563                 if (!_notesVisible) {
76564                     _notesVisible = true;
76565                     drawLayer
76566                         .style('display', 'block');
76567                 }
76568             }
76569
76570
76571             // Immediately remove the notes and their touch targets
76572             function editOff() {
76573                 if (_notesVisible) {
76574                     _notesVisible = false;
76575                     drawLayer
76576                         .style('display', 'none');
76577                     drawLayer.selectAll('.note')
76578                         .remove();
76579                     touchLayer.selectAll('.note')
76580                         .remove();
76581                 }
76582             }
76583
76584
76585             // Enable the layer.  This shows the notes and transitions them to visible.
76586             function layerOn() {
76587                 editOn();
76588
76589                 drawLayer
76590                     .style('opacity', 0)
76591                     .transition()
76592                     .duration(250)
76593                     .style('opacity', 1)
76594                     .on('end interrupt', function () {
76595                         dispatch$1.call('change');
76596                     });
76597             }
76598
76599
76600             // Disable the layer.  This transitions the layer invisible and then hides the notes.
76601             function layerOff() {
76602                 throttledRedraw.cancel();
76603                 drawLayer.interrupt();
76604                 touchLayer.selectAll('.note')
76605                     .remove();
76606
76607                 drawLayer
76608                     .transition()
76609                     .duration(250)
76610                     .style('opacity', 0)
76611                     .on('end interrupt', function () {
76612                         editOff();
76613                         dispatch$1.call('change');
76614                     });
76615             }
76616
76617
76618             // Update the note markers
76619             function updateMarkers() {
76620                 if (!_notesVisible || !_notesEnabled) return;
76621
76622                 var service = getService();
76623                 var selectedID = context.selectedNoteID();
76624                 var data = (service ? service.notes(projection) : []);
76625                 var getTransform = svgPointTransform(projection);
76626
76627                 // Draw markers..
76628                 var notes = drawLayer.selectAll('.note')
76629                     .data(data, function(d) { return d.status + d.id; });
76630
76631                 // exit
76632                 notes.exit()
76633                     .remove();
76634
76635                 // enter
76636                 var notesEnter = notes.enter()
76637                     .append('g')
76638                     .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
76639                     .classed('new', function(d) { return d.id < 0; });
76640
76641                 notesEnter
76642                     .append('ellipse')
76643                     .attr('cx', 0.5)
76644                     .attr('cy', 1)
76645                     .attr('rx', 6.5)
76646                     .attr('ry', 3)
76647                     .attr('class', 'stroke');
76648
76649                 notesEnter
76650                     .append('path')
76651                     .call(markerPath, 'shadow');
76652
76653                 notesEnter
76654                     .append('use')
76655                     .attr('class', 'note-fill')
76656                     .attr('width', '20px')
76657                     .attr('height', '20px')
76658                     .attr('x', '-8px')
76659                     .attr('y', '-22px')
76660                     .attr('xlink:href', '#iD-icon-note');
76661
76662                 notesEnter.selectAll('.icon-annotation')
76663                     .data(function(d) { return [d]; })
76664                     .enter()
76665                     .append('use')
76666                     .attr('class', 'icon-annotation')
76667                     .attr('width', '10px')
76668                     .attr('height', '10px')
76669                     .attr('x', '-3px')
76670                     .attr('y', '-19px')
76671                     .attr('xlink:href', function(d) {
76672                         return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
76673                     });
76674
76675                 // update
76676                 notes
76677                     .merge(notesEnter)
76678                     .sort(sortY)
76679                     .classed('selected', function(d) {
76680                         var mode = context.mode();
76681                         var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
76682                         return !isMoving && d.id === selectedID;
76683                     })
76684                     .attr('transform', getTransform);
76685
76686
76687                 // Draw targets..
76688                 if (touchLayer.empty()) return;
76689                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76690
76691                 var targets = touchLayer.selectAll('.note')
76692                     .data(data, function(d) { return d.id; });
76693
76694                 // exit
76695                 targets.exit()
76696                     .remove();
76697
76698                 // enter/update
76699                 targets.enter()
76700                     .append('rect')
76701                     .attr('width', '20px')
76702                     .attr('height', '20px')
76703                     .attr('x', '-8px')
76704                     .attr('y', '-22px')
76705                     .merge(targets)
76706                     .sort(sortY)
76707                     .attr('class', function(d) {
76708                         var newClass = (d.id < 0 ? 'new' : '');
76709                         return 'note target note-' + d.id + ' ' + fillClass + newClass;
76710                     })
76711                     .attr('transform', getTransform);
76712
76713
76714                 function sortY(a, b) {
76715                     return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
76716                 }
76717             }
76718
76719
76720             // Draw the notes layer and schedule loading notes and updating markers.
76721             function drawNotes(selection) {
76722                 var service = getService();
76723
76724                 var surface = context.surface();
76725                 if (surface && !surface.empty()) {
76726                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
76727                 }
76728
76729                 drawLayer = selection.selectAll('.layer-notes')
76730                     .data(service ? [0] : []);
76731
76732                 drawLayer.exit()
76733                     .remove();
76734
76735                 drawLayer = drawLayer.enter()
76736                     .append('g')
76737                     .attr('class', 'layer-notes')
76738                     .style('display', _notesEnabled ? 'block' : 'none')
76739                     .merge(drawLayer);
76740
76741                 if (_notesEnabled) {
76742                     if (service && ~~context.map().zoom() >= minZoom) {
76743                         editOn();
76744                         service.loadNotes(projection);
76745                         updateMarkers();
76746                     } else {
76747                         editOff();
76748                     }
76749                 }
76750             }
76751
76752
76753             // Toggles the layer on and off
76754             drawNotes.enabled = function(val) {
76755                 if (!arguments.length) return _notesEnabled;
76756
76757                 _notesEnabled = val;
76758                 if (_notesEnabled) {
76759                     layerOn();
76760                 } else {
76761                     layerOff();
76762                     if (context.selectedNoteID()) {
76763                         context.enter(modeBrowse(context));
76764                     }
76765                 }
76766
76767                 dispatch$1.call('change');
76768                 return this;
76769             };
76770
76771
76772             return drawNotes;
76773         }
76774
76775         function svgTouch() {
76776
76777             function drawTouch(selection) {
76778                 selection.selectAll('.layer-touch')
76779                     .data(['areas', 'lines', 'points', 'turns', 'markers'])
76780                     .enter()
76781                     .append('g')
76782                     .attr('class', function(d) { return 'layer-touch ' + d; });
76783             }
76784
76785             return drawTouch;
76786         }
76787
76788         function svgLayers(projection, context) {
76789             var dispatch$1 = dispatch('change');
76790             var svg = d3_select(null);
76791             var _layers = [
76792                 { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
76793                 { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
76794                 { id: 'data', layer: svgData(projection, context, dispatch$1) },
76795                 { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
76796                 { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
76797                 { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
76798                 { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch$1) },
76799                 { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
76800                 { id: 'openstreetcam', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
76801                 { id: 'debug', layer: svgDebug(projection, context) },
76802                 { id: 'geolocate', layer: svgGeolocate(projection) },
76803                 { id: 'touch', layer: svgTouch() }
76804             ];
76805
76806
76807             function drawLayers(selection) {
76808                 svg = selection.selectAll('.surface')
76809                     .data([0]);
76810
76811                 svg = svg.enter()
76812                     .append('svg')
76813                     .attr('class', 'surface')
76814                     .merge(svg);
76815
76816                 var defs = svg.selectAll('.surface-defs')
76817                     .data([0]);
76818
76819                 defs.enter()
76820                     .append('defs')
76821                     .attr('class', 'surface-defs');
76822
76823                 var groups = svg.selectAll('.data-layer')
76824                     .data(_layers);
76825
76826                 groups.exit()
76827                     .remove();
76828
76829                 groups.enter()
76830                     .append('g')
76831                     .attr('class', function(d) { return 'data-layer ' + d.id; })
76832                     .merge(groups)
76833                     .each(function(d) { d3_select(this).call(d.layer); });
76834             }
76835
76836
76837             drawLayers.all = function() {
76838                 return _layers;
76839             };
76840
76841
76842             drawLayers.layer = function(id) {
76843                 var obj = _layers.find(function(o) { return o.id === id; });
76844                 return obj && obj.layer;
76845             };
76846
76847
76848             drawLayers.only = function(what) {
76849                 var arr = [].concat(what);
76850                 var all = _layers.map(function(layer) { return layer.id; });
76851                 return drawLayers.remove(utilArrayDifference(all, arr));
76852             };
76853
76854
76855             drawLayers.remove = function(what) {
76856                 var arr = [].concat(what);
76857                 arr.forEach(function(id) {
76858                     _layers = _layers.filter(function(o) { return o.id !== id; });
76859                 });
76860                 dispatch$1.call('change');
76861                 return this;
76862             };
76863
76864
76865             drawLayers.add = function(what) {
76866                 var arr = [].concat(what);
76867                 arr.forEach(function(obj) {
76868                     if ('id' in obj && 'layer' in obj) {
76869                         _layers.push(obj);
76870                     }
76871                 });
76872                 dispatch$1.call('change');
76873                 return this;
76874             };
76875
76876
76877             drawLayers.dimensions = function(val) {
76878                 if (!arguments.length) return utilGetDimensions(svg);
76879                 utilSetDimensions(svg, val);
76880                 return this;
76881             };
76882
76883
76884             return utilRebind(drawLayers, dispatch$1, 'on');
76885         }
76886
76887         function svgLines(projection, context) {
76888             var detected = utilDetect();
76889
76890             var highway_stack = {
76891                 motorway: 0,
76892                 motorway_link: 1,
76893                 trunk: 2,
76894                 trunk_link: 3,
76895                 primary: 4,
76896                 primary_link: 5,
76897                 secondary: 6,
76898                 tertiary: 7,
76899                 unclassified: 8,
76900                 residential: 9,
76901                 service: 10,
76902                 footway: 11
76903             };
76904
76905
76906             function drawTargets(selection, graph, entities, filter) {
76907                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76908                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
76909                 var getPath = svgPath(projection).geojson;
76910                 var activeID = context.activeID();
76911
76912                 // The targets and nopes will be MultiLineString sub-segments of the ways
76913                 var data = { targets: [], nopes: [] };
76914
76915                 entities.forEach(function(way) {
76916                     var features = svgSegmentWay(way, graph, activeID);
76917                     data.targets.push.apply(data.targets, features.passive);
76918                     data.nopes.push.apply(data.nopes, features.active);
76919                 });
76920
76921
76922                 // Targets allow hover and vertex snapping
76923                 var targetData = data.targets.filter(getPath);
76924                 var targets = selection.selectAll('.line.target-allowed')
76925                     .filter(function(d) { return filter(d.properties.entity); })
76926                     .data(targetData, function key(d) { return d.id; });
76927
76928                 // exit
76929                 targets.exit()
76930                     .remove();
76931
76932                 // enter/update
76933                 targets.enter()
76934                     .append('path')
76935                     .merge(targets)
76936                     .attr('d', getPath)
76937                     .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
76938
76939
76940                 // NOPE
76941                 var nopeData = data.nopes.filter(getPath);
76942                 var nopes = selection.selectAll('.line.target-nope')
76943                     .filter(function(d) { return filter(d.properties.entity); })
76944                     .data(nopeData, function key(d) { return d.id; });
76945
76946                 // exit
76947                 nopes.exit()
76948                     .remove();
76949
76950                 // enter/update
76951                 nopes.enter()
76952                     .append('path')
76953                     .merge(nopes)
76954                     .attr('d', getPath)
76955                     .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
76956             }
76957
76958
76959             function drawLines(selection, graph, entities, filter) {
76960
76961                 function waystack(a, b) {
76962                     var selected = context.selectedIDs();
76963                     var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
76964                     var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
76965
76966                     if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
76967                     if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
76968                     return scoreA - scoreB;
76969                 }
76970
76971
76972                 function drawLineGroup(selection, klass, isSelected) {
76973                     // Note: Don't add `.selected` class in draw modes
76974                     var mode = context.mode();
76975                     var isDrawing = mode && /^draw/.test(mode.id);
76976                     var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
76977
76978                     var lines = selection
76979                         .selectAll('path')
76980                         .filter(filter)
76981                         .data(getPathData(isSelected), osmEntity.key);
76982
76983                     lines.exit()
76984                         .remove();
76985
76986                     // Optimization: Call expensive TagClasses only on enter selection. This
76987                     // works because osmEntity.key is defined to include the entity v attribute.
76988                     lines.enter()
76989                         .append('path')
76990                         .attr('class', function(d) {
76991
76992                             var prefix = 'way line';
76993                             if (!d.hasInterestingTags() && graph.parentMultipolygons(d).length > 0) {
76994                                 // fudge the classes to style multipolygon member lines as area edges
76995                                 prefix = 'relation area';
76996                             }
76997
76998                             var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
76999                             return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
77000                         })
77001                         .call(svgTagClasses())
77002                         .merge(lines)
77003                         .sort(waystack)
77004                         .attr('d', getPath)
77005                         .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
77006
77007                     return selection;
77008                 }
77009
77010
77011                 function getPathData(isSelected) {
77012                     return function() {
77013                         var layer = this.parentNode.__data__;
77014                         var data = pathdata[layer] || [];
77015                         return data.filter(function(d) {
77016                             if (isSelected)
77017                                 return context.selectedIDs().indexOf(d.id) !== -1;
77018                             else
77019                                 return context.selectedIDs().indexOf(d.id) === -1;
77020                         });
77021                     };
77022                 }
77023
77024                 function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
77025                     var markergroup = layergroup
77026                         .selectAll('g.' + groupclass)
77027                         .data([pathclass]);
77028
77029                     markergroup = markergroup.enter()
77030                         .append('g')
77031                         .attr('class', groupclass)
77032                         .merge(markergroup);
77033
77034                     var markers = markergroup
77035                         .selectAll('path')
77036                         .filter(filter)
77037                         .data(
77038                             function data() { return groupdata[this.parentNode.__data__] || []; },
77039                             function key(d) { return [d.id, d.index]; }
77040                         );
77041
77042                     markers.exit()
77043                         .remove();
77044
77045                     markers = markers.enter()
77046                         .append('path')
77047                         .attr('class', pathclass)
77048                         .attr('marker-mid', marker)
77049                         .merge(markers)
77050                         .attr('d', function(d) { return d.d; });
77051
77052                     if (detected.ie) {
77053                         markers.each(function() { this.parentNode.insertBefore(this, this); });
77054                     }
77055                 }
77056
77057
77058                 var getPath = svgPath(projection, graph);
77059                 var ways = [];
77060                 var onewaydata = {};
77061                 var sideddata = {};
77062                 var oldMultiPolygonOuters = {};
77063
77064                 for (var i = 0; i < entities.length; i++) {
77065                     var entity = entities[i];
77066                     var outer = osmOldMultipolygonOuterMember(entity, graph);
77067                     if (outer) {
77068                         ways.push(entity.mergeTags(outer.tags));
77069                         oldMultiPolygonOuters[outer.id] = true;
77070                     } else if (entity.geometry(graph) === 'line') {
77071                         ways.push(entity);
77072                     }
77073                 }
77074
77075                 ways = ways.filter(getPath);
77076                 var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); });
77077
77078                 Object.keys(pathdata).forEach(function(k) {
77079                     var v = pathdata[k];
77080                     var onewayArr = v.filter(function(d) { return d.isOneWay(); });
77081                     var onewaySegments = svgMarkerSegments(
77082                         projection, graph, 35,
77083                         function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
77084                         function bothDirections(entity) {
77085                             return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
77086                         }
77087                     );
77088                     onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
77089
77090                     var sidedArr = v.filter(function(d) { return d.isSided(); });
77091                     var sidedSegments = svgMarkerSegments(
77092                         projection, graph, 30,
77093                         function shouldReverse() { return false; },
77094                         function bothDirections() { return false; }
77095                     );
77096                     sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
77097                 });
77098
77099
77100                 var covered = selection.selectAll('.layer-osm.covered');     // under areas
77101                 var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
77102                 var touchLayer = selection.selectAll('.layer-touch.lines');
77103
77104                 // Draw lines..
77105                 [covered, uncovered].forEach(function(selection) {
77106                     var range = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
77107                     var layergroup = selection
77108                         .selectAll('g.layergroup')
77109                         .data(range);
77110
77111                     layergroup = layergroup.enter()
77112                         .append('g')
77113                         .attr('class', function(d) { return 'layergroup layer' + String(d); })
77114                         .merge(layergroup);
77115
77116                     layergroup
77117                         .selectAll('g.linegroup')
77118                         .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
77119                         .enter()
77120                         .append('g')
77121                         .attr('class', function(d) { return 'linegroup line-' + d; });
77122
77123                     layergroup.selectAll('g.line-shadow')
77124                         .call(drawLineGroup, 'shadow', false);
77125                     layergroup.selectAll('g.line-casing')
77126                         .call(drawLineGroup, 'casing', false);
77127                     layergroup.selectAll('g.line-stroke')
77128                         .call(drawLineGroup, 'stroke', false);
77129
77130                     layergroup.selectAll('g.line-shadow-highlighted')
77131                         .call(drawLineGroup, 'shadow', true);
77132                     layergroup.selectAll('g.line-casing-highlighted')
77133                         .call(drawLineGroup, 'casing', true);
77134                     layergroup.selectAll('g.line-stroke-highlighted')
77135                         .call(drawLineGroup, 'stroke', true);
77136
77137                     addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
77138                     addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
77139                         function marker(d) {
77140                             var category = graph.entity(d.id).sidednessIdentifier();
77141                             return 'url(#sided-marker-' + category + ')';
77142                         }
77143                     );
77144                 });
77145
77146                 // Draw touch targets..
77147                 touchLayer
77148                     .call(drawTargets, graph, ways, filter);
77149             }
77150
77151
77152             return drawLines;
77153         }
77154
77155         function svgMidpoints(projection, context) {
77156             var targetRadius = 8;
77157
77158             function drawTargets(selection, graph, entities, filter) {
77159                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77160                 var getTransform = svgPointTransform(projection).geojson;
77161
77162                 var data = entities.map(function(midpoint) {
77163                     return {
77164                         type: 'Feature',
77165                         id: midpoint.id,
77166                         properties: {
77167                             target: true,
77168                             entity: midpoint
77169                         },
77170                         geometry: {
77171                             type: 'Point',
77172                             coordinates: midpoint.loc
77173                         }
77174                     };
77175                 });
77176
77177                 var targets = selection.selectAll('.midpoint.target')
77178                     .filter(function(d) { return filter(d.properties.entity); })
77179                     .data(data, function key(d) { return d.id; });
77180
77181                 // exit
77182                 targets.exit()
77183                     .remove();
77184
77185                 // enter/update
77186                 targets.enter()
77187                     .append('circle')
77188                     .attr('r', targetRadius)
77189                     .merge(targets)
77190                     .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
77191                     .attr('transform', getTransform);
77192             }
77193
77194
77195             function drawMidpoints(selection, graph, entities, filter, extent) {
77196                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
77197                 var touchLayer = selection.selectAll('.layer-touch.points');
77198
77199                 var mode = context.mode();
77200                 if (mode && mode.id !== 'select') {
77201                     drawLayer.selectAll('.midpoint').remove();
77202                     touchLayer.selectAll('.midpoint.target').remove();
77203                     return;
77204                 }
77205
77206                 var poly = extent.polygon();
77207                 var midpoints = {};
77208
77209                 for (var i = 0; i < entities.length; i++) {
77210                     var entity = entities[i];
77211
77212                     if (entity.type !== 'way') continue;
77213                     if (!filter(entity)) continue;
77214                     if (context.selectedIDs().indexOf(entity.id) < 0) continue;
77215
77216                     var nodes = graph.childNodes(entity);
77217                     for (var j = 0; j < nodes.length - 1; j++) {
77218                         var a = nodes[j];
77219                         var b = nodes[j + 1];
77220                         var id = [a.id, b.id].sort().join('-');
77221
77222                         if (midpoints[id]) {
77223                             midpoints[id].parents.push(entity);
77224                         } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
77225                             var point = geoVecInterp(a.loc, b.loc, 0.5);
77226                             var loc = null;
77227
77228                             if (extent.intersects(point)) {
77229                                 loc = point;
77230                             } else {
77231                                 for (var k = 0; k < 4; k++) {
77232                                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
77233                                     if (point &&
77234                                         geoVecLength(projection(a.loc), projection(point)) > 20 &&
77235                                         geoVecLength(projection(b.loc), projection(point)) > 20)
77236                                     {
77237                                         loc = point;
77238                                         break;
77239                                     }
77240                                 }
77241                             }
77242
77243                             if (loc) {
77244                                 midpoints[id] = {
77245                                     type: 'midpoint',
77246                                     id: id,
77247                                     loc: loc,
77248                                     edge: [a.id, b.id],
77249                                     parents: [entity]
77250                                 };
77251                             }
77252                         }
77253                     }
77254                 }
77255
77256
77257                 function midpointFilter(d) {
77258                     if (midpoints[d.id])
77259                         return true;
77260
77261                     for (var i = 0; i < d.parents.length; i++) {
77262                         if (filter(d.parents[i])) {
77263                             return true;
77264                         }
77265                     }
77266
77267                     return false;
77268                 }
77269
77270
77271                 var groups = drawLayer.selectAll('.midpoint')
77272                     .filter(midpointFilter)
77273                     .data(Object.values(midpoints), function(d) { return d.id; });
77274
77275                 groups.exit()
77276                     .remove();
77277
77278                 var enter = groups.enter()
77279                     .insert('g', ':first-child')
77280                     .attr('class', 'midpoint');
77281
77282                 enter
77283                     .append('polygon')
77284                     .attr('points', '-6,8 10,0 -6,-8')
77285                     .attr('class', 'shadow');
77286
77287                 enter
77288                     .append('polygon')
77289                     .attr('points', '-3,4 5,0 -3,-4')
77290                     .attr('class', 'fill');
77291
77292                 groups = groups
77293                     .merge(enter)
77294                     .attr('transform', function(d) {
77295                         var translate = svgPointTransform(projection);
77296                         var a = graph.entity(d.edge[0]);
77297                         var b = graph.entity(d.edge[1]);
77298                         var angle = geoAngle(a, b, projection) * (180 / Math.PI);
77299                         return translate(d) + ' rotate(' + angle + ')';
77300                     })
77301                     .call(svgTagClasses().tags(
77302                         function(d) { return d.parents[0].tags; }
77303                     ));
77304
77305                 // Propagate data bindings.
77306                 groups.select('polygon.shadow');
77307                 groups.select('polygon.fill');
77308
77309
77310                 // Draw touch targets..
77311                 touchLayer
77312                     .call(drawTargets, graph, Object.values(midpoints), midpointFilter);
77313             }
77314
77315             return drawMidpoints;
77316         }
77317
77318         function svgPoints(projection, context) {
77319
77320             function markerPath(selection, klass) {
77321                 selection
77322                     .attr('class', klass)
77323                     .attr('transform', 'translate(-8, -23)')
77324                     .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');
77325             }
77326
77327             function sortY(a, b) {
77328                 return b.loc[1] - a.loc[1];
77329             }
77330
77331
77332             // Avoid exit/enter if we're just moving stuff around.
77333             // The node will get a new version but we only need to run the update selection.
77334             function fastEntityKey(d) {
77335                 var mode = context.mode();
77336                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77337                 return isMoving ? d.id : osmEntity.key(d);
77338             }
77339
77340
77341             function drawTargets(selection, graph, entities, filter) {
77342                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77343                 var getTransform = svgPointTransform(projection).geojson;
77344                 var activeID = context.activeID();
77345                 var data = [];
77346
77347                 entities.forEach(function(node) {
77348                     if (activeID === node.id) return;   // draw no target on the activeID
77349
77350                     data.push({
77351                         type: 'Feature',
77352                         id: node.id,
77353                         properties: {
77354                             target: true,
77355                             entity: node
77356                         },
77357                         geometry: node.asGeoJSON()
77358                     });
77359                 });
77360
77361                 var targets = selection.selectAll('.point.target')
77362                     .filter(function(d) { return filter(d.properties.entity); })
77363                     .data(data, function key(d) { return d.id; });
77364
77365                 // exit
77366                 targets.exit()
77367                     .remove();
77368
77369                 // enter/update
77370                 targets.enter()
77371                     .append('rect')
77372                     .attr('x', -10)
77373                     .attr('y', -26)
77374                     .attr('width', 20)
77375                     .attr('height', 30)
77376                     .merge(targets)
77377                     .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
77378                     .attr('transform', getTransform);
77379             }
77380
77381
77382             function drawPoints(selection, graph, entities, filter) {
77383                 var wireframe = context.surface().classed('fill-wireframe');
77384                 var zoom = geoScaleToZoom(projection.scale());
77385
77386                 // Points with a direction will render as vertices at higher zooms..
77387                 function renderAsPoint(entity) {
77388                     return entity.geometry(graph) === 'point' &&
77389                         !(zoom >= 18 && entity.directions(graph, projection).length);
77390                 }
77391
77392                 // All points will render as vertices in wireframe mode too..
77393                 var points = wireframe ? [] : entities.filter(renderAsPoint);
77394                 points.sort(sortY);
77395
77396
77397                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
77398                 var touchLayer = selection.selectAll('.layer-touch.points');
77399
77400                 // Draw points..
77401                 var groups = drawLayer.selectAll('g.point')
77402                     .filter(filter)
77403                     .data(points, fastEntityKey);
77404
77405                 groups.exit()
77406                     .remove();
77407
77408                 var enter = groups.enter()
77409                     .append('g')
77410                     .attr('class', function(d) { return 'node point ' + d.id; })
77411                     .order();
77412
77413                 enter
77414                     .append('path')
77415                     .call(markerPath, 'shadow');
77416
77417                 enter
77418                     .append('ellipse')
77419                     .attr('cx', 0.5)
77420                     .attr('cy', 1)
77421                     .attr('rx', 6.5)
77422                     .attr('ry', 3)
77423                     .attr('class', 'stroke');
77424
77425                 enter
77426                     .append('path')
77427                     .call(markerPath, 'stroke');
77428
77429                 enter
77430                     .append('use')
77431                     .attr('transform', 'translate(-5, -19)')
77432                     .attr('class', 'icon')
77433                     .attr('width', '11px')
77434                     .attr('height', '11px');
77435
77436                 groups = groups
77437                     .merge(enter)
77438                     .attr('transform', svgPointTransform(projection))
77439                     .call(svgTagClasses());
77440
77441                 groups.select('.shadow');   // propagate bound data
77442                 groups.select('.stroke');   // propagate bound data
77443                 groups.select('.icon')      // propagate bound data
77444                     .attr('xlink:href', function(entity) {
77445                         var preset = context.presets().match(entity, graph);
77446                         var picon = preset && preset.icon;
77447
77448                         if (!picon) {
77449                             return '';
77450                         } else {
77451                             var isMaki = /^maki-/.test(picon);
77452                             return '#' + picon + (isMaki ? '-11' : '');
77453                         }
77454                     });
77455
77456
77457                 // Draw touch targets..
77458                 touchLayer
77459                     .call(drawTargets, graph, points, filter);
77460             }
77461
77462
77463             return drawPoints;
77464         }
77465
77466         function svgTurns(projection, context) {
77467
77468             function icon(turn) {
77469                 var u = turn.u ? '-u' : '';
77470                 if (turn.no) return '#iD-turn-no' + u;
77471                 if (turn.only) return '#iD-turn-only' + u;
77472                 return '#iD-turn-yes' + u;
77473             }
77474
77475             function drawTurns(selection, graph, turns) {
77476
77477                 function turnTransform(d) {
77478                     var pxRadius = 50;
77479                     var toWay = graph.entity(d.to.way);
77480                     var toPoints = graph.childNodes(toWay)
77481                         .map(function (n) { return n.loc; })
77482                         .map(projection);
77483                     var toLength = geoPathLength(toPoints);
77484                     var mid = toLength / 2;    // midpoint of destination way
77485
77486                     var toNode = graph.entity(d.to.node);
77487                     var toVertex = graph.entity(d.to.vertex);
77488                     var a = geoAngle(toVertex, toNode, projection);
77489                     var o = projection(toVertex.loc);
77490                     var r = d.u ? 0                  // u-turn: no radius
77491                         : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
77492                         : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
77493
77494                     return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
77495                         'rotate(' + a * 180 / Math.PI + ')';
77496                 }
77497
77498
77499                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
77500                 var touchLayer = selection.selectAll('.layer-touch.turns');
77501
77502                 // Draw turns..
77503                 var groups = drawLayer.selectAll('g.turn')
77504                     .data(turns, function(d) { return d.key; });
77505
77506                 // exit
77507                 groups.exit()
77508                     .remove();
77509
77510                 // enter
77511                 var groupsEnter = groups.enter()
77512                     .append('g')
77513                     .attr('class', function(d) { return 'turn ' + d.key; });
77514
77515                 var turnsEnter = groupsEnter
77516                     .filter(function(d) { return !d.u; });
77517
77518                 turnsEnter.append('rect')
77519                     .attr('transform', 'translate(-22, -12)')
77520                     .attr('width', '44')
77521                     .attr('height', '24');
77522
77523                 turnsEnter.append('use')
77524                     .attr('transform', 'translate(-22, -12)')
77525                     .attr('width', '44')
77526                     .attr('height', '24');
77527
77528                 var uEnter = groupsEnter
77529                     .filter(function(d) { return d.u; });
77530
77531                 uEnter.append('circle')
77532                     .attr('r', '16');
77533
77534                 uEnter.append('use')
77535                     .attr('transform', 'translate(-16, -16)')
77536                     .attr('width', '32')
77537                     .attr('height', '32');
77538
77539                 // update
77540                 groups = groups
77541                     .merge(groupsEnter)
77542                     .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
77543                     .attr('transform', turnTransform);
77544
77545                 groups.select('use')
77546                     .attr('xlink:href', icon);
77547
77548                 groups.select('rect');      // propagate bound data
77549                 groups.select('circle');    // propagate bound data
77550
77551
77552                 // Draw touch targets..
77553                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77554                 groups = touchLayer.selectAll('g.turn')
77555                     .data(turns, function(d) { return d.key; });
77556
77557                 // exit
77558                 groups.exit()
77559                     .remove();
77560
77561                 // enter
77562                 groupsEnter = groups.enter()
77563                     .append('g')
77564                     .attr('class', function(d) { return 'turn ' + d.key; });
77565
77566                 turnsEnter = groupsEnter
77567                     .filter(function(d) { return !d.u; });
77568
77569                 turnsEnter.append('rect')
77570                     .attr('class', 'target ' + fillClass)
77571                     .attr('transform', 'translate(-22, -12)')
77572                     .attr('width', '44')
77573                     .attr('height', '24');
77574
77575                 uEnter = groupsEnter
77576                     .filter(function(d) { return d.u; });
77577
77578                 uEnter.append('circle')
77579                     .attr('class', 'target ' + fillClass)
77580                     .attr('r', '16');
77581
77582                 // update
77583                 groups = groups
77584                     .merge(groupsEnter)
77585                     .attr('transform', turnTransform);
77586
77587                 groups.select('rect');      // propagate bound data
77588                 groups.select('circle');    // propagate bound data
77589
77590
77591                 return this;
77592             }
77593
77594             return drawTurns;
77595         }
77596
77597         function svgVertices(projection, context) {
77598             var radiuses = {
77599                 //       z16-, z17,   z18+,  w/icon
77600                 shadow: [6,    7.5,   7.5,   12],
77601                 stroke: [2.5,  3.5,   3.5,   8],
77602                 fill:   [1,    1.5,   1.5,   1.5]
77603             };
77604
77605             var _currHoverTarget;
77606             var _currPersistent = {};
77607             var _currHover = {};
77608             var _prevHover = {};
77609             var _currSelected = {};
77610             var _prevSelected = {};
77611             var _radii = {};
77612
77613
77614             function sortY(a, b) {
77615                 return b.loc[1] - a.loc[1];
77616             }
77617
77618             // Avoid exit/enter if we're just moving stuff around.
77619             // The node will get a new version but we only need to run the update selection.
77620             function fastEntityKey(d) {
77621                 var mode = context.mode();
77622                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77623                 return isMoving ? d.id : osmEntity.key(d);
77624             }
77625
77626
77627             function draw(selection, graph, vertices, sets, filter) {
77628                 sets = sets || { selected: {}, important: {}, hovered: {} };
77629
77630                 var icons = {};
77631                 var directions = {};
77632                 var wireframe = context.surface().classed('fill-wireframe');
77633                 var zoom = geoScaleToZoom(projection.scale());
77634                 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
77635                 var activeID = context.activeID();
77636
77637
77638                 function getIcon(d) {
77639                     // always check latest entity, as fastEntityKey avoids enter/exit now
77640                     var entity = graph.entity(d.id);
77641                     if (entity.id in icons) return icons[entity.id];
77642
77643                     icons[entity.id] =
77644                         entity.hasInterestingTags() &&
77645                         context.presets().match(entity, graph).icon;
77646
77647                     return icons[entity.id];
77648                 }
77649
77650
77651                 // memoize directions results, return false for empty arrays (for use in filter)
77652                 function getDirections(entity) {
77653                     if (entity.id in directions) return directions[entity.id];
77654
77655                     var angles = entity.directions(graph, projection);
77656                     directions[entity.id] = angles.length ? angles : false;
77657                     return angles;
77658                 }
77659
77660
77661                 function updateAttributes(selection) {
77662                     ['shadow', 'stroke', 'fill'].forEach(function(klass) {
77663                         var rads = radiuses[klass];
77664                         selection.selectAll('.' + klass)
77665                             .each(function(entity) {
77666                                 var i = z && getIcon(entity);
77667                                 var r = rads[i ? 3 : z];
77668
77669                                 // slightly increase the size of unconnected endpoints #3775
77670                                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
77671                                     r += 1.5;
77672                                 }
77673
77674                                 if (klass === 'shadow') {   // remember this value, so we don't need to
77675                                     _radii[entity.id] = r;  // recompute it when we draw the touch targets
77676                                 }
77677
77678                                 d3_select(this)
77679                                     .attr('r', r)
77680                                     .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
77681                             });
77682                     });
77683                 }
77684
77685                 vertices.sort(sortY);
77686
77687                 var groups = selection.selectAll('g.vertex')
77688                     .filter(filter)
77689                     .data(vertices, fastEntityKey);
77690
77691                 // exit
77692                 groups.exit()
77693                     .remove();
77694
77695                 // enter
77696                 var enter = groups.enter()
77697                     .append('g')
77698                     .attr('class', function(d) { return 'node vertex ' + d.id; })
77699                     .order();
77700
77701                 enter
77702                     .append('circle')
77703                     .attr('class', 'shadow');
77704
77705                 enter
77706                     .append('circle')
77707                     .attr('class', 'stroke');
77708
77709                 // Vertices with tags get a fill.
77710                 enter.filter(function(d) { return d.hasInterestingTags(); })
77711                     .append('circle')
77712                     .attr('class', 'fill');
77713
77714                 // update
77715                 groups = groups
77716                     .merge(enter)
77717                     .attr('transform', svgPointTransform(projection))
77718                     .classed('sibling', function(d) { return d.id in sets.selected; })
77719                     .classed('shared', function(d) { return graph.isShared(d); })
77720                     .classed('endpoint', function(d) { return d.isEndpoint(graph); })
77721                     .call(updateAttributes);
77722
77723
77724                 // Vertices with icons get a `use`.
77725                 var iconUse = groups
77726                     .selectAll('.icon')
77727                     .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
77728
77729                 // exit
77730                 iconUse.exit()
77731                     .remove();
77732
77733                 // enter
77734                 iconUse.enter()
77735                     .append('use')
77736                     .attr('class', 'icon')
77737                     .attr('width', '11px')
77738                     .attr('height', '11px')
77739                     .attr('transform', 'translate(-5.5, -5.5)')
77740                     .attr('xlink:href', function(d) {
77741                         var picon = getIcon(d);
77742                         var isMaki = /^maki-/.test(picon);
77743                         return '#' + picon + (isMaki ? '-11' : '');
77744                     });
77745
77746
77747                 // Vertices with directions get viewfields
77748                 var dgroups = groups
77749                     .selectAll('.viewfieldgroup')
77750                     .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
77751
77752                 // exit
77753                 dgroups.exit()
77754                     .remove();
77755
77756                 // enter/update
77757                 dgroups = dgroups.enter()
77758                     .insert('g', '.shadow')
77759                     .attr('class', 'viewfieldgroup')
77760                     .merge(dgroups);
77761
77762                 var viewfields = dgroups.selectAll('.viewfield')
77763                     .data(getDirections, function key(d) { return osmEntity.key(d); });
77764
77765                 // exit
77766                 viewfields.exit()
77767                     .remove();
77768
77769                 // enter/update
77770                 viewfields.enter()
77771                     .append('path')
77772                     .attr('class', 'viewfield')
77773                     .attr('d', 'M0,0H0')
77774                     .merge(viewfields)
77775                     .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
77776                     .attr('transform', function(d) { return 'rotate(' + d + ')'; });
77777             }
77778
77779
77780             function drawTargets(selection, graph, entities, filter) {
77781                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77782                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
77783                 var getTransform = svgPointTransform(projection).geojson;
77784                 var activeID = context.activeID();
77785                 var data = { targets: [], nopes: [] };
77786
77787                 entities.forEach(function(node) {
77788                     if (activeID === node.id) return;   // draw no target on the activeID
77789
77790                     var vertexType = svgPassiveVertex(node, graph, activeID);
77791                     if (vertexType !== 0) {     // passive or adjacent - allow to connect
77792                         data.targets.push({
77793                             type: 'Feature',
77794                             id: node.id,
77795                             properties: {
77796                                 target: true,
77797                                 entity: node
77798                             },
77799                             geometry: node.asGeoJSON()
77800                         });
77801                     } else {
77802                         data.nopes.push({
77803                             type: 'Feature',
77804                             id: node.id + '-nope',
77805                             properties: {
77806                                 nope: true,
77807                                 target: true,
77808                                 entity: node
77809                             },
77810                             geometry: node.asGeoJSON()
77811                         });
77812                     }
77813                 });
77814
77815
77816                 // Targets allow hover and vertex snapping
77817                 var targets = selection.selectAll('.vertex.target-allowed')
77818                     .filter(function(d) { return filter(d.properties.entity); })
77819                     .data(data.targets, function key(d) { return d.id; });
77820
77821                 // exit
77822                 targets.exit()
77823                     .remove();
77824
77825                 // enter/update
77826                 targets.enter()
77827                     .append('circle')
77828                     .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
77829                     .merge(targets)
77830                     .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
77831                     .attr('transform', getTransform);
77832
77833
77834                 // NOPE
77835                 var nopes = selection.selectAll('.vertex.target-nope')
77836                     .filter(function(d) { return filter(d.properties.entity); })
77837                     .data(data.nopes, function key(d) { return d.id; });
77838
77839                 // exit
77840                 nopes.exit()
77841                     .remove();
77842
77843                 // enter/update
77844                 nopes.enter()
77845                     .append('circle')
77846                     .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
77847                     .merge(nopes)
77848                     .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
77849                     .attr('transform', getTransform);
77850             }
77851
77852
77853             // Points can also render as vertices:
77854             // 1. in wireframe mode or
77855             // 2. at higher zooms if they have a direction
77856             function renderAsVertex(entity, graph, wireframe, zoom) {
77857                 var geometry = entity.geometry(graph);
77858                 return geometry === 'vertex' || (geometry === 'point' && (
77859                     wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
77860                 ));
77861             }
77862
77863
77864             function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
77865                 var results = {};
77866
77867                 function addChildVertices(entity) {
77868                     var geometry = entity.geometry(graph);
77869                     if (!context.features().isHiddenFeature(entity, graph, geometry)) {
77870                         var i;
77871                         if (entity.type === 'way') {
77872                             for (i = 0; i < entity.nodes.length; i++) {
77873                                 var child = graph.hasEntity(entity.nodes[i]);
77874                                 if (child) {
77875                                     addChildVertices(child);
77876                                 }
77877                             }
77878                         } else if (entity.type === 'relation') {
77879                             for (i = 0; i < entity.members.length; i++) {
77880                                 var member = graph.hasEntity(entity.members[i].id);
77881                                 if (member) {
77882                                     addChildVertices(member);
77883                                 }
77884                             }
77885                         } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
77886                             results[entity.id] = entity;
77887                         }
77888                     }
77889                 }
77890
77891                 ids.forEach(function(id) {
77892                     var entity = graph.hasEntity(id);
77893                     if (!entity) return;
77894
77895                     if (entity.type === 'node') {
77896                         if (renderAsVertex(entity, graph, wireframe, zoom)) {
77897                             results[entity.id] = entity;
77898                             graph.parentWays(entity).forEach(function(entity) {
77899                                 addChildVertices(entity);
77900                             });
77901                         }
77902                     } else {  // way, relation
77903                         addChildVertices(entity);
77904                     }
77905                 });
77906
77907                 return results;
77908             }
77909
77910
77911             function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
77912                 var wireframe = context.surface().classed('fill-wireframe');
77913                 var zoom = geoScaleToZoom(projection.scale());
77914                 var mode = context.mode();
77915                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77916
77917                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
77918                 var touchLayer = selection.selectAll('.layer-touch.points');
77919
77920                 if (fullRedraw) {
77921                     _currPersistent = {};
77922                     _radii = {};
77923                 }
77924
77925                 // Collect important vertices from the `entities` list..
77926                 // (during a paritial redraw, it will not contain everything)
77927                 for (var i = 0; i < entities.length; i++) {
77928                     var entity = entities[i];
77929                     var geometry = entity.geometry(graph);
77930                     var keep = false;
77931
77932                     // a point that looks like a vertex..
77933                     if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
77934                         _currPersistent[entity.id] = entity;
77935                         keep = true;
77936
77937                     // a vertex of some importance..
77938                     } else if (geometry === 'vertex' &&
77939                         (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
77940                         _currPersistent[entity.id] = entity;
77941                         keep = true;
77942                     }
77943
77944                     // whatever this is, it's not a persistent vertex..
77945                     if (!keep && !fullRedraw) {
77946                         delete _currPersistent[entity.id];
77947                     }
77948                 }
77949
77950                 // 3 sets of vertices to consider:
77951                 var sets = {
77952                     persistent: _currPersistent,  // persistent = important vertices (render always)
77953                     selected: _currSelected,      // selected + siblings of selected (render always)
77954                     hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
77955                 };
77956
77957                 var all = Object.assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
77958
77959                 // Draw the vertices..
77960                 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
77961                 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
77962                 var filterRendered = function(d) {
77963                     return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
77964                 };
77965                 drawLayer
77966                     .call(draw, graph, currentVisible(all), sets, filterRendered);
77967
77968                 // Draw touch targets..
77969                 // When drawing, render all targets (not just those affected by a partial redraw)
77970                 var filterTouch = function(d) {
77971                     return isMoving ? true : filterRendered(d);
77972                 };
77973                 touchLayer
77974                     .call(drawTargets, graph, currentVisible(all), filterTouch);
77975
77976
77977                 function currentVisible(which) {
77978                     return Object.keys(which)
77979                         .map(graph.hasEntity, graph)     // the current version of this entity
77980                         .filter(function (entity) { return entity && entity.intersects(extent, graph); });
77981                 }
77982             }
77983
77984
77985             // partial redraw - only update the selected items..
77986             drawVertices.drawSelected = function(selection, graph, extent) {
77987                 var wireframe = context.surface().classed('fill-wireframe');
77988                 var zoom = geoScaleToZoom(projection.scale());
77989
77990                 _prevSelected = _currSelected || {};
77991                 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
77992
77993                 // note that drawVertices will add `_currSelected` automatically if needed..
77994                 var filter = function(d) { return d.id in _prevSelected; };
77995                 drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
77996             };
77997
77998
77999             // partial redraw - only update the hovered items..
78000             drawVertices.drawHover = function(selection, graph, target, extent) {
78001                 if (target === _currHoverTarget) return;  // continue only if something changed
78002
78003                 var wireframe = context.surface().classed('fill-wireframe');
78004                 var zoom = geoScaleToZoom(projection.scale());
78005
78006                 _prevHover = _currHover || {};
78007                 _currHoverTarget = target;
78008                 var entity = target && target.properties && target.properties.entity;
78009
78010                 if (entity) {
78011                     _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
78012                 } else {
78013                     _currHover = {};
78014                 }
78015
78016                 // note that drawVertices will add `_currHover` automatically if needed..
78017                 var filter = function(d) { return d.id in _prevHover; };
78018                 drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
78019             };
78020
78021             return drawVertices;
78022         }
78023
78024         function utilBindOnce(target, type, listener, capture) {
78025             var typeOnce = type + '.once';
78026             function one() {
78027                 target.on(typeOnce, null);
78028                 listener.apply(this, arguments);
78029             }
78030             target.on(typeOnce, one, capture);
78031             return this;
78032         }
78033
78034         // constants
78035         var TILESIZE = 256;
78036         var kMin = geoZoomToScale(2, TILESIZE);
78037         var kMax = geoZoomToScale(24, TILESIZE);
78038
78039         function clamp(num, min, max) {
78040             return Math.max(min, Math.min(num, max));
78041         }
78042
78043
78044         function rendererMap(context) {
78045             var dispatch$1 = dispatch('move', 'drawn');
78046             var projection = context.projection;
78047             var curtainProjection = context.curtainProjection;
78048             var drawLayers = svgLayers(projection, context);
78049             var drawPoints = svgPoints(projection, context);
78050             var drawVertices = svgVertices(projection, context);
78051             var drawLines = svgLines(projection, context);
78052             var drawAreas = svgAreas(projection, context);
78053             var drawMidpoints = svgMidpoints(projection, context);
78054             var drawLabels = svgLabels(projection, context);
78055
78056             var _selection = d3_select(null);
78057             var supersurface = d3_select(null);
78058             var wrapper = d3_select(null);
78059             var surface = d3_select(null);
78060
78061             var _dimensions = [1, 1];
78062             var _dblClickEnabled = true;
78063             var _redrawEnabled = true;
78064             var _gestureTransformStart;
78065             var _transformStart = projection.transform();
78066             var _transformLast;
78067             var _isTransformed = false;
78068             var _minzoom = 0;
78069             var _getMouseCoords;
78070             var _mouseEvent;
78071
78072             var zoom = d3_zoom()
78073                 .scaleExtent([kMin, kMax])
78074                 .interpolate(d3_interpolate)
78075                 .filter(zoomEventFilter)
78076                 .on('zoom', zoomPan);
78077
78078             var scheduleRedraw = throttle(redraw, 750);
78079             // var isRedrawScheduled = false;
78080             // var pendingRedrawCall;
78081             // function scheduleRedraw() {
78082             //     // Only schedule the redraw if one has not already been set.
78083             //     if (isRedrawScheduled) return;
78084             //     isRedrawScheduled = true;
78085             //     var that = this;
78086             //     var args = arguments;
78087             //     pendingRedrawCall = window.requestIdleCallback(function () {
78088             //         // Reset the boolean so future redraws can be set.
78089             //         isRedrawScheduled = false;
78090             //         redraw.apply(that, args);
78091             //     }, { timeout: 1400 });
78092             // }
78093
78094             function cancelPendingRedraw() {
78095                 scheduleRedraw.cancel();
78096                 // isRedrawScheduled = false;
78097                 // window.cancelIdleCallback(pendingRedrawCall);
78098             }
78099
78100
78101             function map(selection) {
78102                 _selection = selection;
78103
78104                 context
78105                     .on('change.map', immediateRedraw);
78106
78107                 var osm = context.connection();
78108                 if (osm) {
78109                     osm.on('change.map', immediateRedraw);
78110                 }
78111
78112                 function didUndoOrRedo(targetTransform) {
78113                     var mode = context.mode().id;
78114                     if (mode !== 'browse' && mode !== 'select') return;
78115                     if (targetTransform) {
78116                         map.transformEase(targetTransform);
78117                     }
78118                 }
78119
78120                 context.history()
78121                     .on('merge.map', function() { scheduleRedraw(); })
78122                     .on('change.map', immediateRedraw)
78123                     .on('undone.map', function(stack, fromStack) {
78124                         didUndoOrRedo(fromStack.transform);
78125                     })
78126                     .on('redone.map', function(stack) {
78127                         didUndoOrRedo(stack.transform);
78128                     });
78129
78130                 context.background()
78131                     .on('change.map', immediateRedraw);
78132
78133                 context.features()
78134                     .on('redraw.map', immediateRedraw);
78135
78136                 drawLayers
78137                     .on('change.map', function() {
78138                         context.background().updateImagery();
78139                         immediateRedraw();
78140                     });
78141
78142                 selection
78143                     .on('dblclick.map', dblClick)
78144                     .call(zoom)
78145                     .call(zoom.transform, projection.transform());
78146
78147                 supersurface = selection.append('div')
78148                     .attr('id', 'supersurface')
78149                     .call(utilSetTransform, 0, 0);
78150
78151                 // Need a wrapper div because Opera can't cope with an absolutely positioned
78152                 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
78153                 wrapper = supersurface
78154                     .append('div')
78155                     .attr('class', 'layer layer-data');
78156
78157                 map.surface = surface = wrapper
78158                     .call(drawLayers)
78159                     .selectAll('.surface')
78160                     .attr('id', 'surface');
78161
78162                 surface
78163                     .call(drawLabels.observe)
78164                     .on('gesturestart.surface', function() {
78165                         _gestureTransformStart = projection.transform();
78166                     })
78167                     .on('gesturechange.surface', gestureChange)
78168                     .on('mousedown.zoom', function() {
78169                         if (event.button === 2) {
78170                             event.stopPropagation();
78171                         }
78172                     }, true)
78173                     .on('mouseup.zoom', function() {
78174                         if (resetTransform()) {
78175                             immediateRedraw();
78176                         }
78177                     })
78178                     .on('mousemove.map', function() {
78179                         _mouseEvent = event;
78180                     })
78181                     .on('mouseover.vertices', function() {
78182                         if (map.editable() && !_isTransformed) {
78183                             var hover = event.target.__data__;
78184                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78185                             dispatch$1.call('drawn', this, { full: false });
78186                         }
78187                     })
78188                     .on('mouseout.vertices', function() {
78189                         if (map.editable() && !_isTransformed) {
78190                             var hover = event.relatedTarget && event.relatedTarget.__data__;
78191                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78192                             dispatch$1.call('drawn', this, { full: false });
78193                         }
78194                     });
78195
78196                 context.on('enter.map',  function() {
78197                     if (map.editable() && !_isTransformed) {
78198                         // redraw immediately any objects affected by a change in selectedIDs.
78199                         var graph = context.graph();
78200                         var selectedAndParents = {};
78201                         context.selectedIDs().forEach(function(id) {
78202                             var entity = graph.hasEntity(id);
78203                             if (entity) {
78204                                 selectedAndParents[entity.id] = entity;
78205                                 if (entity.type === 'node') {
78206                                     graph.parentWays(entity).forEach(function(parent) {
78207                                         selectedAndParents[parent.id] = parent;
78208                                     });
78209                                 }
78210                             }
78211                         });
78212                         var data = Object.values(selectedAndParents);
78213                         var filter = function(d) { return d.id in selectedAndParents; };
78214
78215                         data = context.features().filter(data, graph);
78216
78217                         surface
78218                             .call(drawVertices.drawSelected, graph, map.extent())
78219                             .call(drawLines, graph, data, filter)
78220                             .call(drawAreas, graph, data, filter)
78221                             .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
78222
78223                         dispatch$1.call('drawn', this, { full: false });
78224
78225                         // redraw everything else later
78226                         scheduleRedraw();
78227                     }
78228                 });
78229
78230                 map.dimensions(utilGetDimensions(selection));
78231             }
78232
78233
78234             function zoomEventFilter() {
78235                 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
78236                 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
78237                 // This can happen if a previous `mousedown` occurred without a `mouseup`.
78238                 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
78239                 // so that d3-zoom won't stop propagation of new `mousedown` events.
78240                 if (event.type === 'mousedown') {
78241                     var hasOrphan = false;
78242                     var listeners = window.__on;
78243                     for (var i = 0; i < listeners.length; i++) {
78244                         var listener = listeners[i];
78245                         if (listener.name === 'zoom' && listener.type === 'mouseup') {
78246                             hasOrphan = true;
78247                             break;
78248                         }
78249                     }
78250                     if (hasOrphan) {
78251                         var event$1 = window.CustomEvent;
78252                         if (event$1) {
78253                             event$1 = new event$1('mouseup');
78254                         } else {
78255                             event$1 = window.document.createEvent('Event');
78256                             event$1.initEvent('mouseup', false, false);
78257                         }
78258                         // Event needs to be dispatched with an event.view property.
78259                         event$1.view = window;
78260                         window.dispatchEvent(event$1);
78261                     }
78262                 }
78263
78264                 return event.button !== 2;   // ignore right clicks
78265             }
78266
78267
78268             function pxCenter() {
78269                 return [_dimensions[0] / 2, _dimensions[1] / 2];
78270             }
78271
78272
78273             function drawEditable(difference, extent) {
78274                 var mode = context.mode();
78275                 var graph = context.graph();
78276                 var features = context.features();
78277                 var all = context.intersects(map.extent());
78278                 var fullRedraw = false;
78279                 var data;
78280                 var set;
78281                 var filter;
78282
78283                 if (difference) {
78284                     var complete = difference.complete(map.extent());
78285                     data = Object.values(complete).filter(Boolean);
78286                     set = new Set(data.map(function(entity) { return entity.id; }));
78287                     filter = function(d) { return set.has(d.id); };
78288                     features.clear(data);
78289
78290                 } else {
78291                     // force a full redraw if gatherStats detects that a feature
78292                     // should be auto-hidden (e.g. points or buildings)..
78293                     if (features.gatherStats(all, graph, _dimensions)) {
78294                         extent = undefined;
78295                     }
78296
78297                     if (extent) {
78298                         data = context.intersects(map.extent().intersection(extent));
78299                         set = new Set(data.map(function(entity) { return entity.id; }));
78300                         filter = function(d) { return set.has(d.id); };
78301
78302                     } else {
78303                         data = all;
78304                         fullRedraw = true;
78305                         filter = utilFunctor(true);
78306                     }
78307                 }
78308
78309                 data = features.filter(data, graph);
78310
78311                 if (mode && mode.id === 'select') {
78312                     // update selected vertices - the user might have just double-clicked a way,
78313                     // creating a new vertex, triggering a partial redraw without a mode change
78314                     surface.call(drawVertices.drawSelected, graph, map.extent());
78315                 }
78316
78317                 surface
78318                     .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
78319                     .call(drawLines, graph, data, filter)
78320                     .call(drawAreas, graph, data, filter)
78321                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
78322                     .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
78323                     .call(drawPoints, graph, data, filter);
78324
78325                 dispatch$1.call('drawn', this, {full: true});
78326             }
78327
78328
78329             function editOff() {
78330                 context.features().resetStats();
78331                 surface.selectAll('.layer-osm *').remove();
78332                 surface.selectAll('.layer-touch:not(.markers) *').remove();
78333
78334                 var allowed = {
78335                     'browse': true,
78336                     'save': true,
78337                     'select-note': true,
78338                     'select-data': true,
78339                     'select-error': true
78340                 };
78341
78342                 var mode = context.mode();
78343                 if (mode && !allowed[mode.id]) {
78344                     context.enter(modeBrowse(context));
78345                 }
78346
78347                 dispatch$1.call('drawn', this, {full: true});
78348             }
78349
78350
78351             function dblClick() {
78352                 if (!_dblClickEnabled) {
78353                     event.preventDefault();
78354                     event.stopImmediatePropagation();
78355                 }
78356             }
78357
78358
78359             function gestureChange() {
78360                 // Remap Safari gesture events to wheel events - #5492
78361                 // We want these disabled most places, but enabled for zoom/unzoom on map surface
78362                 // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
78363                 var e = event;
78364                 e.preventDefault();
78365
78366                 var props = {
78367                     deltaMode: 0,    // dummy values to ignore in zoomPan
78368                     deltaY: 1,       // dummy values to ignore in zoomPan
78369                     clientX: e.clientX,
78370                     clientY: e.clientY,
78371                     screenX: e.screenX,
78372                     screenY: e.screenY,
78373                     x: e.x,
78374                     y: e.y
78375                 };
78376
78377                 var e2 = new WheelEvent('wheel', props);
78378                 e2._scale = e.scale;         // preserve the original scale
78379                 e2._rotation = e.rotation;   // preserve the original rotation
78380
78381                 _selection.node().dispatchEvent(e2);
78382             }
78383
78384
78385             function zoomPan(manualEvent) {
78386                 var event$1 = (manualEvent || event);
78387                 var source = event$1.sourceEvent;
78388                 var eventTransform = event$1.transform;
78389                 var x = eventTransform.x;
78390                 var y = eventTransform.y;
78391                 var k = eventTransform.k;
78392
78393                 if (_transformStart.x === x &&
78394                     _transformStart.y === y &&
78395                     _transformStart.k === k) {
78396                     return;  // no change
78397                 }
78398
78399                 // Special handling of 'wheel' events:
78400                 // They might be triggered by the user scrolling the mouse wheel,
78401                 // or 2-finger pinch/zoom gestures, the transform may need adjustment.
78402                 if (source && source.type === 'wheel') {
78403                     var detected = utilDetect();
78404                     var dX = source.deltaX;
78405                     var dY = source.deltaY;
78406                     var x2 = x;
78407                     var y2 = y;
78408                     var k2 = k;
78409                     var t0, p0, p1;
78410
78411                     // Normalize mousewheel scroll speed (Firefox) - #3029
78412                     // If wheel delta is provided in LINE units, recalculate it in PIXEL units
78413                     // We are essentially redoing the calculations that occur here:
78414                     //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
78415                     // See this for more info:
78416                     //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
78417                     if (source.deltaMode === 1 /* LINE */) {
78418                         // Convert from lines to pixels, more if the user is scrolling fast.
78419                         // (I made up the exp function to roughly match Firefox to what Chrome does)
78420                         // These numbers should be floats, because integers are treated as pan gesture below.
78421                         var lines = Math.abs(source.deltaY);
78422                         var sign = (source.deltaY > 0) ? 1 : -1;
78423                         dY = sign * clamp(
78424                             Math.exp((lines - 1) * 0.75) * 4.000244140625,
78425                             4.000244140625,    // min
78426                             350.000244140625   // max
78427                         );
78428
78429                         // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
78430                         // There doesn't seem to be any scroll accelleration.
78431                         // This multiplier increases the speed a little bit - #5512
78432                         if (detected.os !== 'mac') {
78433                             dY *= 5;
78434                         }
78435
78436                         // recalculate x2,y2,k2
78437                         t0 = _isTransformed ? _transformLast : _transformStart;
78438                         p0 = _getMouseCoords(source);
78439                         p1 = t0.invert(p0);
78440                         k2 = t0.k * Math.pow(2, -dY / 500);
78441                         x2 = p0[0] - p1[0] * k2;
78442                         y2 = p0[1] - p1[1] * k2;
78443
78444                     // 2 finger map pinch zooming (Safari) - #5492
78445                     // These are fake `wheel` events we made from Safari `gesturechange` events..
78446                     } else if (source._scale) {
78447                         // recalculate x2,y2,k2
78448                         t0 = _gestureTransformStart;
78449                         p0 = _getMouseCoords(source);
78450                         p1 = t0.invert(p0);
78451                         k2 = t0.k * source._scale;
78452                         x2 = p0[0] - p1[0] * k2;
78453                         y2 = p0[1] - p1[1] * k2;
78454
78455                     // 2 finger map pinch zooming (all browsers except Safari) - #5492
78456                     // Pinch zooming via the `wheel` event will always have:
78457                     // - `ctrlKey = true`
78458                     // - `deltaY` is not round integer pixels (ignore `deltaX`)
78459                     } else if (source.ctrlKey && !isInteger(dY)) {
78460                         dY *= 6;   // slightly scale up whatever the browser gave us
78461
78462                         // recalculate x2,y2,k2
78463                         t0 = _isTransformed ? _transformLast : _transformStart;
78464                         p0 = _getMouseCoords(source);
78465                         p1 = t0.invert(p0);
78466                         k2 = t0.k * Math.pow(2, -dY / 500);
78467                         x2 = p0[0] - p1[0] * k2;
78468                         y2 = p0[1] - p1[1] * k2;
78469
78470                     // Trackpad scroll zooming with shift or alt/option key down
78471                     } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
78472                         // recalculate x2,y2,k2
78473                         t0 = _isTransformed ? _transformLast : _transformStart;
78474                         p0 = _getMouseCoords(source);
78475                         p1 = t0.invert(p0);
78476                         k2 = t0.k * Math.pow(2, -dY / 500);
78477                         x2 = p0[0] - p1[0] * k2;
78478                         y2 = p0[1] - p1[1] * k2;
78479
78480                     // 2 finger map panning (Mac only, all browsers) - #5492, #5512
78481                     // Panning via the `wheel` event will always have:
78482                     // - `ctrlKey = false`
78483                     // - `deltaX`,`deltaY` are round integer pixels
78484                     } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
78485                         p1 = projection.translate();
78486                         x2 = p1[0] - dX;
78487                         y2 = p1[1] - dY;
78488                         k2 = projection.scale();
78489                     }
78490
78491                     // something changed - replace the event transform
78492                     if (x2 !== x || y2 !== y || k2 !== k) {
78493                         x = x2;
78494                         y = y2;
78495                         k = k2;
78496                         eventTransform = identity$8.translate(x2, y2).scale(k2);
78497                         _selection.node().__zoom = eventTransform;
78498                     }
78499
78500                 }
78501
78502                 if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
78503                     surface.interrupt();
78504                     uiFlash().text(t('cannot_zoom'))();
78505                     setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
78506                     scheduleRedraw();
78507                     dispatch$1.call('move', this, map);
78508                     return;
78509                 }
78510
78511                 projection.transform(eventTransform);
78512
78513                 var scale = k / _transformStart.k;
78514                 var tX = (x / scale - _transformStart.x) * scale;
78515                 var tY = (y / scale - _transformStart.y) * scale;
78516
78517                 if (context.inIntro()) {
78518                     curtainProjection.transform({
78519                         x: x - tX,
78520                         y: y - tY,
78521                         k: k
78522                     });
78523                 }
78524
78525                 if (source) {
78526                     _mouseEvent = event$1;
78527                 }
78528                 _isTransformed = true;
78529                 _transformLast = eventTransform;
78530                 utilSetTransform(supersurface, tX, tY, scale);
78531                 scheduleRedraw();
78532
78533                 dispatch$1.call('move', this, map);
78534
78535
78536                 function isInteger(val) {
78537                     return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
78538                 }
78539             }
78540
78541
78542             function resetTransform() {
78543                 if (!_isTransformed) return false;
78544
78545                 // deprecation warning - Radial Menu to be removed in iD v3
78546                 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
78547                 utilSetTransform(supersurface, 0, 0);
78548                 _isTransformed = false;
78549                 if (context.inIntro()) {
78550                     curtainProjection.transform(projection.transform());
78551                 }
78552                 return true;
78553             }
78554
78555
78556             function redraw(difference, extent) {
78557                 if (surface.empty() || !_redrawEnabled) return;
78558
78559                 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
78560                 // It would result in artifacts where differenced entities are redrawn with
78561                 // one transform and unchanged entities with another.
78562                 if (resetTransform()) {
78563                     difference = extent = undefined;
78564                 }
78565
78566                 var zoom = map.zoom();
78567                 var z = String(~~zoom);
78568
78569                 if (surface.attr('data-zoom') !== z) {
78570                     surface.attr('data-zoom', z);
78571                 }
78572
78573                 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
78574                 var lat = map.center()[1];
78575                 var lowzoom = linear$2()
78576                     .domain([-60, 0, 60])
78577                     .range([17, 18.5, 17])
78578                     .clamp(true);
78579
78580                 surface
78581                     .classed('low-zoom', zoom <= lowzoom(lat));
78582
78583
78584                 if (!difference) {
78585                     supersurface.call(context.background());
78586                     wrapper.call(drawLayers);
78587                 }
78588
78589                 // OSM
78590                 if (map.editable()) {
78591                     context.loadTiles(projection);
78592                     drawEditable(difference, extent);
78593                 } else {
78594                     editOff();
78595                 }
78596
78597                 _transformStart = projection.transform();
78598
78599                 return map;
78600             }
78601
78602
78603
78604             var immediateRedraw = function(difference, extent) {
78605                 if (!difference && !extent) cancelPendingRedraw();
78606                 redraw(difference, extent);
78607             };
78608
78609
78610             map.mouse = function() {
78611                 var event$1 = _mouseEvent || event;
78612                 if (event$1) {
78613                     var s;
78614                     while ((s = event$1.sourceEvent)) { event$1 = s; }
78615                     return _getMouseCoords(event$1);
78616                 }
78617                 return null;
78618             };
78619
78620
78621             // returns Lng/Lat
78622             map.mouseCoordinates = function() {
78623                 var coord = map.mouse() || pxCenter();
78624                 return projection.invert(coord);
78625             };
78626
78627
78628             map.dblclickEnable = function(val) {
78629                 if (!arguments.length) return _dblClickEnabled;
78630                 _dblClickEnabled = val;
78631                 return map;
78632             };
78633
78634
78635             map.redrawEnable = function(val) {
78636                 if (!arguments.length) return _redrawEnabled;
78637                 _redrawEnabled = val;
78638                 return map;
78639             };
78640
78641
78642             map.isTransformed = function() {
78643                 return _isTransformed;
78644             };
78645
78646
78647             function setTransform(t2, duration, force) {
78648                 var t = projection.transform();
78649                 if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
78650
78651                 if (duration) {
78652                     _selection
78653                         .transition()
78654                         .duration(duration)
78655                         .on('start', function() { map.startEase(); })
78656                         .call(zoom.transform, identity$8.translate(t2.x, t2.y).scale(t2.k));
78657                 } else {
78658                     projection.transform(t2);
78659                     _transformStart = t2;
78660                     _selection.call(zoom.transform, _transformStart);
78661                 }
78662
78663                 return true;
78664             }
78665
78666
78667             function setCenterZoom(loc2, z2, duration, force) {
78668                 var c = map.center();
78669                 var z = map.zoom();
78670                 if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
78671
78672                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78673
78674                 var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
78675                 proj.scale(k2);
78676
78677                 var t = proj.translate();
78678                 var point = proj(loc2);
78679
78680                 var center = pxCenter();
78681                 t[0] += center[0] - point[0];
78682                 t[1] += center[1] - point[1];
78683
78684                 return setTransform(identity$8.translate(t[0], t[1]).scale(k2), duration, force);
78685             }
78686
78687
78688             map.pan = function(delta, duration) {
78689                 var t = projection.translate();
78690                 var k = projection.scale();
78691
78692                 t[0] += delta[0];
78693                 t[1] += delta[1];
78694
78695                 if (duration) {
78696                     _selection
78697                         .transition()
78698                         .duration(duration)
78699                         .on('start', function() { map.startEase(); })
78700                         .call(zoom.transform, identity$8.translate(t[0], t[1]).scale(k));
78701                 } else {
78702                     projection.translate(t);
78703                     _transformStart = projection.transform();
78704                     _selection.call(zoom.transform, _transformStart);
78705                     dispatch$1.call('move', this, map);
78706                     immediateRedraw();
78707                 }
78708
78709                 return map;
78710             };
78711
78712
78713             map.dimensions = function(val) {
78714                 if (!arguments.length) return _dimensions;
78715
78716                 _dimensions = val;
78717                 drawLayers.dimensions(_dimensions);
78718                 context.background().dimensions(_dimensions);
78719                 projection.clipExtent([[0, 0], _dimensions]);
78720                 _getMouseCoords = utilFastMouse(supersurface.node());
78721
78722                 scheduleRedraw();
78723                 return map;
78724             };
78725
78726
78727             function zoomIn(delta) {
78728                 setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
78729             }
78730
78731             function zoomOut(delta) {
78732                 setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
78733             }
78734
78735             map.zoomIn = function() { zoomIn(1); };
78736             map.zoomInFurther = function() { zoomIn(4); };
78737
78738             map.zoomOut = function() { zoomOut(1); };
78739             map.zoomOutFurther = function() { zoomOut(4); };
78740
78741
78742             map.center = function(loc2) {
78743                 if (!arguments.length) {
78744                     return projection.invert(pxCenter());
78745                 }
78746
78747                 if (setCenterZoom(loc2, map.zoom())) {
78748                     dispatch$1.call('move', this, map);
78749                 }
78750
78751                 scheduleRedraw();
78752                 return map;
78753             };
78754
78755             map.unobscuredCenterZoomEase = function(loc, zoom) {
78756                 var offset = map.unobscuredOffsetPx();
78757
78758                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78759                 // use the target zoom to calculate the offset center
78760                 proj.scale(geoZoomToScale(zoom, TILESIZE));
78761                 
78762                 var locPx = proj(loc);
78763                 var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
78764                 var offsetLoc = proj.invert(offsetLocPx);
78765
78766                 map.centerZoomEase(offsetLoc, zoom);
78767             };
78768
78769             map.unobscuredOffsetPx = function() {
78770                 var openPane = d3_select('.map-panes .map-pane.shown');
78771                 if (!openPane.empty()) {
78772                     return [openPane.node().offsetWidth/2, 0];
78773                 }
78774                 return [0, 0];
78775             };
78776
78777             map.zoom = function(z2) {
78778                 if (!arguments.length) {
78779                     return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
78780                 }
78781
78782                 if (z2 < _minzoom) {
78783                     surface.interrupt();
78784                     uiFlash().text(t('cannot_zoom'))();
78785                     z2 = context.minEditableZoom();
78786                 }
78787
78788                 if (setCenterZoom(map.center(), z2)) {
78789                     dispatch$1.call('move', this, map);
78790                 }
78791
78792                 scheduleRedraw();
78793                 return map;
78794             };
78795
78796
78797             map.centerZoom = function(loc2, z2) {
78798                 if (setCenterZoom(loc2, z2)) {
78799                     dispatch$1.call('move', this, map);
78800                 }
78801
78802                 scheduleRedraw();
78803                 return map;
78804             };
78805
78806
78807             map.zoomTo = function(entity) {
78808                 var extent = entity.extent(context.graph());
78809                 if (!isFinite(extent.area())) return map;
78810
78811                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78812                 return map.centerZoom(extent.center(), z2);
78813             };
78814
78815
78816             map.centerEase = function(loc2, duration) {
78817                 duration = duration || 250;
78818                 setCenterZoom(loc2, map.zoom(), duration);
78819                 return map;
78820             };
78821
78822
78823             map.zoomEase = function(z2, duration) {
78824                 duration = duration || 250;
78825                 setCenterZoom(map.center(), z2, duration, false);
78826                 return map;
78827             };
78828
78829
78830             map.centerZoomEase = function(loc2, z2, duration) {
78831                 duration = duration || 250;
78832                 setCenterZoom(loc2, z2, duration, false);
78833                 return map;
78834             };
78835
78836
78837             map.transformEase = function(t2, duration) {
78838                 duration = duration || 250;
78839                 setTransform(t2, duration, false);
78840                 return map;
78841             };
78842
78843
78844             map.zoomToEase = function(entity, duration) {
78845                 var extent = entity.extent(context.graph());
78846                 if (!isFinite(extent.area())) return map;
78847
78848                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78849                 return map.centerZoomEase(extent.center(), z2, duration);
78850             };
78851
78852
78853             map.startEase = function() {
78854                 utilBindOnce(surface, 'mousedown.ease', function() {
78855                     map.cancelEase();
78856                 });
78857                 return map;
78858             };
78859
78860
78861             map.cancelEase = function() {
78862                 _selection.interrupt();
78863                 return map;
78864             };
78865
78866
78867             map.extent = function(val) {
78868                 if (!arguments.length) {
78869                     return new geoExtent(
78870                         projection.invert([0, _dimensions[1]]),
78871                         projection.invert([_dimensions[0], 0])
78872                     );
78873                 } else {
78874                     var extent = geoExtent(val);
78875                     map.centerZoom(extent.center(), map.extentZoom(extent));
78876                 }
78877             };
78878
78879
78880             map.trimmedExtent = function(val) {
78881                 if (!arguments.length) {
78882                     var headerY = 60;
78883                     var footerY = 30;
78884                     var pad = 10;
78885                     return new geoExtent(
78886                         projection.invert([pad, _dimensions[1] - footerY - pad]),
78887                         projection.invert([_dimensions[0] - pad, headerY + pad])
78888                     );
78889                 } else {
78890                     var extent = geoExtent(val);
78891                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
78892                 }
78893             };
78894
78895
78896             function calcExtentZoom(extent, dim) {
78897                 var tl = projection([extent[0][0], extent[1][1]]);
78898                 var br = projection([extent[1][0], extent[0][1]]);
78899
78900                 // Calculate maximum zoom that fits extent
78901                 var hFactor = (br[0] - tl[0]) / dim[0];
78902                 var vFactor = (br[1] - tl[1]) / dim[1];
78903                 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
78904                 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
78905                 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
78906
78907                 return newZoom;
78908             }
78909
78910
78911             map.extentZoom = function(val) {
78912                 return calcExtentZoom(geoExtent(val), _dimensions);
78913             };
78914
78915
78916             map.trimmedExtentZoom = function(val) {
78917                 var trimY = 120;
78918                 var trimX = 40;
78919                 var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
78920                 return calcExtentZoom(geoExtent(val), trimmed);
78921             };
78922
78923
78924             map.editable = function() {
78925                 var layer = context.layers().layer('osm');
78926                 if (!layer || !layer.enabled()) return false;
78927
78928                 return map.zoom() >= context.minEditableZoom();
78929             };
78930
78931
78932             map.notesEditable = function() {
78933                 var layer = context.layers().layer('notes');
78934                 if (!layer || !layer.enabled()) return false;
78935
78936                 return map.zoom() >= context.minEditableZoom();
78937             };
78938
78939
78940             map.minzoom = function(val) {
78941                 if (!arguments.length) return _minzoom;
78942                 _minzoom = val;
78943                 return map;
78944             };
78945
78946
78947             map.layers = drawLayers;
78948
78949
78950             return utilRebind(map, dispatch$1, 'on');
78951         }
78952
78953         function rendererPhotos(context) {
78954             var dispatch$1 = dispatch('change');
78955             var _layerIDs = ['streetside', 'mapillary', 'mapillary-signs', 'openstreetcam'];
78956             var _allPhotoTypes = ['flat', 'panoramic'];
78957             var _shownPhotoTypes = _allPhotoTypes.slice();   // shallow copy
78958
78959             function photos() {}
78960
78961             function updateStorage() {
78962                 if (window.mocha) return;
78963
78964                 var q = utilStringQs(window.location.hash.substring(1));
78965                 var enabled = context.layers().all().filter(function(d) {
78966                     return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
78967                 }).map(function(d) {
78968                     return d.id;
78969                 });
78970                 if (enabled.length) {
78971                     q.photo_overlay = enabled.join(',');
78972                 } else {
78973                     delete q.photo_overlay;
78974                 }
78975                 window.location.replace('#' + utilQsString(q, true));
78976             }
78977
78978             photos.overlayLayerIDs = function() {
78979                 return _layerIDs;
78980             };
78981
78982             photos.allPhotoTypes = function() {
78983                 return _allPhotoTypes;
78984             };
78985
78986             function showsLayer(id) {
78987                 var layer = context.layers().layer(id);
78988                 return layer && layer.supported() && layer.enabled();
78989             }
78990
78991             photos.shouldFilterByPhotoType = function() {
78992                 return showsLayer('mapillary') ||
78993                     (showsLayer('streetside') && showsLayer('openstreetcam'));
78994             };
78995
78996             photos.showsPhotoType = function(val) {
78997                 if (!photos.shouldFilterByPhotoType()) return true;
78998
78999                 return _shownPhotoTypes.indexOf(val) !== -1;
79000             };
79001
79002             photos.showsFlat = function() {
79003                 return photos.showsPhotoType('flat');
79004             };
79005
79006             photos.showsPanoramic = function() {
79007                 return photos.showsPhotoType('panoramic');
79008             };
79009
79010             photos.togglePhotoType = function(val) {
79011                 var index = _shownPhotoTypes.indexOf(val);
79012                 if (index !== -1) {
79013                     _shownPhotoTypes.splice(index, 1);
79014                 } else {
79015                     _shownPhotoTypes.push(val);
79016                 }
79017                 dispatch$1.call('change', this);
79018                 return photos;
79019             };
79020
79021             photos.init = function() {
79022                 var q = utilStringQs(window.location.hash.substring(1));
79023                 if (q.photo_overlay) {
79024                     var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
79025                     hashOverlayIDs.forEach(function(id) {
79026                         var layer = context.layers().layer(id);
79027                         if (layer) layer.enabled(true);
79028                     });
79029                 }
79030
79031                 context.layers().on('change.rendererPhotos', updateStorage);
79032             };
79033
79034             return utilRebind(photos, dispatch$1, 'on');
79035         }
79036
79037         function uiAccount(context) {
79038             var osm = context.connection();
79039
79040
79041             function update(selection) {
79042                 if (!osm) return;
79043
79044                 if (!osm.authenticated()) {
79045                     selection.selectAll('#userLink, #logoutLink')
79046                         .classed('hide', true);
79047                     return;
79048                 }
79049
79050                 osm.userDetails(function(err, details) {
79051                     var userLink = selection.select('#userLink'),
79052                         logoutLink = selection.select('#logoutLink');
79053
79054                     userLink.html('');
79055                     logoutLink.html('');
79056
79057                     if (err) return;
79058
79059                     selection.selectAll('#userLink, #logoutLink')
79060                         .classed('hide', false);
79061
79062                     // Link
79063                     userLink.append('a')
79064                         .attr('href', osm.userURL(details.display_name))
79065                         .attr('target', '_blank');
79066
79067                     // Add thumbnail or dont
79068                     if (details.image_url) {
79069                         userLink.append('img')
79070                             .attr('class', 'icon pre-text user-icon')
79071                             .attr('src', details.image_url);
79072                     } else {
79073                         userLink
79074                             .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
79075                     }
79076
79077                     // Add user name
79078                     userLink.append('span')
79079                         .attr('class', 'label')
79080                         .text(details.display_name);
79081
79082                     logoutLink.append('a')
79083                         .attr('class', 'logout')
79084                         .attr('href', '#')
79085                         .text(t('logout'))
79086                         .on('click.logout', function() {
79087                             event.preventDefault();
79088                             osm.logout();
79089                         });
79090                 });
79091             }
79092
79093
79094             return function(selection) {
79095                 selection.append('li')
79096                     .attr('id', 'logoutLink')
79097                     .classed('hide', true);
79098
79099                 selection.append('li')
79100                     .attr('id', 'userLink')
79101                     .classed('hide', true);
79102
79103                 if (osm) {
79104                     osm.on('change.account', function() { update(selection); });
79105                     update(selection);
79106                 }
79107             };
79108         }
79109
79110         function uiAttribution(context) {
79111             var selection;
79112
79113
79114             function attribution(data, klass) {
79115                 var div = selection.selectAll('.' + klass)
79116                     .data([0]);
79117
79118                 div = div.enter()
79119                     .append('div')
79120                     .attr('class', klass)
79121                     .merge(div);
79122
79123
79124                 var background = div.selectAll('.attribution')
79125                     .data(data, function(d) { return d.name(); });
79126
79127                 background.exit()
79128                     .remove();
79129
79130                 background = background.enter()
79131                     .append('span')
79132                     .attr('class', 'attribution')
79133                     .each(function(d) {
79134                         if (d.terms_html) {
79135                             d3_select(this)
79136                                 .html(d.terms_html);
79137                             return;
79138                         }
79139
79140                         var selection;
79141                         if (d.terms_url) {
79142                             selection = d3_select(this)
79143                                 .append('a')
79144                                 .attr('href', d.terms_url)
79145                                 .attr('target', '_blank');
79146                         } else {
79147                             selection = d3_select(this);
79148                         }
79149
79150
79151                         var id_safe = d.id.replace(/\./g, '<TX_DOT>');
79152                         var terms_text = t('imagery.' + id_safe + '.attribution.text',
79153                             { default: d.terms_text || d.id || d.name() }
79154                         );
79155
79156                         if (d.icon && !d.overlay) {
79157                             selection
79158                                 .append('img')
79159                                 .attr('class', 'source-image')
79160                                 .attr('src', d.icon);
79161                         }
79162
79163                         selection
79164                             .append('span')
79165                             .attr('class', 'attribution-text')
79166                             .text(terms_text);
79167                     })
79168                     .merge(background);
79169
79170
79171                 var copyright = background.selectAll('.copyright-notice')
79172                     .data(function(d) {
79173                         var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
79174                         return notice ? [notice] : [];
79175                     });
79176
79177                 copyright.exit()
79178                     .remove();
79179
79180                 copyright = copyright.enter()
79181                     .append('span')
79182                     .attr('class', 'copyright-notice')
79183                     .merge(copyright);
79184
79185                 copyright
79186                     .text(String);
79187             }
79188
79189
79190             function update() {
79191                 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
79192                 attribution(context.background().overlayLayerSources().filter(function (s) {
79193                     return s.validZoom(context.map().zoom());
79194                 }), 'overlay-layer-attribution');
79195             }
79196
79197
79198             return function(select) {
79199                 selection = select;
79200
79201                 context.background()
79202                     .on('change.attribution', update);
79203
79204                 context.map()
79205                     .on('move.attribution', throttle(update, 400, {leading: false}));
79206
79207                 update();
79208             };
79209         }
79210
79211         function uiBackgroundDisplayOptions(context) {
79212             var detected = utilDetect();
79213             var storedOpacity = context.storage('background-opacity');
79214             var minVal = 0.25;
79215             var maxVal = detected.cssfilters ? 2 : 1;
79216
79217             var sliders = detected.cssfilters
79218                 ? ['brightness', 'contrast', 'saturation', 'sharpness']
79219                 : ['brightness'];
79220
79221             var _options = {
79222                 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
79223                 contrast: 1,
79224                 saturation: 1,
79225                 sharpness: 1
79226             };
79227
79228             var _selection = d3_select(null);
79229
79230
79231             function clamp(x, min, max) {
79232                 return Math.max(min, Math.min(x, max));
79233             }
79234
79235
79236             function updateValue(d, val) {
79237                 if (!val && event && event.target) {
79238                     val = event.target.value;
79239                 }
79240
79241                 val = clamp(val, minVal, maxVal);
79242
79243                 _options[d] = val;
79244                 context.background()[d](val);
79245
79246                 if (d === 'brightness') {
79247                     context.storage('background-opacity', val);
79248                 }
79249
79250                 _selection
79251                     .call(render);
79252             }
79253
79254
79255             function render(selection) {
79256                 var container = selection.selectAll('.display-options-container')
79257                     .data([0]);
79258
79259                 var containerEnter = container.enter()
79260                     .append('div')
79261                     .attr('class', 'display-options-container controls-list');
79262
79263                 // add slider controls
79264                 var slidersEnter = containerEnter.selectAll('.display-control')
79265                     .data(sliders)
79266                     .enter()
79267                     .append('div')
79268                     .attr('class', function(d) { return 'display-control display-control-' + d; });
79269
79270                 slidersEnter
79271                     .append('h5')
79272                     .text(function(d) { return t('background.' + d); })
79273                     .append('span')
79274                     .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
79275
79276                 slidersEnter
79277                     .append('input')
79278                     .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
79279                     .attr('type', 'range')
79280                     .attr('min', minVal)
79281                     .attr('max', maxVal)
79282                     .attr('step', '0.05')
79283                     .on('input', function(d) {
79284                         var val = d3_select(this).property('value');
79285                         updateValue(d, val);
79286                     });
79287
79288                 slidersEnter
79289                     .append('button')
79290                     .attr('title', t('background.reset'))
79291                     .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
79292                     .on('click', function(d) {
79293                         if (event.button !== 0) return;
79294                         updateValue(d, 1);
79295                     })
79296                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79297
79298                 // reset all button
79299                 containerEnter
79300                     .append('a')
79301                     .attr('class', 'display-option-resetlink')
79302                     .attr('href', '#')
79303                     .text(t('background.reset_all'))
79304                     .on('click', function() {
79305                         for (var i = 0; i < sliders.length; i++) {
79306                             updateValue(sliders[i],1);
79307                         }
79308                     });
79309
79310                 // update
79311                 container = containerEnter
79312                     .merge(container);
79313
79314                 container.selectAll('.display-option-input')
79315                     .property('value', function(d) { return _options[d]; });
79316
79317                 container.selectAll('.display-option-value')
79318                     .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
79319
79320                 container.selectAll('.display-option-reset')
79321                     .classed('disabled', function(d) { return _options[d] === 1; });
79322
79323                 // first time only, set brightness if needed
79324                 if (containerEnter.size() && _options.brightness !== 1) {
79325                     context.background().brightness(_options.brightness);
79326                 }
79327             }
79328
79329
79330             function backgroundDisplayOptions(selection) {
79331                 _selection = selection;
79332
79333                 selection
79334                     .call(uiDisclosure(context, 'background_display_options', true)
79335                         .title(t('background.display_options'))
79336                         .content(render)
79337                     );
79338             }
79339
79340
79341             return backgroundDisplayOptions;
79342         }
79343
79344         function uiBackgroundOffset(context) {
79345             var directions = [
79346                 ['right', [0.5, 0]],
79347                 ['top', [0, -0.5]],
79348                 ['left', [-0.5, 0]],
79349                 ['bottom', [0, 0.5]]
79350             ];
79351
79352
79353             function d3_eventCancel() {
79354                 event.stopPropagation();
79355                 event.preventDefault();
79356             }
79357
79358
79359             function updateValue() {
79360                 var meters = geoOffsetToMeters(context.background().offset());
79361                 var x = +meters[0].toFixed(2);
79362                 var y = +meters[1].toFixed(2);
79363
79364                 d3_selectAll('.nudge-inner-rect')
79365                     .select('input')
79366                     .classed('error', false)
79367                     .property('value', x + ', ' + y);
79368
79369                 d3_selectAll('.nudge-reset')
79370                     .classed('disabled', function() {
79371                         return (x === 0 && y === 0);
79372                     });
79373             }
79374
79375
79376             function resetOffset() {
79377                 context.background().offset([0, 0]);
79378                 updateValue();
79379             }
79380
79381
79382             function nudge(d) {
79383                 context.background().nudge(d, context.map().zoom());
79384                 updateValue();
79385             }
79386
79387
79388             function clickNudgeButton(d) {
79389                 var interval;
79390                 var timeout = window.setTimeout(function() {
79391                         interval = window.setInterval(nudge.bind(null, d), 100);
79392                     }, 500);
79393
79394                 function doneNudge() {
79395                     window.clearTimeout(timeout);
79396                     window.clearInterval(interval);
79397                     d3_select(window)
79398                         .on('mouseup.buttonoffset', null, true)
79399                         .on('mousedown.buttonoffset', null, true);
79400                 }
79401
79402                 d3_select(window)
79403                     .on('mouseup.buttonoffset', doneNudge, true)
79404                     .on('mousedown.buttonoffset', doneNudge, true);
79405
79406                 nudge(d);
79407             }
79408
79409
79410             function inputOffset() {
79411                 var input = d3_select(this);
79412                 var d = input.node().value;
79413
79414                 if (d === '') return resetOffset();
79415
79416                 d = d.replace(/;/g, ',').split(',').map(function(n) {
79417                     // if n is NaN, it will always get mapped to false.
79418                     return !isNaN(n) && n;
79419                 });
79420
79421                 if (d.length !== 2 || !d[0] || !d[1]) {
79422                     input.classed('error', true);
79423                     return;
79424                 }
79425
79426                 context.background().offset(geoMetersToOffset(d));
79427                 updateValue();
79428             }
79429
79430
79431             function dragOffset() {
79432                 event.preventDefault();
79433                 if (event.button !== 0) return;
79434
79435                 var origin = [event.clientX, event.clientY];
79436
79437                 context.container()
79438                     .append('div')
79439                     .attr('class', 'nudge-surface');
79440
79441                 d3_select(window)
79442                     .on('mousemove.offset', function() {
79443                         var latest = [event.clientX, event.clientY];
79444                         var d = [
79445                             -(origin[0] - latest[0]) / 4,
79446                             -(origin[1] - latest[1]) / 4
79447                         ];
79448
79449                         origin = latest;
79450                         nudge(d);
79451                     })
79452                     .on('mouseup.offset', function() {
79453                         if (event.button !== 0) return;
79454                         d3_selectAll('.nudge-surface')
79455                             .remove();
79456
79457                         d3_select(window)
79458                             .on('mousemove.offset', null)
79459                             .on('mouseup.offset', null);
79460                     });
79461             }
79462
79463
79464             function render(selection) {
79465                 var container = selection.selectAll('.nudge-container')
79466                     .data([0]);
79467
79468                 var containerEnter = container.enter()
79469                     .append('div')
79470                     .attr('class', 'nudge-container cf');
79471
79472                 containerEnter
79473                     .append('div')
79474                     .attr('class', 'nudge-instructions')
79475                     .text(t('background.offset'));
79476
79477                 var nudgeEnter = containerEnter
79478                     .append('div')
79479                     .attr('class', 'nudge-outer-rect')
79480                     .on('mousedown', dragOffset);
79481
79482                 nudgeEnter
79483                     .append('div')
79484                     .attr('class', 'nudge-inner-rect')
79485                     .append('input')
79486                     .on('change', inputOffset);
79487
79488                 containerEnter
79489                     .append('div')
79490                     .selectAll('button')
79491                     .data(directions).enter()
79492                     .append('button')
79493                     .attr('class', function(d) { return d[0] + ' nudge'; })
79494                     .on('contextmenu', d3_eventCancel)
79495                     .on('mousedown', function(d) {
79496                         if (event.button !== 0) return;
79497                         clickNudgeButton(d[1]);
79498                     });
79499
79500                 containerEnter
79501                     .append('button')
79502                     .attr('title', t('background.reset'))
79503                     .attr('class', 'nudge-reset disabled')
79504                     .on('contextmenu', d3_eventCancel)
79505                     .on('click', function() {
79506                         if (event.button !== 0) return;
79507                         resetOffset();
79508                     })
79509                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79510
79511                 updateValue();
79512             }
79513
79514
79515             function backgroundOffset(selection) {
79516                 selection
79517                     .call(uiDisclosure(context, 'background_offset', false)
79518                         .title(t('background.fix_misalignment'))
79519                         .content(render)
79520                     );
79521             }
79522
79523
79524             context.background()
79525                 .on('change.backgroundOffset-update', updateValue);
79526
79527             return backgroundOffset;
79528         }
79529
79530         // import { utilGetDimensions } from '../util/dimensions';
79531
79532
79533         function uiMapInMap(context) {
79534
79535             function mapInMap(selection) {
79536                 var backgroundLayer = rendererTileLayer(context);
79537                 var overlayLayers = {};
79538                 var projection = geoRawMercator();
79539                 var dataLayer = svgData(projection, context).showLabels(false);
79540                 var debugLayer = svgDebug(projection, context);
79541                 var zoom = d3_zoom()
79542                     .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
79543                     .on('start', zoomStarted)
79544                     .on('zoom', zoomed)
79545                     .on('end', zoomEnded);
79546
79547                 var wrap = d3_select(null);
79548                 var tiles = d3_select(null);
79549                 var viewport = d3_select(null);
79550
79551                 var _isTransformed = false;
79552                 var _isHidden = true;
79553                 var _skipEvents = false;
79554                 var _gesture = null;
79555                 var _zDiff = 6;    // by default, minimap renders at (main zoom - 6)
79556                 var _dMini;        // dimensions of minimap
79557                 var _cMini;        // center pixel of minimap
79558                 var _tStart;       // transform at start of gesture
79559                 var _tCurr;        // transform at most recent event
79560                 var _timeoutID;
79561
79562
79563                 function zoomStarted() {
79564                     if (_skipEvents) return;
79565                     _tStart = _tCurr = projection.transform();
79566                     _gesture = null;
79567                 }
79568
79569
79570                 function zoomed() {
79571                     if (_skipEvents) return;
79572
79573                     var x = event.transform.x;
79574                     var y = event.transform.y;
79575                     var k = event.transform.k;
79576                     var isZooming = (k !== _tStart.k);
79577                     var isPanning = (x !== _tStart.x || y !== _tStart.y);
79578
79579                     if (!isZooming && !isPanning) {
79580                         return;  // no change
79581                     }
79582
79583                     // lock in either zooming or panning, don't allow both in minimap.
79584                     if (!_gesture) {
79585                         _gesture = isZooming ? 'zoom' : 'pan';
79586                     }
79587
79588                     var tMini = projection.transform();
79589                     var tX, tY, scale;
79590
79591                     if (_gesture === 'zoom') {
79592                         scale = k / tMini.k;
79593                         tX = (_cMini[0] / scale - _cMini[0]) * scale;
79594                         tY = (_cMini[1] / scale - _cMini[1]) * scale;
79595                     } else {
79596                         k = tMini.k;
79597                         scale = 1;
79598                         tX = x - tMini.x;
79599                         tY = y - tMini.y;
79600                     }
79601
79602                     utilSetTransform(tiles, tX, tY, scale);
79603                     utilSetTransform(viewport, 0, 0, scale);
79604                     _isTransformed = true;
79605                     _tCurr = identity$8.translate(x, y).scale(k);
79606
79607                     var zMain = geoScaleToZoom(context.projection.scale());
79608                     var zMini = geoScaleToZoom(k);
79609
79610                     _zDiff = zMain - zMini;
79611
79612                     queueRedraw();
79613                 }
79614
79615
79616                 function zoomEnded() {
79617                     if (_skipEvents) return;
79618                     if (_gesture !== 'pan') return;
79619
79620                     updateProjection();
79621                     _gesture = null;
79622                     context.map().center(projection.invert(_cMini));   // recenter main map..
79623                 }
79624
79625
79626                 function updateProjection() {
79627                     var loc = context.map().center();
79628                     var tMain = context.projection.transform();
79629                     var zMain = geoScaleToZoom(tMain.k);
79630                     var zMini = Math.max(zMain - _zDiff, 0.5);
79631                     var kMini = geoZoomToScale(zMini);
79632
79633                     projection
79634                         .translate([tMain.x, tMain.y])
79635                         .scale(kMini);
79636
79637                     var point = projection(loc);
79638                     var mouse = (_gesture === 'pan') ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
79639                     var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
79640                     var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
79641
79642                     projection
79643                         .translate([xMini, yMini])
79644                         .clipExtent([[0, 0], _dMini]);
79645
79646                     _tCurr = projection.transform();
79647
79648                     if (_isTransformed) {
79649                         utilSetTransform(tiles, 0, 0);
79650                         utilSetTransform(viewport, 0, 0);
79651                         _isTransformed = false;
79652                     }
79653
79654                     zoom
79655                         .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
79656
79657                     _skipEvents = true;
79658                     wrap.call(zoom.transform, _tCurr);
79659                     _skipEvents = false;
79660                 }
79661
79662
79663                 function redraw() {
79664                     clearTimeout(_timeoutID);
79665                     if (_isHidden) return;
79666
79667                     updateProjection();
79668                     var zMini = geoScaleToZoom(projection.scale());
79669
79670                     // setup tile container
79671                     tiles = wrap
79672                         .selectAll('.map-in-map-tiles')
79673                         .data([0]);
79674
79675                     tiles = tiles.enter()
79676                         .append('div')
79677                         .attr('class', 'map-in-map-tiles')
79678                         .merge(tiles);
79679
79680                     // redraw background
79681                     backgroundLayer
79682                         .source(context.background().baseLayerSource())
79683                         .projection(projection)
79684                         .dimensions(_dMini);
79685
79686                     var background = tiles
79687                         .selectAll('.map-in-map-background')
79688                         .data([0]);
79689
79690                     background.enter()
79691                         .append('div')
79692                         .attr('class', 'map-in-map-background')
79693                         .merge(background)
79694                         .call(backgroundLayer);
79695
79696
79697                     // redraw overlay
79698                     var overlaySources = context.background().overlayLayerSources();
79699                     var activeOverlayLayers = [];
79700                     for (var i = 0; i < overlaySources.length; i++) {
79701                         if (overlaySources[i].validZoom(zMini)) {
79702                             if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
79703                             activeOverlayLayers.push(overlayLayers[i]
79704                                 .source(overlaySources[i])
79705                                 .projection(projection)
79706                                 .dimensions(_dMini));
79707                         }
79708                     }
79709
79710                     var overlay = tiles
79711                         .selectAll('.map-in-map-overlay')
79712                         .data([0]);
79713
79714                     overlay = overlay.enter()
79715                         .append('div')
79716                         .attr('class', 'map-in-map-overlay')
79717                         .merge(overlay);
79718
79719
79720                     var overlays = overlay
79721                         .selectAll('div')
79722                         .data(activeOverlayLayers, function(d) { return d.source().name(); });
79723
79724                     overlays.exit()
79725                         .remove();
79726
79727                     overlays = overlays.enter()
79728                         .append('div')
79729                         .merge(overlays)
79730                         .each(function(layer) { d3_select(this).call(layer); });
79731
79732
79733                     var dataLayers = tiles
79734                         .selectAll('.map-in-map-data')
79735                         .data([0]);
79736
79737                     dataLayers.exit()
79738                         .remove();
79739
79740                     dataLayers = dataLayers.enter()
79741                         .append('svg')
79742                         .attr('class', 'map-in-map-data')
79743                         .merge(dataLayers)
79744                         .call(dataLayer)
79745                         .call(debugLayer);
79746
79747
79748                     // redraw viewport bounding box
79749                     if (_gesture !== 'pan') {
79750                         var getPath = d3_geoPath(projection);
79751                         var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
79752
79753                         viewport = wrap.selectAll('.map-in-map-viewport')
79754                             .data([0]);
79755
79756                         viewport = viewport.enter()
79757                             .append('svg')
79758                             .attr('class', 'map-in-map-viewport')
79759                             .merge(viewport);
79760
79761
79762                         var path = viewport.selectAll('.map-in-map-bbox')
79763                             .data([bbox]);
79764
79765                         path.enter()
79766                             .append('path')
79767                             .attr('class', 'map-in-map-bbox')
79768                             .merge(path)
79769                             .attr('d', getPath)
79770                             .classed('thick', function(d) { return getPath.area(d) < 30; });
79771                     }
79772                 }
79773
79774
79775                 function queueRedraw() {
79776                     clearTimeout(_timeoutID);
79777                     _timeoutID = setTimeout(function() { redraw(); }, 750);
79778                 }
79779
79780
79781                 function toggle() {
79782                     if (event) event.preventDefault();
79783
79784                     _isHidden = !_isHidden;
79785
79786                     d3_select('.minimap-toggle-item')
79787                         .classed('active', !_isHidden)
79788                         .select('input')
79789                         .property('checked', !_isHidden);
79790
79791                     if (_isHidden) {
79792                         wrap
79793                             .style('display', 'block')
79794                             .style('opacity', '1')
79795                             .transition()
79796                             .duration(200)
79797                             .style('opacity', '0')
79798                             .on('end', function() {
79799                                 selection.selectAll('.map-in-map')
79800                                     .style('display', 'none');
79801                             });
79802                     } else {
79803                         wrap
79804                             .style('display', 'block')
79805                             .style('opacity', '0')
79806                             .transition()
79807                             .duration(200)
79808                             .style('opacity', '1')
79809                             .on('end', function() {
79810                                 redraw();
79811                             });
79812                     }
79813                 }
79814
79815
79816                 uiMapInMap.toggle = toggle;
79817
79818                 wrap = selection.selectAll('.map-in-map')
79819                     .data([0]);
79820
79821                 wrap = wrap.enter()
79822                     .append('div')
79823                     .attr('class', 'map-in-map')
79824                     .style('display', (_isHidden ? 'none' : 'block'))
79825                     .call(zoom)
79826                     .on('dblclick.zoom', null)
79827                     .merge(wrap);
79828
79829                 // reflow warning: Hardcode dimensions - currently can't resize it anyway..
79830                 _dMini = [200,150]; //utilGetDimensions(wrap);
79831                 _cMini = geoVecScale(_dMini, 0.5);
79832
79833                 context.map()
79834                     .on('drawn.map-in-map', function(drawn) {
79835                         if (drawn.full === true) {
79836                             redraw();
79837                         }
79838                     });
79839
79840                 redraw();
79841
79842                 context.keybinding()
79843                     .on(t('background.minimap.key'), toggle);
79844             }
79845
79846             return mapInMap;
79847         }
79848
79849         function uiConfirm(selection) {
79850             var modalSelection = uiModal(selection);
79851
79852             modalSelection.select('.modal')
79853                 .classed('modal-alert', true);
79854
79855             var section = modalSelection.select('.content');
79856
79857             section.append('div')
79858                 .attr('class', 'modal-section header');
79859
79860             section.append('div')
79861                 .attr('class', 'modal-section message-text');
79862
79863             var buttons = section.append('div')
79864                 .attr('class', 'modal-section buttons cf');
79865
79866
79867             modalSelection.okButton = function() {
79868                 buttons
79869                     .append('button')
79870                     .attr('class', 'button ok-button action')
79871                     .on('click.confirm', function() {
79872                         modalSelection.remove();
79873                     })
79874                     .text(t('confirm.okay'))
79875                     .node()
79876                     .focus();
79877
79878                 return modalSelection;
79879             };
79880
79881
79882             return modalSelection;
79883         }
79884
79885         function uiSettingsCustomBackground(context) {
79886             var dispatch$1 = dispatch('change');
79887
79888             function render(selection) {
79889                 // keep separate copies of original and current settings
79890                 var _origSettings = {
79891                     template: context.storage('background-custom-template')
79892                 };
79893                 var _currSettings = {
79894                     template: context.storage('background-custom-template')
79895                 };
79896
79897                 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
79898                 var modal = uiConfirm(selection).okButton();
79899
79900                 modal
79901                     .classed('settings-modal settings-custom-background', true);
79902
79903                 modal.select('.modal-section.header')
79904                     .append('h3')
79905                     .text(t('settings.custom_background.header'));
79906
79907
79908                 var textSection = modal.select('.modal-section.message-text');
79909
79910                 textSection
79911                     .append('pre')
79912                     .attr('class', 'instructions-template')
79913                     .text(t('settings.custom_background.instructions', { example: example }));
79914
79915                 textSection
79916                     .append('textarea')
79917                     .attr('class', 'field-template')
79918                     .attr('placeholder', t('settings.custom_background.template.placeholder'))
79919                     .call(utilNoAuto)
79920                     .property('value', _currSettings.template);
79921
79922
79923                 // insert a cancel button
79924                 var buttonSection = modal.select('.modal-section.buttons');
79925
79926                 buttonSection
79927                     .insert('button', '.ok-button')
79928                     .attr('class', 'button cancel-button secondary-action')
79929                     .text(t('confirm.cancel'));
79930
79931
79932                 buttonSection.select('.cancel-button')
79933                     .on('click.cancel', clickCancel);
79934
79935                 buttonSection.select('.ok-button')
79936                     .attr('disabled', isSaveDisabled)
79937                     .on('click.save', clickSave);
79938
79939
79940                 function isSaveDisabled() {
79941                     return null;
79942                 }
79943
79944
79945                 // restore the original template
79946                 function clickCancel() {
79947                     textSection.select('.field-template').property('value', _origSettings.template);
79948                     context.storage('background-custom-template', _origSettings.template);
79949                     this.blur();
79950                     modal.close();
79951                 }
79952
79953                 // accept the current template
79954                 function clickSave() {
79955                     _currSettings.template = textSection.select('.field-template').property('value');
79956                     context.storage('background-custom-template', _currSettings.template);
79957                     this.blur();
79958                     modal.close();
79959                     dispatch$1.call('change', this, _currSettings);
79960                 }
79961             }
79962
79963             return utilRebind(render, dispatch$1, 'on');
79964         }
79965
79966         function uiBackground(context) {
79967             var key = t('background.key');
79968
79969             var _pane = d3_select(null), _toggleButton = d3_select(null);
79970
79971             var _customSource = context.background().findSource('custom');
79972             var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
79973
79974             var _backgroundList = d3_select(null);
79975             var _overlayList = d3_select(null);
79976             var _displayOptionsContainer = d3_select(null);
79977             var _offsetContainer = d3_select(null);
79978
79979             var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
79980             var backgroundOffset = uiBackgroundOffset(context);
79981
79982             var settingsCustomBackground = uiSettingsCustomBackground(context)
79983                 .on('change', customChanged);
79984
79985
79986             function setTooltips(selection) {
79987                 selection.each(function(d, i, nodes) {
79988                     var item = d3_select(this).select('label');
79989                     var span = item.select('span');
79990                     var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
79991                     var description = d.description();
79992                     var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
79993
79994                     item.call(tooltip().destroyAny);
79995
79996                     if (d === _previousBackground) {
79997                         item.call(tooltip()
79998                             .placement(placement)
79999                             .html(true)
80000                             .title(function() {
80001                                 var tip = '<div>' + t('background.switch') + '</div>';
80002                                 return uiTooltipHtml(tip, uiCmd('⌘' + key));
80003                             })
80004                         );
80005                     } else if (description || isOverflowing) {
80006                         item.call(tooltip()
80007                             .placement(placement)
80008                             .title(description || d.name())
80009                         );
80010                     }
80011                 });
80012             }
80013
80014
80015             function updateLayerSelections(selection) {
80016                 function active(d) {
80017                     return context.background().showsLayer(d);
80018                 }
80019
80020                 selection.selectAll('li')
80021                     .classed('active', active)
80022                     .classed('switch', function(d) { return d === _previousBackground; })
80023                     .call(setTooltips)
80024                     .selectAll('input')
80025                     .property('checked', active);
80026             }
80027
80028
80029             function chooseBackground(d) {
80030                 if (d.id === 'custom' && !d.template()) {
80031                     return editCustom();
80032                 }
80033
80034                 event.preventDefault();
80035                 _previousBackground = context.background().baseLayerSource();
80036                 context.storage('background-last-used-toggle', _previousBackground.id);
80037                 context.storage('background-last-used', d.id);
80038                 context.background().baseLayerSource(d);
80039                 _backgroundList.call(updateLayerSelections);
80040                 document.activeElement.blur();
80041             }
80042
80043
80044             function customChanged(d) {
80045                 if (d && d.template) {
80046                     _customSource.template(d.template);
80047                     chooseBackground(_customSource);
80048                 } else {
80049                     _customSource.template('');
80050                     chooseBackground(context.background().findSource('none'));
80051                 }
80052             }
80053
80054
80055             function editCustom() {
80056                 event.preventDefault();
80057                 context.container()
80058                     .call(settingsCustomBackground);
80059             }
80060
80061
80062             function chooseOverlay(d) {
80063                 event.preventDefault();
80064                 context.background().toggleOverlayLayer(d);
80065                 _overlayList.call(updateLayerSelections);
80066                 document.activeElement.blur();
80067             }
80068
80069
80070             function drawListItems(layerList, type, change, filter) {
80071                 var sources = context.background()
80072                     .sources(context.map().extent())
80073                     .filter(filter);
80074
80075                 var layerLinks = layerList.selectAll('li')
80076                     .data(sources, function(d) { return d.name(); });
80077
80078                 layerLinks.exit()
80079                     .remove();
80080
80081                 var enter = layerLinks.enter()
80082                     .append('li')
80083                     .classed('layer-custom', function(d) { return d.id === 'custom'; })
80084                     .classed('best', function(d) { return d.best(); });
80085
80086                 enter.filter(function(d) { return d.id === 'custom'; })
80087                     .append('button')
80088                     .attr('class', 'layer-browse')
80089                     .call(tooltip()
80090                         .title(t('settings.custom_background.tooltip'))
80091                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80092                     )
80093                     .on('click', editCustom)
80094                     .call(svgIcon('#iD-icon-more'));
80095
80096                 enter.filter(function(d) { return d.best(); })
80097                     .append('div')
80098                     .attr('class', 'best')
80099                     .call(tooltip()
80100                         .title(t('background.best_imagery'))
80101                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80102                     )
80103                     .append('span')
80104                     .html('&#9733;');
80105
80106                 var label = enter
80107                     .append('label');
80108
80109                 label
80110                     .append('input')
80111                     .attr('type', type)
80112                     .attr('name', 'layers')
80113                     .on('change', change);
80114
80115                 label
80116                     .append('span')
80117                     .text(function(d) { return d.name(); });
80118
80119
80120                 layerList.selectAll('li')
80121                     .sort(sortSources)
80122                     .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
80123
80124                 layerList
80125                     .call(updateLayerSelections);
80126
80127
80128                 function sortSources(a, b) {
80129                     return a.best() && !b.best() ? -1
80130                         : b.best() && !a.best() ? 1
80131                         : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
80132                 }
80133             }
80134
80135
80136             function renderBackgroundList(selection) {
80137
80138                 // the background list
80139                 var container = selection.selectAll('.layer-background-list')
80140                     .data([0]);
80141
80142                 _backgroundList = container.enter()
80143                     .append('ul')
80144                     .attr('class', 'layer-list layer-background-list')
80145                     .attr('dir', 'auto')
80146                     .merge(container);
80147
80148
80149                 // add minimap toggle below list
80150                 var minimapEnter = selection.selectAll('.minimap-toggle-list')
80151                     .data([0])
80152                     .enter()
80153                     .append('ul')
80154                     .attr('class', 'layer-list minimap-toggle-list')
80155                     .append('li')
80156                     .attr('class', 'minimap-toggle-item');
80157
80158                 var minimapLabelEnter = minimapEnter
80159                     .append('label')
80160                     .call(tooltip()
80161                         .html(true)
80162                         .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
80163                         .placement('top')
80164                     );
80165
80166                 minimapLabelEnter
80167                     .append('input')
80168                     .attr('type', 'checkbox')
80169                     .on('change', function() {
80170                         event.preventDefault();
80171                         uiMapInMap.toggle();
80172                     });
80173
80174                 minimapLabelEnter
80175                     .append('span')
80176                     .text(t('background.minimap.description'));
80177
80178
80179                 // "Info / Report a Problem" link
80180                 selection.selectAll('.imagery-faq')
80181                     .data([0])
80182                     .enter()
80183                     .append('div')
80184                     .attr('class', 'imagery-faq')
80185                     .append('a')
80186                     .attr('target', '_blank')
80187                     .attr('tabindex', -1)
80188                     .call(svgIcon('#iD-icon-out-link', 'inline'))
80189                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
80190                     .append('span')
80191                     .text(t('background.imagery_source_faq'));
80192
80193                 updateBackgroundList();
80194             }
80195
80196
80197             function renderOverlayList(selection) {
80198                 var container = selection.selectAll('.layer-overlay-list')
80199                     .data([0]);
80200
80201                 _overlayList = container.enter()
80202                     .append('ul')
80203                     .attr('class', 'layer-list layer-overlay-list')
80204                     .attr('dir', 'auto')
80205                     .merge(container);
80206
80207                 updateOverlayList();
80208             }
80209
80210             function updateBackgroundList() {
80211                 _backgroundList
80212                     .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
80213             }
80214
80215             function updateOverlayList() {
80216                 _overlayList
80217                     .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
80218             }
80219
80220
80221             function update() {
80222                 if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
80223                     updateBackgroundList();
80224                 }
80225
80226                 if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
80227                     updateOverlayList();
80228                 }
80229
80230                 _displayOptionsContainer
80231                     .call(backgroundDisplayOptions);
80232
80233                 _offsetContainer
80234                     .call(backgroundOffset);
80235             }
80236
80237
80238             function quickSwitch() {
80239                 if (event) {
80240                     event.stopImmediatePropagation();
80241                     event.preventDefault();
80242                 }
80243                 if (_previousBackground) {
80244                     chooseBackground(_previousBackground);
80245                 }
80246             }
80247
80248             var paneTooltip = tooltip()
80249                 .placement((textDirection === 'rtl') ? 'right' : 'left')
80250                 .html(true)
80251                 .title(uiTooltipHtml(t('background.description'), key));
80252
80253             uiBackground.togglePane = function() {
80254                 if (event) event.preventDefault();
80255                 paneTooltip.hide(_toggleButton);
80256                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
80257             };
80258
80259             function hidePane() {
80260                 context.ui().togglePanes();
80261             }
80262
80263             uiBackground.renderToggleButton = function(selection) {
80264
80265                 _toggleButton = selection
80266                     .append('button')
80267                     .attr('tabindex', -1)
80268                     .on('click', uiBackground.togglePane)
80269                     .call(svgIcon('#iD-icon-layers', 'light'))
80270                     .call(paneTooltip);
80271             };
80272
80273             uiBackground.renderPane = function(selection) {
80274
80275                 _pane = selection
80276                     .append('div')
80277                     .attr('class', 'fillL map-pane background-pane hide')
80278                     .attr('pane', 'background');
80279
80280
80281                 var heading = _pane
80282                     .append('div')
80283                     .attr('class', 'pane-heading');
80284
80285                 heading
80286                     .append('h2')
80287                     .text(t('background.title'));
80288
80289                 heading
80290                     .append('button')
80291                     .on('click', hidePane)
80292                     .call(svgIcon('#iD-icon-close'));
80293
80294
80295                 var content = _pane
80296                     .append('div')
80297                     .attr('class', 'pane-content');
80298
80299                 // background list
80300                 content
80301                     .append('div')
80302                     .attr('class', 'background-background-list-container')
80303                     .call(uiDisclosure(context, 'background_list', true)
80304                         .title(t('background.backgrounds'))
80305                         .content(renderBackgroundList)
80306                     );
80307
80308                 // overlay list
80309                 content
80310                     .append('div')
80311                     .attr('class', 'background-overlay-list-container')
80312                     .call(uiDisclosure(context, 'overlay_list', true)
80313                         .title(t('background.overlays'))
80314                         .content(renderOverlayList)
80315                     );
80316
80317                 // display options
80318                 _displayOptionsContainer = content
80319                     .append('div')
80320                     .attr('class', 'background-display-options');
80321
80322                 // offset controls
80323                 _offsetContainer = content
80324                     .append('div')
80325                     .attr('class', 'background-offset');
80326
80327
80328                 // add listeners
80329                 context.map()
80330                     .on('move.background-update',
80331                         debounce(function() { window.requestIdleCallback(update); }, 1000)
80332                     );
80333
80334
80335                 context.background()
80336                     .on('change.background-update', update);
80337
80338
80339                 update();
80340
80341                 context.keybinding()
80342                     .on(key, uiBackground.togglePane)
80343                     .on(uiCmd('⌘' + key), quickSwitch);
80344             };
80345
80346             return uiBackground;
80347         }
80348
80349         function uiContributors(context) {
80350             var osm = context.connection(),
80351                 debouncedUpdate = debounce(function() { update(); }, 1000),
80352                 limit = 4,
80353                 hidden = false,
80354                 wrap = d3_select(null);
80355
80356
80357             function update() {
80358                 if (!osm) return;
80359
80360                 var users = {},
80361                     entities = context.intersects(context.map().extent());
80362
80363                 entities.forEach(function(entity) {
80364                     if (entity && entity.user) users[entity.user] = true;
80365                 });
80366
80367                 var u = Object.keys(users),
80368                     subset = u.slice(0, u.length > limit ? limit - 1 : limit);
80369
80370                 wrap.html('')
80371                     .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
80372
80373                 var userList = d3_select(document.createElement('span'));
80374
80375                 userList.selectAll()
80376                     .data(subset)
80377                     .enter()
80378                     .append('a')
80379                     .attr('class', 'user-link')
80380                     .attr('href', function(d) { return osm.userURL(d); })
80381                     .attr('target', '_blank')
80382                     .attr('tabindex', -1)
80383                     .text(String);
80384
80385                 if (u.length > limit) {
80386                     var count = d3_select(document.createElement('span'));
80387
80388                     count.append('a')
80389                         .attr('target', '_blank')
80390                         .attr('tabindex', -1)
80391                         .attr('href', function() {
80392                             return osm.changesetsURL(context.map().center(), context.map().zoom());
80393                         })
80394                         .text(u.length - limit + 1);
80395
80396                     wrap.append('span')
80397                         .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
80398
80399                 } else {
80400                     wrap.append('span')
80401                         .html(t('contributors.list', { users: userList.html() }));
80402                 }
80403
80404                 if (!u.length) {
80405                     hidden = true;
80406                     wrap
80407                         .transition()
80408                         .style('opacity', 0);
80409
80410                 } else if (hidden) {
80411                     wrap
80412                         .transition()
80413                         .style('opacity', 1);
80414                 }
80415             }
80416
80417
80418             return function(selection) {
80419                 if (!osm) return;
80420                 wrap = selection;
80421                 update();
80422
80423                 osm.on('loaded.contributors', debouncedUpdate);
80424                 context.map().on('move.contributors', debouncedUpdate);
80425             };
80426         }
80427
80428         function uiFeatureInfo(context) {
80429             function update(selection) {
80430                 var features = context.features();
80431                 var stats = features.stats();
80432                 var count = 0;
80433                 var hiddenList = features.hidden().map(function(k) {
80434                     if (stats[k]) {
80435                         count += stats[k];
80436                         return String(stats[k]) + ' ' + t('feature.' + k + '.description');
80437                     }
80438                 }).filter(Boolean);
80439
80440                 selection.html('');
80441
80442                 if (hiddenList.length) {
80443                     var tooltipBehavior = tooltip()
80444                         .placement('top')
80445                         .html(true)
80446                         .title(function() {
80447                             return uiTooltipHtml(hiddenList.join('<br/>'));
80448                         });
80449
80450                     var warning = selection.append('a')
80451                         .attr('href', '#')
80452                         .attr('tabindex', -1)
80453                         .html(t('feature_info.hidden_warning', { count: count }))
80454                         .call(tooltipBehavior)
80455                         .on('click', function() {
80456                             tooltipBehavior.hide(warning);
80457                             // open map data panel?
80458                             event.preventDefault();
80459                         });
80460                 }
80461
80462                 selection
80463                     .classed('hide', !hiddenList.length);
80464             }
80465
80466
80467             return function(selection) {
80468                 update(selection);
80469
80470                 context.features().on('change.feature_info', function() {
80471                     update(selection);
80472                 });
80473             };
80474         }
80475
80476         function uiFullScreen(context) {
80477             var element = context.container().node();
80478             // var button = d3_select(null);
80479
80480
80481             function getFullScreenFn() {
80482                 if (element.requestFullscreen) {
80483                     return element.requestFullscreen;
80484                 } else if (element.msRequestFullscreen) {
80485                     return element.msRequestFullscreen;
80486                 } else if (element.mozRequestFullScreen) {
80487                     return element.mozRequestFullScreen;
80488                 } else if (element.webkitRequestFullscreen) {
80489                     return element.webkitRequestFullscreen;
80490                 }
80491             }
80492
80493
80494             function getExitFullScreenFn() {
80495                 if (document.exitFullscreen) {
80496                     return document.exitFullscreen;
80497                 } else if (document.msExitFullscreen) {
80498                     return document.msExitFullscreen;
80499                 } else if (document.mozCancelFullScreen) {
80500                     return document.mozCancelFullScreen;
80501                 } else if (document.webkitExitFullscreen) {
80502                     return document.webkitExitFullscreen;
80503                 }
80504             }
80505
80506
80507             function isFullScreen() {
80508                 return document.fullscreenElement ||
80509                     document.mozFullScreenElement ||
80510                     document.webkitFullscreenElement ||
80511                     document.msFullscreenElement;
80512             }
80513
80514
80515             function isSupported() {
80516                 return !!getFullScreenFn();
80517             }
80518
80519
80520             function fullScreen() {
80521                 event.preventDefault();
80522                 if (!isFullScreen()) {
80523                     // button.classed('active', true);
80524                     getFullScreenFn().apply(element);
80525                 } else {
80526                     // button.classed('active', false);
80527                     getExitFullScreenFn().apply(document);
80528                 }
80529             }
80530
80531
80532             return function() { // selection) {
80533                 if (!isSupported()) return;
80534
80535                 // button = selection.append('button')
80536                 //     .attr('title', t('full_screen'))
80537                 //     .attr('tabindex', -1)
80538                 //     .on('click', fullScreen)
80539                 //     .call(tooltip);
80540
80541                 // button.append('span')
80542                 //     .attr('class', 'icon full-screen');
80543
80544                 var detected = utilDetect();
80545                 var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
80546                 context.keybinding().on(keys, fullScreen);
80547             };
80548         }
80549
80550         function uiGeolocate(context) {
80551             var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
80552             var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
80553             var layer = context.layers().layer('geolocate');
80554             var _position;
80555             var _extent;
80556             var _timeoutID;
80557
80558
80559             function click() {
80560                 if (context.inIntro()) return;
80561                 context.enter(modeBrowse(context));
80562                 if (!layer.enabled()) {
80563                     if (!_position) {
80564                         context.container().call(locating);
80565                         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
80566                     } else {
80567                         zoomTo();
80568                     }
80569                 } else {
80570                     layer.enabled(null, false);
80571                 }
80572                 // This timeout ensures that we still call finish() even if
80573                 // the user declines to share their location in Firefox
80574                 _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
80575             }
80576
80577             function zoomTo() {
80578                 var map = context.map();
80579                 layer.enabled(_position, true);
80580                 map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
80581             }
80582
80583
80584             function success(geolocation) {
80585                 _position = geolocation;
80586                 var coords = _position.coords;
80587                 _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
80588                 zoomTo();
80589                 finish();
80590             }
80591
80592
80593             function error() {
80594                 finish();
80595             }
80596
80597
80598             function finish() {
80599                 locating.close();  // unblock ui
80600                 if (_timeoutID) { clearTimeout(_timeoutID); }
80601                 _timeoutID = undefined;
80602             }
80603
80604
80605             return function(selection) {
80606                 if (!navigator.geolocation) return;
80607
80608                 selection
80609                     .append('button')
80610                     .attr('tabindex', -1)
80611                     .attr('title', t('geolocate.title'))
80612                     .on('click', click)
80613                     .call(svgIcon('#iD-icon-geolocate', 'light'))
80614                     .call(tooltip()
80615                         .placement((textDirection === 'rtl') ? 'right' : 'left'));
80616             };
80617         }
80618
80619         var marked = createCommonjsModule(function (module, exports) {
80620         (function(root) {
80621
80622         /**
80623          * Block-Level Grammar
80624          */
80625
80626         var block = {
80627           newline: /^\n+/,
80628           code: /^( {4}[^\n]+\n*)+/,
80629           fences: noop,
80630           hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
80631           heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
80632           nptable: noop,
80633           blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
80634           list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
80635           html: '^ {0,3}(?:' // optional indentation
80636             + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
80637             + '|comment[^\\n]*(\\n+|$)' // (2)
80638             + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
80639             + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
80640             + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
80641             + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
80642             + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
80643             + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
80644             + ')',
80645           def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
80646           table: noop,
80647           lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
80648           paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
80649           text: /^[^\n]+/
80650         };
80651
80652         block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
80653         block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
80654         block.def = edit(block.def)
80655           .replace('label', block._label)
80656           .replace('title', block._title)
80657           .getRegex();
80658
80659         block.bullet = /(?:[*+-]|\d{1,9}\.)/;
80660         block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
80661         block.item = edit(block.item, 'gm')
80662           .replace(/bull/g, block.bullet)
80663           .getRegex();
80664
80665         block.list = edit(block.list)
80666           .replace(/bull/g, block.bullet)
80667           .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
80668           .replace('def', '\\n+(?=' + block.def.source + ')')
80669           .getRegex();
80670
80671         block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
80672           + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
80673           + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
80674           + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
80675           + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
80676           + '|track|ul';
80677         block._comment = /<!--(?!-?>)[\s\S]*?-->/;
80678         block.html = edit(block.html, 'i')
80679           .replace('comment', block._comment)
80680           .replace('tag', block._tag)
80681           .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
80682           .getRegex();
80683
80684         block.paragraph = edit(block.paragraph)
80685           .replace('hr', block.hr)
80686           .replace('heading', block.heading)
80687           .replace('lheading', block.lheading)
80688           .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
80689           .getRegex();
80690
80691         block.blockquote = edit(block.blockquote)
80692           .replace('paragraph', block.paragraph)
80693           .getRegex();
80694
80695         /**
80696          * Normal Block Grammar
80697          */
80698
80699         block.normal = merge({}, block);
80700
80701         /**
80702          * GFM Block Grammar
80703          */
80704
80705         block.gfm = merge({}, block.normal, {
80706           fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
80707           paragraph: /^/,
80708           heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
80709         });
80710
80711         block.gfm.paragraph = edit(block.paragraph)
80712           .replace('(?!', '(?!'
80713             + block.gfm.fences.source.replace('\\1', '\\2') + '|'
80714             + block.list.source.replace('\\1', '\\3') + '|')
80715           .getRegex();
80716
80717         /**
80718          * GFM + Tables Block Grammar
80719          */
80720
80721         block.tables = merge({}, block.gfm, {
80722           nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
80723           table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
80724         });
80725
80726         /**
80727          * Pedantic grammar
80728          */
80729
80730         block.pedantic = merge({}, block.normal, {
80731           html: edit(
80732             '^ *(?:comment *(?:\\n|\\s*$)'
80733             + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
80734             + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
80735             .replace('comment', block._comment)
80736             .replace(/tag/g, '(?!(?:'
80737               + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
80738               + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
80739               + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
80740             .getRegex(),
80741           def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
80742         });
80743
80744         /**
80745          * Block Lexer
80746          */
80747
80748         function Lexer(options) {
80749           this.tokens = [];
80750           this.tokens.links = Object.create(null);
80751           this.options = options || marked.defaults;
80752           this.rules = block.normal;
80753
80754           if (this.options.pedantic) {
80755             this.rules = block.pedantic;
80756           } else if (this.options.gfm) {
80757             if (this.options.tables) {
80758               this.rules = block.tables;
80759             } else {
80760               this.rules = block.gfm;
80761             }
80762           }
80763         }
80764
80765         /**
80766          * Expose Block Rules
80767          */
80768
80769         Lexer.rules = block;
80770
80771         /**
80772          * Static Lex Method
80773          */
80774
80775         Lexer.lex = function(src, options) {
80776           var lexer = new Lexer(options);
80777           return lexer.lex(src);
80778         };
80779
80780         /**
80781          * Preprocessing
80782          */
80783
80784         Lexer.prototype.lex = function(src) {
80785           src = src
80786             .replace(/\r\n|\r/g, '\n')
80787             .replace(/\t/g, '    ')
80788             .replace(/\u00a0/g, ' ')
80789             .replace(/\u2424/g, '\n');
80790
80791           return this.token(src, true);
80792         };
80793
80794         /**
80795          * Lexing
80796          */
80797
80798         Lexer.prototype.token = function(src, top) {
80799           src = src.replace(/^ +$/gm, '');
80800           var next,
80801               loose,
80802               cap,
80803               bull,
80804               b,
80805               item,
80806               listStart,
80807               listItems,
80808               t,
80809               space,
80810               i,
80811               tag,
80812               l,
80813               isordered,
80814               istask,
80815               ischecked;
80816
80817           while (src) {
80818             // newline
80819             if (cap = this.rules.newline.exec(src)) {
80820               src = src.substring(cap[0].length);
80821               if (cap[0].length > 1) {
80822                 this.tokens.push({
80823                   type: 'space'
80824                 });
80825               }
80826             }
80827
80828             // code
80829             if (cap = this.rules.code.exec(src)) {
80830               src = src.substring(cap[0].length);
80831               cap = cap[0].replace(/^ {4}/gm, '');
80832               this.tokens.push({
80833                 type: 'code',
80834                 text: !this.options.pedantic
80835                   ? rtrim(cap, '\n')
80836                   : cap
80837               });
80838               continue;
80839             }
80840
80841             // fences (gfm)
80842             if (cap = this.rules.fences.exec(src)) {
80843               src = src.substring(cap[0].length);
80844               this.tokens.push({
80845                 type: 'code',
80846                 lang: cap[2] ? cap[2].trim() : cap[2],
80847                 text: cap[3] || ''
80848               });
80849               continue;
80850             }
80851
80852             // heading
80853             if (cap = this.rules.heading.exec(src)) {
80854               src = src.substring(cap[0].length);
80855               this.tokens.push({
80856                 type: 'heading',
80857                 depth: cap[1].length,
80858                 text: cap[2]
80859               });
80860               continue;
80861             }
80862
80863             // table no leading pipe (gfm)
80864             if (cap = this.rules.nptable.exec(src)) {
80865               item = {
80866                 type: 'table',
80867                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80868                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80869                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80870               };
80871
80872               if (item.header.length === item.align.length) {
80873                 src = src.substring(cap[0].length);
80874
80875                 for (i = 0; i < item.align.length; i++) {
80876                   if (/^ *-+: *$/.test(item.align[i])) {
80877                     item.align[i] = 'right';
80878                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80879                     item.align[i] = 'center';
80880                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80881                     item.align[i] = 'left';
80882                   } else {
80883                     item.align[i] = null;
80884                   }
80885                 }
80886
80887                 for (i = 0; i < item.cells.length; i++) {
80888                   item.cells[i] = splitCells(item.cells[i], item.header.length);
80889                 }
80890
80891                 this.tokens.push(item);
80892
80893                 continue;
80894               }
80895             }
80896
80897             // hr
80898             if (cap = this.rules.hr.exec(src)) {
80899               src = src.substring(cap[0].length);
80900               this.tokens.push({
80901                 type: 'hr'
80902               });
80903               continue;
80904             }
80905
80906             // blockquote
80907             if (cap = this.rules.blockquote.exec(src)) {
80908               src = src.substring(cap[0].length);
80909
80910               this.tokens.push({
80911                 type: 'blockquote_start'
80912               });
80913
80914               cap = cap[0].replace(/^ *> ?/gm, '');
80915
80916               // Pass `top` to keep the current
80917               // "toplevel" state. This is exactly
80918               // how markdown.pl works.
80919               this.token(cap, top);
80920
80921               this.tokens.push({
80922                 type: 'blockquote_end'
80923               });
80924
80925               continue;
80926             }
80927
80928             // list
80929             if (cap = this.rules.list.exec(src)) {
80930               src = src.substring(cap[0].length);
80931               bull = cap[2];
80932               isordered = bull.length > 1;
80933
80934               listStart = {
80935                 type: 'list_start',
80936                 ordered: isordered,
80937                 start: isordered ? +bull : '',
80938                 loose: false
80939               };
80940
80941               this.tokens.push(listStart);
80942
80943               // Get each top-level item.
80944               cap = cap[0].match(this.rules.item);
80945
80946               listItems = [];
80947               next = false;
80948               l = cap.length;
80949               i = 0;
80950
80951               for (; i < l; i++) {
80952                 item = cap[i];
80953
80954                 // Remove the list item's bullet
80955                 // so it is seen as the next token.
80956                 space = item.length;
80957                 item = item.replace(/^ *([*+-]|\d+\.) */, '');
80958
80959                 // Outdent whatever the
80960                 // list item contains. Hacky.
80961                 if (~item.indexOf('\n ')) {
80962                   space -= item.length;
80963                   item = !this.options.pedantic
80964                     ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
80965                     : item.replace(/^ {1,4}/gm, '');
80966                 }
80967
80968                 // Determine whether the next list item belongs here.
80969                 // Backpedal if it does not belong in this list.
80970                 if (i !== l - 1) {
80971                   b = block.bullet.exec(cap[i + 1])[0];
80972                   if (bull.length > 1 ? b.length === 1
80973                     : (b.length > 1 || (this.options.smartLists && b !== bull))) {
80974                     src = cap.slice(i + 1).join('\n') + src;
80975                     i = l - 1;
80976                   }
80977                 }
80978
80979                 // Determine whether item is loose or not.
80980                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
80981                 // for discount behavior.
80982                 loose = next || /\n\n(?!\s*$)/.test(item);
80983                 if (i !== l - 1) {
80984                   next = item.charAt(item.length - 1) === '\n';
80985                   if (!loose) loose = next;
80986                 }
80987
80988                 if (loose) {
80989                   listStart.loose = true;
80990                 }
80991
80992                 // Check for task list items
80993                 istask = /^\[[ xX]\] /.test(item);
80994                 ischecked = undefined;
80995                 if (istask) {
80996                   ischecked = item[1] !== ' ';
80997                   item = item.replace(/^\[[ xX]\] +/, '');
80998                 }
80999
81000                 t = {
81001                   type: 'list_item_start',
81002                   task: istask,
81003                   checked: ischecked,
81004                   loose: loose
81005                 };
81006
81007                 listItems.push(t);
81008                 this.tokens.push(t);
81009
81010                 // Recurse.
81011                 this.token(item, false);
81012
81013                 this.tokens.push({
81014                   type: 'list_item_end'
81015                 });
81016               }
81017
81018               if (listStart.loose) {
81019                 l = listItems.length;
81020                 i = 0;
81021                 for (; i < l; i++) {
81022                   listItems[i].loose = true;
81023                 }
81024               }
81025
81026               this.tokens.push({
81027                 type: 'list_end'
81028               });
81029
81030               continue;
81031             }
81032
81033             // html
81034             if (cap = this.rules.html.exec(src)) {
81035               src = src.substring(cap[0].length);
81036               this.tokens.push({
81037                 type: this.options.sanitize
81038                   ? 'paragraph'
81039                   : 'html',
81040                 pre: !this.options.sanitizer
81041                   && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
81042                 text: cap[0]
81043               });
81044               continue;
81045             }
81046
81047             // def
81048             if (top && (cap = this.rules.def.exec(src))) {
81049               src = src.substring(cap[0].length);
81050               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
81051               tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
81052               if (!this.tokens.links[tag]) {
81053                 this.tokens.links[tag] = {
81054                   href: cap[2],
81055                   title: cap[3]
81056                 };
81057               }
81058               continue;
81059             }
81060
81061             // table (gfm)
81062             if (cap = this.rules.table.exec(src)) {
81063               item = {
81064                 type: 'table',
81065                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
81066                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
81067                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
81068               };
81069
81070               if (item.header.length === item.align.length) {
81071                 src = src.substring(cap[0].length);
81072
81073                 for (i = 0; i < item.align.length; i++) {
81074                   if (/^ *-+: *$/.test(item.align[i])) {
81075                     item.align[i] = 'right';
81076                   } else if (/^ *:-+: *$/.test(item.align[i])) {
81077                     item.align[i] = 'center';
81078                   } else if (/^ *:-+ *$/.test(item.align[i])) {
81079                     item.align[i] = 'left';
81080                   } else {
81081                     item.align[i] = null;
81082                   }
81083                 }
81084
81085                 for (i = 0; i < item.cells.length; i++) {
81086                   item.cells[i] = splitCells(
81087                     item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
81088                     item.header.length);
81089                 }
81090
81091                 this.tokens.push(item);
81092
81093                 continue;
81094               }
81095             }
81096
81097             // lheading
81098             if (cap = this.rules.lheading.exec(src)) {
81099               src = src.substring(cap[0].length);
81100               this.tokens.push({
81101                 type: 'heading',
81102                 depth: cap[2] === '=' ? 1 : 2,
81103                 text: cap[1]
81104               });
81105               continue;
81106             }
81107
81108             // top-level paragraph
81109             if (top && (cap = this.rules.paragraph.exec(src))) {
81110               src = src.substring(cap[0].length);
81111               this.tokens.push({
81112                 type: 'paragraph',
81113                 text: cap[1].charAt(cap[1].length - 1) === '\n'
81114                   ? cap[1].slice(0, -1)
81115                   : cap[1]
81116               });
81117               continue;
81118             }
81119
81120             // text
81121             if (cap = this.rules.text.exec(src)) {
81122               // Top-level should never reach here.
81123               src = src.substring(cap[0].length);
81124               this.tokens.push({
81125                 type: 'text',
81126                 text: cap[0]
81127               });
81128               continue;
81129             }
81130
81131             if (src) {
81132               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81133             }
81134           }
81135
81136           return this.tokens;
81137         };
81138
81139         /**
81140          * Inline-Level Grammar
81141          */
81142
81143         var inline = {
81144           escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
81145           autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
81146           url: noop,
81147           tag: '^comment'
81148             + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
81149             + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
81150             + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
81151             + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
81152             + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
81153           link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
81154           reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
81155           nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
81156           strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
81157           em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
81158           code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
81159           br: /^( {2,}|\\)\n(?!\s*$)/,
81160           del: noop,
81161           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
81162         };
81163
81164         // list of punctuation marks from common mark spec
81165         // without ` and ] to workaround Rule 17 (inline code blocks/links)
81166         inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
81167         inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
81168
81169         inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
81170
81171         inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
81172         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])?)+(?![-_])/;
81173         inline.autolink = edit(inline.autolink)
81174           .replace('scheme', inline._scheme)
81175           .replace('email', inline._email)
81176           .getRegex();
81177
81178         inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
81179
81180         inline.tag = edit(inline.tag)
81181           .replace('comment', block._comment)
81182           .replace('attribute', inline._attribute)
81183           .getRegex();
81184
81185         inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|`(?!`)|[^\[\]\\`])*?/;
81186         inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/;
81187         inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
81188
81189         inline.link = edit(inline.link)
81190           .replace('label', inline._label)
81191           .replace('href', inline._href)
81192           .replace('title', inline._title)
81193           .getRegex();
81194
81195         inline.reflink = edit(inline.reflink)
81196           .replace('label', inline._label)
81197           .getRegex();
81198
81199         /**
81200          * Normal Inline Grammar
81201          */
81202
81203         inline.normal = merge({}, inline);
81204
81205         /**
81206          * Pedantic Inline Grammar
81207          */
81208
81209         inline.pedantic = merge({}, inline.normal, {
81210           strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
81211           em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
81212           link: edit(/^!?\[(label)\]\((.*?)\)/)
81213             .replace('label', inline._label)
81214             .getRegex(),
81215           reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
81216             .replace('label', inline._label)
81217             .getRegex()
81218         });
81219
81220         /**
81221          * GFM Inline Grammar
81222          */
81223
81224         inline.gfm = merge({}, inline.normal, {
81225           escape: edit(inline.escape).replace('])', '~|])').getRegex(),
81226           _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
81227           url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
81228           _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
81229           del: /^~+(?=\S)([\s\S]*?\S)~+/,
81230           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
81231         });
81232
81233         inline.gfm.url = edit(inline.gfm.url, 'i')
81234           .replace('email', inline.gfm._extended_email)
81235           .getRegex();
81236         /**
81237          * GFM + Line Breaks Inline Grammar
81238          */
81239
81240         inline.breaks = merge({}, inline.gfm, {
81241           br: edit(inline.br).replace('{2,}', '*').getRegex(),
81242           text: edit(inline.gfm.text).replace(/\{2,\}/g, '*').getRegex()
81243         });
81244
81245         /**
81246          * Inline Lexer & Compiler
81247          */
81248
81249         function InlineLexer(links, options) {
81250           this.options = options || marked.defaults;
81251           this.links = links;
81252           this.rules = inline.normal;
81253           this.renderer = this.options.renderer || new Renderer();
81254           this.renderer.options = this.options;
81255
81256           if (!this.links) {
81257             throw new Error('Tokens array requires a `links` property.');
81258           }
81259
81260           if (this.options.pedantic) {
81261             this.rules = inline.pedantic;
81262           } else if (this.options.gfm) {
81263             if (this.options.breaks) {
81264               this.rules = inline.breaks;
81265             } else {
81266               this.rules = inline.gfm;
81267             }
81268           }
81269         }
81270
81271         /**
81272          * Expose Inline Rules
81273          */
81274
81275         InlineLexer.rules = inline;
81276
81277         /**
81278          * Static Lexing/Compiling Method
81279          */
81280
81281         InlineLexer.output = function(src, links, options) {
81282           var inline = new InlineLexer(links, options);
81283           return inline.output(src);
81284         };
81285
81286         /**
81287          * Lexing/Compiling
81288          */
81289
81290         InlineLexer.prototype.output = function(src) {
81291           var out = '',
81292               link,
81293               text,
81294               href,
81295               title,
81296               cap,
81297               prevCapZero;
81298
81299           while (src) {
81300             // escape
81301             if (cap = this.rules.escape.exec(src)) {
81302               src = src.substring(cap[0].length);
81303               out += escape(cap[1]);
81304               continue;
81305             }
81306
81307             // tag
81308             if (cap = this.rules.tag.exec(src)) {
81309               if (!this.inLink && /^<a /i.test(cap[0])) {
81310                 this.inLink = true;
81311               } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
81312                 this.inLink = false;
81313               }
81314               if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81315                 this.inRawBlock = true;
81316               } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81317                 this.inRawBlock = false;
81318               }
81319
81320               src = src.substring(cap[0].length);
81321               out += this.options.sanitize
81322                 ? this.options.sanitizer
81323                   ? this.options.sanitizer(cap[0])
81324                   : escape(cap[0])
81325                 : cap[0];
81326               continue;
81327             }
81328
81329             // link
81330             if (cap = this.rules.link.exec(src)) {
81331               var lastParenIndex = findClosingBracket(cap[2], '()');
81332               if (lastParenIndex > -1) {
81333                 var linkLen = cap[0].length - (cap[2].length - lastParenIndex) - (cap[3] || '').length;
81334                 cap[2] = cap[2].substring(0, lastParenIndex);
81335                 cap[0] = cap[0].substring(0, linkLen).trim();
81336                 cap[3] = '';
81337               }
81338               src = src.substring(cap[0].length);
81339               this.inLink = true;
81340               href = cap[2];
81341               if (this.options.pedantic) {
81342                 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
81343
81344                 if (link) {
81345                   href = link[1];
81346                   title = link[3];
81347                 } else {
81348                   title = '';
81349                 }
81350               } else {
81351                 title = cap[3] ? cap[3].slice(1, -1) : '';
81352               }
81353               href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
81354               out += this.outputLink(cap, {
81355                 href: InlineLexer.escapes(href),
81356                 title: InlineLexer.escapes(title)
81357               });
81358               this.inLink = false;
81359               continue;
81360             }
81361
81362             // reflink, nolink
81363             if ((cap = this.rules.reflink.exec(src))
81364                 || (cap = this.rules.nolink.exec(src))) {
81365               src = src.substring(cap[0].length);
81366               link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
81367               link = this.links[link.toLowerCase()];
81368               if (!link || !link.href) {
81369                 out += cap[0].charAt(0);
81370                 src = cap[0].substring(1) + src;
81371                 continue;
81372               }
81373               this.inLink = true;
81374               out += this.outputLink(cap, link);
81375               this.inLink = false;
81376               continue;
81377             }
81378
81379             // strong
81380             if (cap = this.rules.strong.exec(src)) {
81381               src = src.substring(cap[0].length);
81382               out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
81383               continue;
81384             }
81385
81386             // em
81387             if (cap = this.rules.em.exec(src)) {
81388               src = src.substring(cap[0].length);
81389               out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
81390               continue;
81391             }
81392
81393             // code
81394             if (cap = this.rules.code.exec(src)) {
81395               src = src.substring(cap[0].length);
81396               out += this.renderer.codespan(escape(cap[2].trim(), true));
81397               continue;
81398             }
81399
81400             // br
81401             if (cap = this.rules.br.exec(src)) {
81402               src = src.substring(cap[0].length);
81403               out += this.renderer.br();
81404               continue;
81405             }
81406
81407             // del (gfm)
81408             if (cap = this.rules.del.exec(src)) {
81409               src = src.substring(cap[0].length);
81410               out += this.renderer.del(this.output(cap[1]));
81411               continue;
81412             }
81413
81414             // autolink
81415             if (cap = this.rules.autolink.exec(src)) {
81416               src = src.substring(cap[0].length);
81417               if (cap[2] === '@') {
81418                 text = escape(this.mangle(cap[1]));
81419                 href = 'mailto:' + text;
81420               } else {
81421                 text = escape(cap[1]);
81422                 href = text;
81423               }
81424               out += this.renderer.link(href, null, text);
81425               continue;
81426             }
81427
81428             // url (gfm)
81429             if (!this.inLink && (cap = this.rules.url.exec(src))) {
81430               if (cap[2] === '@') {
81431                 text = escape(cap[0]);
81432                 href = 'mailto:' + text;
81433               } else {
81434                 // do extended autolink path validation
81435                 do {
81436                   prevCapZero = cap[0];
81437                   cap[0] = this.rules._backpedal.exec(cap[0])[0];
81438                 } while (prevCapZero !== cap[0]);
81439                 text = escape(cap[0]);
81440                 if (cap[1] === 'www.') {
81441                   href = 'http://' + text;
81442                 } else {
81443                   href = text;
81444                 }
81445               }
81446               src = src.substring(cap[0].length);
81447               out += this.renderer.link(href, null, text);
81448               continue;
81449             }
81450
81451             // text
81452             if (cap = this.rules.text.exec(src)) {
81453               src = src.substring(cap[0].length);
81454               if (this.inRawBlock) {
81455                 out += this.renderer.text(cap[0]);
81456               } else {
81457                 out += this.renderer.text(escape(this.smartypants(cap[0])));
81458               }
81459               continue;
81460             }
81461
81462             if (src) {
81463               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81464             }
81465           }
81466
81467           return out;
81468         };
81469
81470         InlineLexer.escapes = function(text) {
81471           return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
81472         };
81473
81474         /**
81475          * Compile Link
81476          */
81477
81478         InlineLexer.prototype.outputLink = function(cap, link) {
81479           var href = link.href,
81480               title = link.title ? escape(link.title) : null;
81481
81482           return cap[0].charAt(0) !== '!'
81483             ? this.renderer.link(href, title, this.output(cap[1]))
81484             : this.renderer.image(href, title, escape(cap[1]));
81485         };
81486
81487         /**
81488          * Smartypants Transformations
81489          */
81490
81491         InlineLexer.prototype.smartypants = function(text) {
81492           if (!this.options.smartypants) return text;
81493           return text
81494             // em-dashes
81495             .replace(/---/g, '\u2014')
81496             // en-dashes
81497             .replace(/--/g, '\u2013')
81498             // opening singles
81499             .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
81500             // closing singles & apostrophes
81501             .replace(/'/g, '\u2019')
81502             // opening doubles
81503             .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
81504             // closing doubles
81505             .replace(/"/g, '\u201d')
81506             // ellipses
81507             .replace(/\.{3}/g, '\u2026');
81508         };
81509
81510         /**
81511          * Mangle Links
81512          */
81513
81514         InlineLexer.prototype.mangle = function(text) {
81515           if (!this.options.mangle) return text;
81516           var out = '',
81517               l = text.length,
81518               i = 0,
81519               ch;
81520
81521           for (; i < l; i++) {
81522             ch = text.charCodeAt(i);
81523             if (Math.random() > 0.5) {
81524               ch = 'x' + ch.toString(16);
81525             }
81526             out += '&#' + ch + ';';
81527           }
81528
81529           return out;
81530         };
81531
81532         /**
81533          * Renderer
81534          */
81535
81536         function Renderer(options) {
81537           this.options = options || marked.defaults;
81538         }
81539
81540         Renderer.prototype.code = function(code, infostring, escaped) {
81541           var lang = (infostring || '').match(/\S*/)[0];
81542           if (this.options.highlight) {
81543             var out = this.options.highlight(code, lang);
81544             if (out != null && out !== code) {
81545               escaped = true;
81546               code = out;
81547             }
81548           }
81549
81550           if (!lang) {
81551             return '<pre><code>'
81552               + (escaped ? code : escape(code, true))
81553               + '</code></pre>';
81554           }
81555
81556           return '<pre><code class="'
81557             + this.options.langPrefix
81558             + escape(lang, true)
81559             + '">'
81560             + (escaped ? code : escape(code, true))
81561             + '</code></pre>\n';
81562         };
81563
81564         Renderer.prototype.blockquote = function(quote) {
81565           return '<blockquote>\n' + quote + '</blockquote>\n';
81566         };
81567
81568         Renderer.prototype.html = function(html) {
81569           return html;
81570         };
81571
81572         Renderer.prototype.heading = function(text, level, raw, slugger) {
81573           if (this.options.headerIds) {
81574             return '<h'
81575               + level
81576               + ' id="'
81577               + this.options.headerPrefix
81578               + slugger.slug(raw)
81579               + '">'
81580               + text
81581               + '</h'
81582               + level
81583               + '>\n';
81584           }
81585           // ignore IDs
81586           return '<h' + level + '>' + text + '</h' + level + '>\n';
81587         };
81588
81589         Renderer.prototype.hr = function() {
81590           return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
81591         };
81592
81593         Renderer.prototype.list = function(body, ordered, start) {
81594           var type = ordered ? 'ol' : 'ul',
81595               startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
81596           return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
81597         };
81598
81599         Renderer.prototype.listitem = function(text) {
81600           return '<li>' + text + '</li>\n';
81601         };
81602
81603         Renderer.prototype.checkbox = function(checked) {
81604           return '<input '
81605             + (checked ? 'checked="" ' : '')
81606             + 'disabled="" type="checkbox"'
81607             + (this.options.xhtml ? ' /' : '')
81608             + '> ';
81609         };
81610
81611         Renderer.prototype.paragraph = function(text) {
81612           return '<p>' + text + '</p>\n';
81613         };
81614
81615         Renderer.prototype.table = function(header, body) {
81616           if (body) body = '<tbody>' + body + '</tbody>';
81617
81618           return '<table>\n'
81619             + '<thead>\n'
81620             + header
81621             + '</thead>\n'
81622             + body
81623             + '</table>\n';
81624         };
81625
81626         Renderer.prototype.tablerow = function(content) {
81627           return '<tr>\n' + content + '</tr>\n';
81628         };
81629
81630         Renderer.prototype.tablecell = function(content, flags) {
81631           var type = flags.header ? 'th' : 'td';
81632           var tag = flags.align
81633             ? '<' + type + ' align="' + flags.align + '">'
81634             : '<' + type + '>';
81635           return tag + content + '</' + type + '>\n';
81636         };
81637
81638         // span level renderer
81639         Renderer.prototype.strong = function(text) {
81640           return '<strong>' + text + '</strong>';
81641         };
81642
81643         Renderer.prototype.em = function(text) {
81644           return '<em>' + text + '</em>';
81645         };
81646
81647         Renderer.prototype.codespan = function(text) {
81648           return '<code>' + text + '</code>';
81649         };
81650
81651         Renderer.prototype.br = function() {
81652           return this.options.xhtml ? '<br/>' : '<br>';
81653         };
81654
81655         Renderer.prototype.del = function(text) {
81656           return '<del>' + text + '</del>';
81657         };
81658
81659         Renderer.prototype.link = function(href, title, text) {
81660           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81661           if (href === null) {
81662             return text;
81663           }
81664           var out = '<a href="' + escape(href) + '"';
81665           if (title) {
81666             out += ' title="' + title + '"';
81667           }
81668           out += '>' + text + '</a>';
81669           return out;
81670         };
81671
81672         Renderer.prototype.image = function(href, title, text) {
81673           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81674           if (href === null) {
81675             return text;
81676           }
81677
81678           var out = '<img src="' + href + '" alt="' + text + '"';
81679           if (title) {
81680             out += ' title="' + title + '"';
81681           }
81682           out += this.options.xhtml ? '/>' : '>';
81683           return out;
81684         };
81685
81686         Renderer.prototype.text = function(text) {
81687           return text;
81688         };
81689
81690         /**
81691          * TextRenderer
81692          * returns only the textual part of the token
81693          */
81694
81695         function TextRenderer() {}
81696
81697         // no need for block level renderers
81698
81699         TextRenderer.prototype.strong =
81700         TextRenderer.prototype.em =
81701         TextRenderer.prototype.codespan =
81702         TextRenderer.prototype.del =
81703         TextRenderer.prototype.text = function (text) {
81704           return text;
81705         };
81706
81707         TextRenderer.prototype.link =
81708         TextRenderer.prototype.image = function(href, title, text) {
81709           return '' + text;
81710         };
81711
81712         TextRenderer.prototype.br = function() {
81713           return '';
81714         };
81715
81716         /**
81717          * Parsing & Compiling
81718          */
81719
81720         function Parser(options) {
81721           this.tokens = [];
81722           this.token = null;
81723           this.options = options || marked.defaults;
81724           this.options.renderer = this.options.renderer || new Renderer();
81725           this.renderer = this.options.renderer;
81726           this.renderer.options = this.options;
81727           this.slugger = new Slugger();
81728         }
81729
81730         /**
81731          * Static Parse Method
81732          */
81733
81734         Parser.parse = function(src, options) {
81735           var parser = new Parser(options);
81736           return parser.parse(src);
81737         };
81738
81739         /**
81740          * Parse Loop
81741          */
81742
81743         Parser.prototype.parse = function(src) {
81744           this.inline = new InlineLexer(src.links, this.options);
81745           // use an InlineLexer with a TextRenderer to extract pure text
81746           this.inlineText = new InlineLexer(
81747             src.links,
81748             merge({}, this.options, {renderer: new TextRenderer()})
81749           );
81750           this.tokens = src.reverse();
81751
81752           var out = '';
81753           while (this.next()) {
81754             out += this.tok();
81755           }
81756
81757           return out;
81758         };
81759
81760         /**
81761          * Next Token
81762          */
81763
81764         Parser.prototype.next = function() {
81765           return this.token = this.tokens.pop();
81766         };
81767
81768         /**
81769          * Preview Next Token
81770          */
81771
81772         Parser.prototype.peek = function() {
81773           return this.tokens[this.tokens.length - 1] || 0;
81774         };
81775
81776         /**
81777          * Parse Text Tokens
81778          */
81779
81780         Parser.prototype.parseText = function() {
81781           var body = this.token.text;
81782
81783           while (this.peek().type === 'text') {
81784             body += '\n' + this.next().text;
81785           }
81786
81787           return this.inline.output(body);
81788         };
81789
81790         /**
81791          * Parse Current Token
81792          */
81793
81794         Parser.prototype.tok = function() {
81795           switch (this.token.type) {
81796             case 'space': {
81797               return '';
81798             }
81799             case 'hr': {
81800               return this.renderer.hr();
81801             }
81802             case 'heading': {
81803               return this.renderer.heading(
81804                 this.inline.output(this.token.text),
81805                 this.token.depth,
81806                 unescape(this.inlineText.output(this.token.text)),
81807                 this.slugger);
81808             }
81809             case 'code': {
81810               return this.renderer.code(this.token.text,
81811                 this.token.lang,
81812                 this.token.escaped);
81813             }
81814             case 'table': {
81815               var header = '',
81816                   body = '',
81817                   i,
81818                   row,
81819                   cell,
81820                   j;
81821
81822               // header
81823               cell = '';
81824               for (i = 0; i < this.token.header.length; i++) {
81825                 cell += this.renderer.tablecell(
81826                   this.inline.output(this.token.header[i]),
81827                   { header: true, align: this.token.align[i] }
81828                 );
81829               }
81830               header += this.renderer.tablerow(cell);
81831
81832               for (i = 0; i < this.token.cells.length; i++) {
81833                 row = this.token.cells[i];
81834
81835                 cell = '';
81836                 for (j = 0; j < row.length; j++) {
81837                   cell += this.renderer.tablecell(
81838                     this.inline.output(row[j]),
81839                     { header: false, align: this.token.align[j] }
81840                   );
81841                 }
81842
81843                 body += this.renderer.tablerow(cell);
81844               }
81845               return this.renderer.table(header, body);
81846             }
81847             case 'blockquote_start': {
81848               body = '';
81849
81850               while (this.next().type !== 'blockquote_end') {
81851                 body += this.tok();
81852               }
81853
81854               return this.renderer.blockquote(body);
81855             }
81856             case 'list_start': {
81857               body = '';
81858               var ordered = this.token.ordered,
81859                   start = this.token.start;
81860
81861               while (this.next().type !== 'list_end') {
81862                 body += this.tok();
81863               }
81864
81865               return this.renderer.list(body, ordered, start);
81866             }
81867             case 'list_item_start': {
81868               body = '';
81869               var loose = this.token.loose;
81870               var checked = this.token.checked;
81871               var task = this.token.task;
81872
81873               if (this.token.task) {
81874                 body += this.renderer.checkbox(checked);
81875               }
81876
81877               while (this.next().type !== 'list_item_end') {
81878                 body += !loose && this.token.type === 'text'
81879                   ? this.parseText()
81880                   : this.tok();
81881               }
81882               return this.renderer.listitem(body, task, checked);
81883             }
81884             case 'html': {
81885               // TODO parse inline content if parameter markdown=1
81886               return this.renderer.html(this.token.text);
81887             }
81888             case 'paragraph': {
81889               return this.renderer.paragraph(this.inline.output(this.token.text));
81890             }
81891             case 'text': {
81892               return this.renderer.paragraph(this.parseText());
81893             }
81894             default: {
81895               var errMsg = 'Token with "' + this.token.type + '" type was not found.';
81896               if (this.options.silent) {
81897                 console.log(errMsg);
81898               } else {
81899                 throw new Error(errMsg);
81900               }
81901             }
81902           }
81903         };
81904
81905         /**
81906          * Slugger generates header id
81907          */
81908
81909         function Slugger () {
81910           this.seen = {};
81911         }
81912
81913         /**
81914          * Convert string to unique id
81915          */
81916
81917         Slugger.prototype.slug = function (value) {
81918           var slug = value
81919             .toLowerCase()
81920             .trim()
81921             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
81922             .replace(/\s/g, '-');
81923
81924           if (this.seen.hasOwnProperty(slug)) {
81925             var originalSlug = slug;
81926             do {
81927               this.seen[originalSlug]++;
81928               slug = originalSlug + '-' + this.seen[originalSlug];
81929             } while (this.seen.hasOwnProperty(slug));
81930           }
81931           this.seen[slug] = 0;
81932
81933           return slug;
81934         };
81935
81936         /**
81937          * Helpers
81938          */
81939
81940         function escape(html, encode) {
81941           if (encode) {
81942             if (escape.escapeTest.test(html)) {
81943               return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
81944             }
81945           } else {
81946             if (escape.escapeTestNoEncode.test(html)) {
81947               return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
81948             }
81949           }
81950
81951           return html;
81952         }
81953
81954         escape.escapeTest = /[&<>"']/;
81955         escape.escapeReplace = /[&<>"']/g;
81956         escape.replacements = {
81957           '&': '&amp;',
81958           '<': '&lt;',
81959           '>': '&gt;',
81960           '"': '&quot;',
81961           "'": '&#39;'
81962         };
81963
81964         escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
81965         escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
81966
81967         function unescape(html) {
81968           // explicitly match decimal, hex, and named HTML entities
81969           return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
81970             n = n.toLowerCase();
81971             if (n === 'colon') return ':';
81972             if (n.charAt(0) === '#') {
81973               return n.charAt(1) === 'x'
81974                 ? String.fromCharCode(parseInt(n.substring(2), 16))
81975                 : String.fromCharCode(+n.substring(1));
81976             }
81977             return '';
81978           });
81979         }
81980
81981         function edit(regex, opt) {
81982           regex = regex.source || regex;
81983           opt = opt || '';
81984           return {
81985             replace: function(name, val) {
81986               val = val.source || val;
81987               val = val.replace(/(^|[^\[])\^/g, '$1');
81988               regex = regex.replace(name, val);
81989               return this;
81990             },
81991             getRegex: function() {
81992               return new RegExp(regex, opt);
81993             }
81994           };
81995         }
81996
81997         function cleanUrl(sanitize, base, href) {
81998           if (sanitize) {
81999             try {
82000               var prot = decodeURIComponent(unescape(href))
82001                 .replace(/[^\w:]/g, '')
82002                 .toLowerCase();
82003             } catch (e) {
82004               return null;
82005             }
82006             if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
82007               return null;
82008             }
82009           }
82010           if (base && !originIndependentUrl.test(href)) {
82011             href = resolveUrl(base, href);
82012           }
82013           try {
82014             href = encodeURI(href).replace(/%25/g, '%');
82015           } catch (e) {
82016             return null;
82017           }
82018           return href;
82019         }
82020
82021         function resolveUrl(base, href) {
82022           if (!baseUrls[' ' + base]) {
82023             // we can ignore everything in base after the last slash of its path component,
82024             // but we might need to add _that_
82025             // https://tools.ietf.org/html/rfc3986#section-3
82026             if (/^[^:]+:\/*[^/]*$/.test(base)) {
82027               baseUrls[' ' + base] = base + '/';
82028             } else {
82029               baseUrls[' ' + base] = rtrim(base, '/', true);
82030             }
82031           }
82032           base = baseUrls[' ' + base];
82033
82034           if (href.slice(0, 2) === '//') {
82035             return base.replace(/:[\s\S]*/, ':') + href;
82036           } else if (href.charAt(0) === '/') {
82037             return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
82038           } else {
82039             return base + href;
82040           }
82041         }
82042         var baseUrls = {};
82043         var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
82044
82045         function noop() {}
82046         noop.exec = noop;
82047
82048         function merge(obj) {
82049           var i = 1,
82050               target,
82051               key;
82052
82053           for (; i < arguments.length; i++) {
82054             target = arguments[i];
82055             for (key in target) {
82056               if (Object.prototype.hasOwnProperty.call(target, key)) {
82057                 obj[key] = target[key];
82058               }
82059             }
82060           }
82061
82062           return obj;
82063         }
82064
82065         function splitCells(tableRow, count) {
82066           // ensure that every cell-delimiting pipe has a space
82067           // before it to distinguish it from an escaped pipe
82068           var row = tableRow.replace(/\|/g, function (match, offset, str) {
82069                 var escaped = false,
82070                     curr = offset;
82071                 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
82072                 if (escaped) {
82073                   // odd number of slashes means | is escaped
82074                   // so we leave it alone
82075                   return '|';
82076                 } else {
82077                   // add space before unescaped |
82078                   return ' |';
82079                 }
82080               }),
82081               cells = row.split(/ \|/),
82082               i = 0;
82083
82084           if (cells.length > count) {
82085             cells.splice(count);
82086           } else {
82087             while (cells.length < count) cells.push('');
82088           }
82089
82090           for (; i < cells.length; i++) {
82091             // leading or trailing whitespace is ignored per the gfm spec
82092             cells[i] = cells[i].trim().replace(/\\\|/g, '|');
82093           }
82094           return cells;
82095         }
82096
82097         // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
82098         // /c*$/ is vulnerable to REDOS.
82099         // invert: Remove suffix of non-c chars instead. Default falsey.
82100         function rtrim(str, c, invert) {
82101           if (str.length === 0) {
82102             return '';
82103           }
82104
82105           // Length of suffix matching the invert condition.
82106           var suffLen = 0;
82107
82108           // Step left until we fail to match the invert condition.
82109           while (suffLen < str.length) {
82110             var currChar = str.charAt(str.length - suffLen - 1);
82111             if (currChar === c && !invert) {
82112               suffLen++;
82113             } else if (currChar !== c && invert) {
82114               suffLen++;
82115             } else {
82116               break;
82117             }
82118           }
82119
82120           return str.substr(0, str.length - suffLen);
82121         }
82122
82123         function findClosingBracket(str, b) {
82124           if (str.indexOf(b[1]) === -1) {
82125             return -1;
82126           }
82127           var level = 0;
82128           for (var i = 0; i < str.length; i++) {
82129             if (str[i] === '\\') {
82130               i++;
82131             } else if (str[i] === b[0]) {
82132               level++;
82133             } else if (str[i] === b[1]) {
82134               level--;
82135               if (level < 0) {
82136                 return i;
82137               }
82138             }
82139           }
82140           return -1;
82141         }
82142
82143         /**
82144          * Marked
82145          */
82146
82147         function marked(src, opt, callback) {
82148           // throw error in case of non string input
82149           if (typeof src === 'undefined' || src === null) {
82150             throw new Error('marked(): input parameter is undefined or null');
82151           }
82152           if (typeof src !== 'string') {
82153             throw new Error('marked(): input parameter is of type '
82154               + Object.prototype.toString.call(src) + ', string expected');
82155           }
82156
82157           if (callback || typeof opt === 'function') {
82158             if (!callback) {
82159               callback = opt;
82160               opt = null;
82161             }
82162
82163             opt = merge({}, marked.defaults, opt || {});
82164
82165             var highlight = opt.highlight,
82166                 tokens,
82167                 pending,
82168                 i = 0;
82169
82170             try {
82171               tokens = Lexer.lex(src, opt);
82172             } catch (e) {
82173               return callback(e);
82174             }
82175
82176             pending = tokens.length;
82177
82178             var done = function(err) {
82179               if (err) {
82180                 opt.highlight = highlight;
82181                 return callback(err);
82182               }
82183
82184               var out;
82185
82186               try {
82187                 out = Parser.parse(tokens, opt);
82188               } catch (e) {
82189                 err = e;
82190               }
82191
82192               opt.highlight = highlight;
82193
82194               return err
82195                 ? callback(err)
82196                 : callback(null, out);
82197             };
82198
82199             if (!highlight || highlight.length < 3) {
82200               return done();
82201             }
82202
82203             delete opt.highlight;
82204
82205             if (!pending) return done();
82206
82207             for (; i < tokens.length; i++) {
82208               (function(token) {
82209                 if (token.type !== 'code') {
82210                   return --pending || done();
82211                 }
82212                 return highlight(token.text, token.lang, function(err, code) {
82213                   if (err) return done(err);
82214                   if (code == null || code === token.text) {
82215                     return --pending || done();
82216                   }
82217                   token.text = code;
82218                   token.escaped = true;
82219                   --pending || done();
82220                 });
82221               })(tokens[i]);
82222             }
82223
82224             return;
82225           }
82226           try {
82227             if (opt) opt = merge({}, marked.defaults, opt);
82228             return Parser.parse(Lexer.lex(src, opt), opt);
82229           } catch (e) {
82230             e.message += '\nPlease report this to https://github.com/markedjs/marked.';
82231             if ((opt || marked.defaults).silent) {
82232               return '<p>An error occurred:</p><pre>'
82233                 + escape(e.message + '', true)
82234                 + '</pre>';
82235             }
82236             throw e;
82237           }
82238         }
82239
82240         /**
82241          * Options
82242          */
82243
82244         marked.options =
82245         marked.setOptions = function(opt) {
82246           merge(marked.defaults, opt);
82247           return marked;
82248         };
82249
82250         marked.getDefaults = function () {
82251           return {
82252             baseUrl: null,
82253             breaks: false,
82254             gfm: true,
82255             headerIds: true,
82256             headerPrefix: '',
82257             highlight: null,
82258             langPrefix: 'language-',
82259             mangle: true,
82260             pedantic: false,
82261             renderer: new Renderer(),
82262             sanitize: false,
82263             sanitizer: null,
82264             silent: false,
82265             smartLists: false,
82266             smartypants: false,
82267             tables: true,
82268             xhtml: false
82269           };
82270         };
82271
82272         marked.defaults = marked.getDefaults();
82273
82274         /**
82275          * Expose
82276          */
82277
82278         marked.Parser = Parser;
82279         marked.parser = Parser.parse;
82280
82281         marked.Renderer = Renderer;
82282         marked.TextRenderer = TextRenderer;
82283
82284         marked.Lexer = Lexer;
82285         marked.lexer = Lexer.lex;
82286
82287         marked.InlineLexer = InlineLexer;
82288         marked.inlineLexer = InlineLexer.output;
82289
82290         marked.Slugger = Slugger;
82291
82292         marked.parse = marked;
82293
82294         {
82295           module.exports = marked;
82296         }
82297         })();
82298         });
82299
82300         function pointBox(loc, context) {
82301             var rect = context.surfaceRect();
82302             var point = context.curtainProjection(loc);
82303             return {
82304                 left: point[0] + rect.left - 40,
82305                 top: point[1] + rect.top - 60,
82306                 width: 80,
82307                 height: 90
82308             };
82309         }
82310
82311
82312         function pad$2(locOrBox, padding, context) {
82313             var box;
82314             if (locOrBox instanceof Array) {
82315                 var rect = context.surfaceRect();
82316                 var point = context.curtainProjection(locOrBox);
82317                 box = {
82318                     left: point[0] + rect.left,
82319                     top: point[1] + rect.top
82320                 };
82321             } else {
82322                 box = locOrBox;
82323             }
82324
82325             return {
82326                 left: box.left - padding,
82327                 top: box.top - padding,
82328                 width: (box.width || 0) + 2 * padding,
82329                 height: (box.width || 0) + 2 * padding
82330             };
82331         }
82332
82333
82334         function icon(name, svgklass, useklass) {
82335             return '<svg class="icon ' + (svgklass || '') + '">' +
82336                  '<use xlink:href="' + name + '"' +
82337                  (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
82338         }
82339
82340
82341         function slugify(text) {
82342             return text.toString().toLowerCase()
82343                 .replace(/\s+/g, '-')           // Replace spaces with -
82344                 .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
82345                 .replace(/\-\-+/g, '-')         // Replace multiple - with single -
82346                 .replace(/^-+/, '')             // Trim - from start of text
82347                 .replace(/-+$/, '');            // Trim - from end of text
82348         }
82349
82350
82351         // console warning for missing walkthrough names
82352         var missingStrings = {};
82353         function checkKey(key, text) {
82354             if (t(key, { default: undefined}) === undefined) {
82355                 if (missingStrings.hasOwnProperty(key)) return;  // warn once
82356                 missingStrings[key] = text;
82357                 var missing = key + ': ' + text;
82358                 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
82359             }
82360         }
82361
82362
82363         function localize(obj) {
82364             var key;
82365
82366             // Assign name if entity has one..
82367             var name = obj.tags && obj.tags.name;
82368             if (name) {
82369                 key = 'intro.graph.name.' + slugify(name);
82370                 obj.tags.name = t(key, { default: name });
82371                 checkKey(key, name);
82372             }
82373
82374             // Assign street name if entity has one..
82375             var street = obj.tags && obj.tags['addr:street'];
82376             if (street) {
82377                 key = 'intro.graph.name.' + slugify(street);
82378                 obj.tags['addr:street'] = t(key, { default: street });
82379                 checkKey(key, street);
82380
82381                 // Add address details common across walkthrough..
82382                 var addrTags = [
82383                     'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
82384                     'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
82385                 ];
82386                 addrTags.forEach(function(k) {
82387                     var key = 'intro.graph.' + k;
82388                     var tag = 'addr:' + k;
82389                     var val = obj.tags && obj.tags[tag];
82390                     var str = t(key, { default: val });
82391
82392                     if (str) {
82393                         if (str.match(/^<.*>$/) !== null) {
82394                             delete obj.tags[tag];
82395                         } else {
82396                             obj.tags[tag] = str;
82397                         }
82398                     }
82399                 });
82400             }
82401
82402             return obj;
82403         }
82404
82405
82406         // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
82407         function isMostlySquare(points) {
82408             // note: uses 15 here instead of the 12 from actionOrthogonalize because
82409             // actionOrthogonalize can actually straighten some larger angles as it iterates
82410             var threshold = 15; // degrees within right or straight
82411             var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
82412             var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
82413
82414             for (var i = 0; i < points.length; i++) {
82415                 var a = points[(i - 1 + points.length) % points.length];
82416                 var origin = points[i];
82417                 var b = points[(i + 1) % points.length];
82418
82419                 var dotp = geoVecNormalizedDot(a, b, origin);
82420                 var mag = Math.abs(dotp);
82421                 if (mag > lowerBound && mag < upperBound) {
82422                     return false;
82423                 }
82424             }
82425
82426             return true;
82427         }
82428
82429
82430         function selectMenuItem(operation) {
82431             var selector = '.edit-menu .edit-menu-item-' + operation +
82432                 ', .radial-menu .radial-menu-item-' + operation;
82433             return d3_select(selector);
82434         }
82435
82436
82437         function transitionTime(point1, point2) {
82438             var distance = geoSphericalDistance(point1, point2);
82439             if (distance === 0)
82440                 return 0;
82441             else if (distance < 80)
82442                 return 500;
82443             else
82444                 return 1000;
82445         }
82446
82447         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]}};
82448
82449         // Tooltips and svg mask used to highlight certain features
82450         function uiCurtain() {
82451
82452             var surface = d3_select(null),
82453                 tooltip = d3_select(null),
82454                 darkness = d3_select(null);
82455
82456             function curtain(selection) {
82457                 surface = selection
82458                     .append('svg')
82459                     .attr('id', 'curtain')
82460                     .style('z-index', 1000)
82461                     .style('pointer-events', 'none')
82462                     .style('position', 'absolute')
82463                     .style('top', 0)
82464                     .style('left', 0);
82465
82466                 darkness = surface.append('path')
82467                     .attr('x', 0)
82468                     .attr('y', 0)
82469                     .attr('class', 'curtain-darkness');
82470
82471                 d3_select(window).on('resize.curtain', resize);
82472
82473                 tooltip = selection.append('div')
82474                     .attr('class', 'tooltip')
82475                     .style('z-index', 1002);
82476
82477                 tooltip
82478                     .append('div')
82479                     .attr('class', 'tooltip-arrow');
82480
82481                 tooltip
82482                     .append('div')
82483                     .attr('class', 'tooltip-inner');
82484
82485                 resize();
82486
82487
82488                 function resize() {
82489                     surface
82490                         .attr('width', window.innerWidth)
82491                         .attr('height', window.innerHeight);
82492                     curtain.cut(darkness.datum());
82493                 }
82494             }
82495
82496
82497             /**
82498              * Reveal cuts the curtain to highlight the given box,
82499              * and shows a tooltip with instructions next to the box.
82500              *
82501              * @param  {String|ClientRect} [box]   box used to cut the curtain
82502              * @param  {String}    [text]          text for a tooltip
82503              * @param  {Object}    [options]
82504              * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
82505              * @param  {integer}   [options.duration]        transition time in milliseconds
82506              * @param  {string}    [options.buttonText]      if set, create a button with this text label
82507              * @param  {function}  [options.buttonCallback]  if set, the callback for the button
82508              * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
82509              */
82510             curtain.reveal = function(box, text, options) {
82511                 if (typeof box === 'string') {
82512                     box = d3_select(box).node();
82513                 }
82514                 if (box && box.getBoundingClientRect) {
82515                     box = copyBox(box.getBoundingClientRect());
82516                 }
82517
82518                 options = options || {};
82519
82520                 var tooltipBox;
82521                 if (options.tooltipBox) {
82522                     tooltipBox = options.tooltipBox;
82523                     if (typeof tooltipBox === 'string') {
82524                         tooltipBox = d3_select(tooltipBox).node();
82525                     }
82526                     if (tooltipBox && tooltipBox.getBoundingClientRect) {
82527                         tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
82528                     }
82529                 } else {
82530                     tooltipBox = box;
82531                 }
82532
82533                 if (tooltipBox && text) {
82534                     // pseudo markdown bold text for the instruction section..
82535                     var parts = text.split('**');
82536                     var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
82537                     if (parts[1]) {
82538                         html += '<span class="instruction">' + parts[1] + '</span>';
82539                     }
82540
82541                     html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
82542                     html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
82543
82544                     if (options.buttonText && options.buttonCallback) {
82545                         html += '<div class="button-section">' +
82546                             '<button href="#" class="button action">' + options.buttonText + '</button></div>';
82547                     }
82548
82549                     var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
82550                     tooltip
82551                         .classed(classes, true)
82552                         .selectAll('.tooltip-inner')
82553                         .html(html);
82554
82555                     if (options.buttonText && options.buttonCallback) {
82556                         var button = tooltip.selectAll('.button-section .button.action');
82557                         button
82558                             .on('click', function() {
82559                                 event.preventDefault();
82560                                 options.buttonCallback();
82561                             });
82562                     }
82563
82564                     var tip = copyBox(tooltip.node().getBoundingClientRect()),
82565                         w = window.innerWidth,
82566                         h = window.innerHeight,
82567                         tooltipWidth = 200,
82568                         tooltipArrow = 5,
82569                         side, pos;
82570
82571
82572                     // hack: this will have bottom placement,
82573                     // so need to reserve extra space for the tooltip illustration.
82574                     if (options.tooltipClass === 'intro-mouse') {
82575                         tip.height += 80;
82576                     }
82577
82578                     // trim box dimensions to just the portion that fits in the window..
82579                     if (tooltipBox.top + tooltipBox.height > h) {
82580                         tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
82581                     }
82582                     if (tooltipBox.left + tooltipBox.width > w) {
82583                         tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
82584                     }
82585
82586                     // determine tooltip placement..
82587
82588                     if (tooltipBox.top + tooltipBox.height < 100) {
82589                         // tooltip below box..
82590                         side = 'bottom';
82591                         pos = [
82592                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82593                             tooltipBox.top + tooltipBox.height
82594                         ];
82595
82596                     } else if (tooltipBox.top > h - 140) {
82597                         // tooltip above box..
82598                         side = 'top';
82599                         pos = [
82600                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82601                             tooltipBox.top - tip.height
82602                         ];
82603
82604                     } else {
82605                         // tooltip to the side of the tooltipBox..
82606                         var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
82607
82608                         if (textDirection === 'rtl') {
82609                             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
82610                                 side = 'right';
82611                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82612
82613                             } else {
82614                                 side = 'left';
82615                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82616                             }
82617
82618                         } else {
82619                             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
82620                                 side = 'left';
82621                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82622                             }
82623                             else {
82624                                 side = 'right';
82625                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82626                             }
82627                         }
82628                     }
82629
82630                     if (options.duration !== 0 || !tooltip.classed(side)) {
82631                         tooltip.call(uiToggle(true));
82632                     }
82633
82634                     tooltip
82635                         .style('top', pos[1] + 'px')
82636                         .style('left', pos[0] + 'px')
82637                         .attr('class', classes + ' ' + side);
82638
82639
82640                     // shift tooltip-inner if it is very close to the top or bottom edge
82641                     // (doesn't affect the placement of the tooltip-arrow)
82642                     var shiftY = 0;
82643                     if (side === 'left' || side === 'right') {
82644                         if (pos[1] < 60) {
82645                             shiftY = 60 - pos[1];
82646                         }
82647                         else if (pos[1] + tip.height > h - 100) {
82648                             shiftY = h - pos[1] - tip.height - 100;
82649                         }
82650                     }
82651                     tooltip.selectAll('.tooltip-inner')
82652                         .style('top', shiftY + 'px');
82653
82654                 } else {
82655                     tooltip
82656                         .classed('in', false)
82657                         .call(uiToggle(false));
82658                 }
82659
82660                 curtain.cut(box, options.duration);
82661
82662                 return tooltip;
82663             };
82664
82665
82666             curtain.cut = function(datum, duration) {
82667                 darkness.datum(datum)
82668                     .interrupt();
82669
82670                 var selection;
82671                 if (duration === 0) {
82672                     selection = darkness;
82673                 } else {
82674                     selection = darkness
82675                         .transition()
82676                         .duration(duration || 600)
82677                         .ease(linear$1);
82678                 }
82679
82680                 selection
82681                     .attr('d', function(d) {
82682                         var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
82683                             window.innerWidth + ',' + window.innerHeight + 'L' +
82684                             window.innerWidth + ',0 Z';
82685
82686                         if (!d) return string;
82687                         return string + 'M' +
82688                             d.left + ',' + d.top + 'L' +
82689                             d.left + ',' + (d.top + d.height) + 'L' +
82690                             (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
82691                             (d.left + d.width) + ',' + (d.top) + 'Z';
82692
82693                     });
82694             };
82695
82696
82697             curtain.remove = function() {
82698                 surface.remove();
82699                 tooltip.remove();
82700                 d3_select(window).on('resize.curtain', null);
82701             };
82702
82703
82704             // ClientRects are immutable, so copy them to an object,
82705             // in case we need to trim the height/width.
82706             function copyBox(src) {
82707                 return {
82708                     top: src.top,
82709                     right: src.right,
82710                     bottom: src.bottom,
82711                     left: src.left,
82712                     width: src.width,
82713                     height: src.height
82714                 };
82715             }
82716
82717
82718             return curtain;
82719         }
82720
82721         function uiIntroWelcome(context, reveal) {
82722             var dispatch$1 = dispatch('done');
82723             var listener = clickListener();
82724
82725             var chapter = {
82726                 title: 'intro.welcome.title'
82727             };
82728
82729
82730             function welcome() {
82731                 context.map().centerZoom([-85.63591, 41.94285], 19);
82732                 reveal('.intro-nav-wrap .chapter-welcome',
82733                     t('intro.welcome.welcome'),
82734                     { buttonText: t('intro.ok'), buttonCallback: practice }
82735                 );
82736             }
82737
82738             function practice() {
82739                 reveal('.intro-nav-wrap .chapter-welcome',
82740                     t('intro.welcome.practice'),
82741                     { buttonText: t('intro.ok'), buttonCallback: words }
82742                 );
82743             }
82744
82745             function words() {
82746                 reveal('.intro-nav-wrap .chapter-welcome',
82747                     t('intro.welcome.words'),
82748                     { buttonText: t('intro.ok'), buttonCallback: mouse }
82749                 );
82750             }
82751
82752
82753             function mouse() {
82754                 reveal('.intro-nav-wrap .chapter-welcome',
82755                     t('intro.welcome.mouse'),
82756                     { buttonText: t('intro.ok'), buttonCallback: leftClick }
82757                 );
82758             }
82759
82760
82761             function leftClick() {
82762                 var counter = 0;
82763                 var times = 5;
82764
82765                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82766                     t('intro.welcome.leftclick', { num: times }),
82767                     { tooltipClass: 'intro-mouse' }
82768                 );
82769
82770                 tooltip.selectAll('.tooltip-inner')
82771                     .insert('svg', 'span')
82772                     .attr('class', 'tooltip-illustration')
82773                     .append('use')
82774                     .attr('xlink:href', '#iD-walkthrough-mouse');
82775
82776                 tooltip
82777                     .append('div')
82778                     .attr('class', 'counter');
82779
82780                 tooltip.call(listener);
82781
82782                 listener.on('click', function(which) {
82783                     if (which === 'left') {
82784                         d3_select('.curtain-tooltip.intro-mouse .counter')
82785                             .text(String(++counter));
82786
82787                         if (counter === times) {
82788                             window.setTimeout(function() { continueTo(rightClick); }, 1000);
82789                         }
82790                     }
82791                 });
82792
82793                 function continueTo(nextStep) {
82794                     listener.on('click', null);
82795                     tooltip.call(listener.off);
82796                     tooltip.select('.counter').remove();
82797                     nextStep();
82798                 }
82799             }
82800
82801
82802             function rightClick() {
82803                 var counter = 0;
82804                 var times = 5;
82805
82806                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82807                     t('intro.welcome.rightclick', { num: times }),
82808                     { tooltipClass: 'intro-mouse' }
82809                 );
82810
82811                 tooltip.selectAll('.tooltip-inner')
82812                     .insert('svg', 'span')
82813                     .attr('class', 'tooltip-illustration')
82814                     .append('use')
82815                     .attr('xlink:href', '#iD-walkthrough-mouse');
82816
82817                 tooltip
82818                     .append('div')
82819                     .attr('class', 'counter');
82820
82821                 tooltip.call(listener);
82822
82823                 listener.on('click', function(which) {
82824                     if (which === 'right') {
82825                         d3_select('.curtain-tooltip.intro-mouse .counter')
82826                             .text(String(++counter));
82827
82828                         if (counter === times) {
82829                             window.setTimeout(function() { continueTo(chapters); }, 1000);
82830                         }
82831                     }
82832                 });
82833
82834                 function continueTo(nextStep) {
82835                     listener.on('click', null);
82836                     tooltip.call(listener.off);
82837                     tooltip.select('.counter').remove();
82838                     nextStep();
82839                 }
82840             }
82841
82842
82843             function chapters() {
82844                 dispatch$1.call('done');
82845                 reveal('.intro-nav-wrap .chapter-navigation',
82846                     t('intro.welcome.chapters', { next: t('intro.navigation.title') })
82847                 );
82848             }
82849
82850
82851             chapter.enter = function() {
82852                 welcome();
82853             };
82854
82855
82856             chapter.exit = function() {
82857                 listener.off();
82858                 d3_select('.curtain-tooltip.intro-mouse')
82859                     .selectAll('.counter')
82860                     .remove();
82861             };
82862
82863
82864             chapter.restart = function() {
82865                 chapter.exit();
82866                 chapter.enter();
82867             };
82868
82869
82870             return utilRebind(chapter, dispatch$1, 'on');
82871         }
82872
82873
82874
82875         function clickListener() {
82876             var dispatch$1 = dispatch('click');
82877             var minTime = 120;
82878             var tooltip = d3_select(null);
82879             var down = {};
82880
82881             // `down` keeps track of which buttons/keys are down.
82882             // Setting a property in `down` happens immediately.
82883             // Unsetting a property in `down` is delayed because
82884             //   on Windows a contextmenu event happens after keyup/mouseup
82885
82886             function keydown() {
82887                 if (event.keyCode === 93)  {   // context menu
82888                     event.preventDefault();
82889                     event.stopPropagation();
82890                     down.menu = event.timeStamp;
82891                     tooltip.classed('rightclick', true);
82892                 }
82893             }
82894
82895
82896             function keyup() {
82897                 if (event.keyCode === 93)  {   // context menu
82898                     event.preventDefault();
82899                     event.stopPropagation();
82900                     var endTime = event.timeStamp;
82901                     var startTime = down.menu || endTime;
82902                     var delay = (endTime - startTime < minTime) ? minTime : 0;
82903
82904                     window.setTimeout(function() {
82905                         tooltip.classed('rightclick', false);
82906                         down.menu = undefined;  // delayed, for Windows
82907                     }, delay);
82908
82909                     dispatch$1.call('click', this, 'right');
82910                 }
82911             }
82912
82913
82914             function mousedown() {
82915                 var button = event.button;
82916                 if (button === 0 && !event.ctrlKey) {
82917                     tooltip.classed('leftclick', true);
82918                 } else if (button === 2) {
82919                     tooltip.classed('rightclick', true);
82920                 }
82921                 down[button] = event.timeStamp;
82922             }
82923
82924
82925             function mouseup() {
82926                 var button = event.button;
82927                 var endTime = event.timeStamp;
82928                 var startTime = down[button] || endTime;
82929                 var delay = (endTime - startTime < minTime) ? minTime : 0;
82930
82931                 if (button === 0 && !event.ctrlKey) {
82932                     window.setTimeout(function() {
82933                         tooltip.classed('leftclick', false);
82934                         down[button] = undefined;  // delayed, for Windows
82935                     }, delay);
82936
82937                     dispatch$1.call('click', this, 'left');
82938
82939                 } else if (button === 2) {
82940                     window.setTimeout(function() {
82941                         tooltip.classed('rightclick', false);
82942                         down[button] = undefined;  // delayed, for Windows
82943                     }, delay);
82944
82945                     dispatch$1.call('click', this, 'right');
82946
82947                 } else {
82948                     window.setTimeout(function() {
82949                         down[button] = undefined;  // delayed, for Windows
82950                     }, delay);
82951                 }
82952             }
82953
82954
82955             function contextmenu() {
82956                 event.preventDefault();
82957                 event.stopPropagation();
82958                 if (!down[2] && !down.menu) {
82959                     tooltip.classed('rightclick', true);
82960                     window.setTimeout(function() {
82961                         tooltip.classed('rightclick', false);
82962                     }, minTime);
82963                     dispatch$1.call('click', this, 'right');
82964                 }
82965             }
82966
82967
82968             var behavior = function(selection) {
82969                 tooltip = selection;
82970                 down = {};
82971
82972                 d3_select(window)
82973                     .on('keydown.intro', keydown)
82974                     .on('keyup.intro', keyup)
82975                     .on('mousedown.intro', mousedown)
82976                     .on('mouseup.intro', mouseup)
82977                     .on('contextmenu.intro', contextmenu);
82978             };
82979
82980
82981             behavior.off = function() {
82982                 d3_select(window)
82983                     .on('keydown.intro', null)
82984                     .on('keyup.intro', null)
82985                     .on('mousedown.intro', null)
82986                     .on('mouseup.intro', null)
82987                     .on('contextmenu.intro', null);
82988
82989                 tooltip
82990                     .classed('leftclick', false)
82991                     .classed('rightclick', false);
82992             };
82993
82994             return utilRebind(behavior, dispatch$1, 'on');
82995         }
82996
82997         function uiIntroNavigation(context, reveal) {
82998             var dispatch$1 = dispatch('done');
82999             var timeouts = [];
83000             var hallId = 'n2061';
83001             var townHall = [-85.63591, 41.94285];
83002             var springStreetId = 'w397';
83003             var springStreetEndId = 'n1834';
83004             var springStreet = [-85.63582, 41.94255];
83005             var onewayField = context.presets().field('oneway');
83006             var maxspeedField = context.presets().field('maxspeed');
83007
83008
83009             var chapter = {
83010                 title: 'intro.navigation.title'
83011             };
83012
83013
83014             function timeout(f, t) {
83015                 timeouts.push(window.setTimeout(f, t));
83016             }
83017
83018
83019             function eventCancel() {
83020                 event.stopPropagation();
83021                 event.preventDefault();
83022             }
83023
83024
83025             function isTownHallSelected() {
83026                 var ids = context.selectedIDs();
83027                 return ids.length === 1 && ids[0] === hallId;
83028             }
83029
83030
83031             function dragMap() {
83032                 context.enter(modeBrowse(context));
83033                 context.history().reset('initial');
83034
83035                 var msec = transitionTime(townHall, context.map().center());
83036                 if (msec) { reveal(null, null, { duration: 0 }); }
83037                 context.map().centerZoomEase(townHall, 19, msec);
83038
83039                 timeout(function() {
83040                     var centerStart = context.map().center();
83041
83042                     reveal('#surface', t('intro.navigation.drag'));
83043                     context.map().on('drawn.intro', function() {
83044                         reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
83045                     });
83046
83047                     context.map().on('move.intro', function() {
83048                         var centerNow = context.map().center();
83049                         if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
83050                             context.map().on('move.intro', null);
83051                             timeout(function() { continueTo(zoomMap); }, 3000);
83052                         }
83053                     });
83054
83055                 }, msec + 100);
83056
83057                 function continueTo(nextStep) {
83058                     context.map().on('move.intro drawn.intro', null);
83059                     nextStep();
83060                 }
83061             }
83062
83063
83064             function zoomMap() {
83065                 var zoomStart = context.map().zoom();
83066
83067                 reveal('#surface',
83068                     t('intro.navigation.zoom', {
83069                         plus: icon('#iD-icon-plus', 'pre-text'),
83070                         minus: icon('#iD-icon-minus', 'pre-text')
83071                     })
83072                 );
83073
83074                 context.map().on('drawn.intro', function() {
83075                     reveal('#surface',
83076                         t('intro.navigation.zoom', {
83077                             plus: icon('#iD-icon-plus', 'pre-text'),
83078                             minus: icon('#iD-icon-minus', 'pre-text')
83079                         }), { duration: 0 }
83080                     );
83081                 });
83082
83083                 context.map().on('move.intro', function() {
83084                     if (context.map().zoom() !== zoomStart) {
83085                         context.map().on('move.intro', null);
83086                         timeout(function() { continueTo(features); }, 3000);
83087                     }
83088                 });
83089
83090                 function continueTo(nextStep) {
83091                     context.map().on('move.intro drawn.intro', null);
83092                     nextStep();
83093                 }
83094             }
83095
83096
83097             function features() {
83098                 var onClick = function() { continueTo(pointsLinesAreas); };
83099
83100                 reveal('#surface', t('intro.navigation.features'),
83101                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83102                 );
83103
83104                 context.map().on('drawn.intro', function() {
83105                     reveal('#surface', t('intro.navigation.features'),
83106                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83107                     );
83108                 });
83109
83110                 function continueTo(nextStep) {
83111                     context.map().on('drawn.intro', null);
83112                     nextStep();
83113                 }
83114             }
83115
83116             function pointsLinesAreas() {
83117                 var onClick = function() { continueTo(nodesWays); };
83118
83119                 reveal('#surface', t('intro.navigation.points_lines_areas'),
83120                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83121                 );
83122
83123                 context.map().on('drawn.intro', function() {
83124                     reveal('#surface', t('intro.navigation.points_lines_areas'),
83125                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83126                     );
83127                 });
83128
83129                 function continueTo(nextStep) {
83130                     context.map().on('drawn.intro', null);
83131                     nextStep();
83132                 }
83133             }
83134
83135             function nodesWays() {
83136                 var onClick = function() { continueTo(clickTownHall); };
83137
83138                 reveal('#surface', t('intro.navigation.nodes_ways'),
83139                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83140                 );
83141
83142                 context.map().on('drawn.intro', function() {
83143                     reveal('#surface', t('intro.navigation.nodes_ways'),
83144                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83145                     );
83146                 });
83147
83148                 function continueTo(nextStep) {
83149                     context.map().on('drawn.intro', null);
83150                     nextStep();
83151                 }
83152             }
83153
83154             function clickTownHall() {
83155                 context.enter(modeBrowse(context));
83156                 context.history().reset('initial');
83157
83158                 var entity = context.hasEntity(hallId);
83159                 if (!entity) return;
83160                 reveal(null, null, { duration: 0 });
83161                 context.map().centerZoomEase(entity.loc, 19, 500);
83162
83163                 timeout(function() {
83164                     var entity = context.hasEntity(hallId);
83165                     if (!entity) return;
83166                     var box = pointBox(entity.loc, context);
83167                     reveal(box, t('intro.navigation.click_townhall'));
83168
83169                     context.map().on('move.intro drawn.intro', function() {
83170                         var entity = context.hasEntity(hallId);
83171                         if (!entity) return;
83172                         var box = pointBox(entity.loc, context);
83173                         reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
83174                     });
83175
83176                     context.on('enter.intro', function() {
83177                         if (isTownHallSelected()) continueTo(selectedTownHall);
83178                     });
83179
83180                 }, 550);  // after centerZoomEase
83181
83182                 context.history().on('change.intro', function() {
83183                     if (!context.hasEntity(hallId)) {
83184                         continueTo(clickTownHall);
83185                     }
83186                 });
83187
83188                 function continueTo(nextStep) {
83189                     context.on('enter.intro', null);
83190                     context.map().on('move.intro drawn.intro', null);
83191                     context.history().on('change.intro', null);
83192                     nextStep();
83193                 }
83194             }
83195
83196
83197             function selectedTownHall() {
83198                 if (!isTownHallSelected()) return clickTownHall();
83199
83200                 var entity = context.hasEntity(hallId);
83201                 if (!entity) return clickTownHall();
83202
83203                 var box = pointBox(entity.loc, context);
83204                 var onClick = function() { continueTo(editorTownHall); };
83205
83206                 reveal(box, t('intro.navigation.selected_townhall'),
83207                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83208                 );
83209
83210                 context.map().on('move.intro drawn.intro', function() {
83211                     var entity = context.hasEntity(hallId);
83212                     if (!entity) return;
83213                     var box = pointBox(entity.loc, context);
83214                     reveal(box, t('intro.navigation.selected_townhall'),
83215                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83216                     );
83217                 });
83218
83219                 context.history().on('change.intro', function() {
83220                     if (!context.hasEntity(hallId)) {
83221                         continueTo(clickTownHall);
83222                     }
83223                 });
83224
83225                 function continueTo(nextStep) {
83226                     context.map().on('move.intro drawn.intro', null);
83227                     context.history().on('change.intro', null);
83228                     nextStep();
83229                 }
83230             }
83231
83232
83233             function editorTownHall() {
83234                 if (!isTownHallSelected()) return clickTownHall();
83235
83236                 // disallow scrolling
83237                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83238
83239                 var onClick = function() { continueTo(presetTownHall); };
83240
83241                 reveal('.entity-editor-pane',
83242                     t('intro.navigation.editor_townhall'),
83243                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83244                 );
83245
83246                 context.on('exit.intro', function() {
83247                     continueTo(clickTownHall);
83248                 });
83249
83250                 context.history().on('change.intro', function() {
83251                     if (!context.hasEntity(hallId)) {
83252                         continueTo(clickTownHall);
83253                     }
83254                 });
83255
83256                 function continueTo(nextStep) {
83257                     context.on('exit.intro', null);
83258                     context.history().on('change.intro', null);
83259                     d3_select('.inspector-wrap').on('wheel.intro', null);
83260                     nextStep();
83261                 }
83262             }
83263
83264
83265             function presetTownHall() {
83266                 if (!isTownHallSelected()) return clickTownHall();
83267
83268                 // reset pane, in case user happened to change it..
83269                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83270                 // disallow scrolling
83271                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83272
83273                 // preset match, in case the user happened to change it.
83274                 var entity = context.entity(context.selectedIDs()[0]);
83275                 var preset = context.presets().match(entity, context.graph());
83276
83277                 var onClick = function() { continueTo(fieldsTownHall); };
83278
83279                 context.on('exit.intro', function() {
83280                     continueTo(clickTownHall);
83281                 });
83282
83283                 context.history().on('change.intro', function() {
83284                     if (!context.hasEntity(hallId)) {
83285                         continueTo(clickTownHall);
83286                     }
83287                 });
83288
83289                 reveal('.inspector-body .preset-list-item.inspector-inner',
83290                     t('intro.navigation.preset_townhall', { preset: preset.name() }),
83291                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83292                 );
83293
83294                 function continueTo(nextStep) {
83295                     context.on('exit.intro', null);
83296                     context.history().on('change.intro', null);
83297                     d3_select('.inspector-wrap').on('wheel.intro', null);
83298                     nextStep();
83299                 }
83300             }
83301
83302
83303             function fieldsTownHall() {
83304                 if (!isTownHallSelected()) return clickTownHall();
83305
83306                 // reset pane, in case user happened to change it..
83307                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83308                 // disallow scrolling
83309                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83310
83311                 var onClick = function() { continueTo(closeTownHall); };
83312
83313                 reveal('.inspector-body .preset-editor',
83314                     t('intro.navigation.fields_townhall'),
83315                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83316                 );
83317
83318                 context.on('exit.intro', function() {
83319                     continueTo(clickTownHall);
83320                 });
83321
83322                 context.history().on('change.intro', function() {
83323                     if (!context.hasEntity(hallId)) {
83324                         continueTo(clickTownHall);
83325                     }
83326                 });
83327
83328                 function continueTo(nextStep) {
83329                     context.on('exit.intro', null);
83330                     context.history().on('change.intro', null);
83331                     d3_select('.inspector-wrap').on('wheel.intro', null);
83332                     nextStep();
83333                 }
83334             }
83335
83336
83337             function closeTownHall() {
83338                 if (!isTownHallSelected()) return clickTownHall();
83339
83340                 var selector = '.entity-editor-pane button.preset-close svg use';
83341                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83342
83343                 reveal('.entity-editor-pane',
83344                     t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
83345                 );
83346
83347                 context.on('exit.intro', function() {
83348                     continueTo(searchStreet);
83349                 });
83350
83351                 context.history().on('change.intro', function() {
83352                     // update the close icon in the tooltip if the user edits something.
83353                     var selector = '.entity-editor-pane button.preset-close svg use';
83354                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83355
83356                     reveal('.entity-editor-pane',
83357                         t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
83358                         { duration: 0 }
83359                     );
83360                 });
83361
83362                 function continueTo(nextStep) {
83363                     context.on('exit.intro', null);
83364                     context.history().on('change.intro', null);
83365                     nextStep();
83366                 }
83367             }
83368
83369
83370             function searchStreet() {
83371                 context.enter(modeBrowse(context));
83372                 context.history().reset('initial');  // ensure spring street exists
83373
83374                 var msec = transitionTime(springStreet, context.map().center());
83375                 if (msec) { reveal(null, null, { duration: 0 }); }
83376                 context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
83377
83378                 timeout(function() {
83379                     reveal('.search-header input',
83380                         t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
83381                     );
83382
83383                     d3_select('.search-header input')
83384                         .on('keyup.intro', checkSearchResult);
83385                 }, msec + 100);
83386             }
83387
83388
83389             function checkSearchResult() {
83390                 var first = d3_select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
83391                 var firstName = first.select('.entity-name');
83392                 var name = t('intro.graph.name.spring-street');
83393
83394                 if (!firstName.empty() && firstName.text() === name) {
83395                     reveal(first.node(),
83396                         t('intro.navigation.choose_street', { name: name }),
83397                         { duration: 300 }
83398                     );
83399
83400                     context.on('exit.intro', function() {
83401                         continueTo(selectedStreet);
83402                     });
83403
83404                     d3_select('.search-header input')
83405                         .on('keydown.intro', eventCancel, true)
83406                         .on('keyup.intro', null);
83407                 }
83408
83409                 function continueTo(nextStep) {
83410                     context.on('exit.intro', null);
83411                     d3_select('.search-header input')
83412                         .on('keydown.intro', null)
83413                         .on('keyup.intro', null);
83414                     nextStep();
83415                 }
83416             }
83417
83418
83419             function selectedStreet() {
83420                 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83421                     return searchStreet();
83422                 }
83423
83424                 var onClick = function() { continueTo(editorStreet); };
83425                 var entity = context.entity(springStreetEndId);
83426                 var box = pointBox(entity.loc, context);
83427                 box.height = 500;
83428
83429                 reveal(box,
83430                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83431                     { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
83432                 );
83433
83434                 timeout(function() {
83435                     context.map().on('move.intro drawn.intro', function() {
83436                         var entity = context.hasEntity(springStreetEndId);
83437                         if (!entity) return;
83438                         var box = pointBox(entity.loc, context);
83439                         box.height = 500;
83440                         reveal(box,
83441                             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83442                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83443                         );
83444                     });
83445                 }, 600);  // after reveal.
83446
83447                 context.on('enter.intro', function(mode) {
83448                     if (!context.hasEntity(springStreetId)) {
83449                         return continueTo(searchStreet);
83450                     }
83451                     var ids = context.selectedIDs();
83452                     if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
83453                         // keep Spring Street selected..
83454                         context.enter(modeSelect(context, [springStreetId]));
83455                     }
83456                 });
83457
83458                 context.history().on('change.intro', function() {
83459                     if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83460                         timeout(function() {
83461                             continueTo(searchStreet);
83462                         }, 300);  // after any transition (e.g. if user deleted intersection)
83463                     }
83464                 });
83465
83466                 function continueTo(nextStep) {
83467                     context.map().on('move.intro drawn.intro', null);
83468                     context.on('enter.intro', null);
83469                     context.history().on('change.intro', null);
83470                     nextStep();
83471                 }
83472             }
83473
83474
83475             function editorStreet() {
83476                 var selector = '.entity-editor-pane button.preset-close svg use';
83477                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83478
83479                 reveal('.entity-editor-pane',
83480                     t('intro.navigation.editor_street', {
83481                         button: icon(href, 'pre-text'),
83482                         field1: onewayField.label(),
83483                         field2: maxspeedField.label()
83484                     })
83485                 );
83486
83487                 context.on('exit.intro', function() {
83488                     continueTo(play);
83489                 });
83490
83491                 context.history().on('change.intro', function() {
83492                     // update the close icon in the tooltip if the user edits something.
83493                     var selector = '.entity-editor-pane button.preset-close svg use';
83494                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83495
83496                     reveal('.entity-editor-pane',
83497                         t('intro.navigation.editor_street', {
83498                             button: icon(href, 'pre-text'),
83499                             field1: onewayField.label().toLowerCase(),
83500                             field2: maxspeedField.label().toLowerCase()
83501                         }), { duration: 0 }
83502                     );
83503                 });
83504
83505                 function continueTo(nextStep) {
83506                     context.on('exit.intro', null);
83507                     context.history().on('change.intro', null);
83508                     nextStep();
83509                 }
83510             }
83511
83512
83513             function play() {
83514                 dispatch$1.call('done');
83515                 reveal('#id-container',
83516                     t('intro.navigation.play', { next: t('intro.points.title') }), {
83517                         tooltipBox: '.intro-nav-wrap .chapter-point',
83518                         buttonText: t('intro.ok'),
83519                         buttonCallback: function() { reveal('#id-container'); }
83520                     }
83521                 );
83522             }
83523
83524
83525             chapter.enter = function() {
83526                 dragMap();
83527             };
83528
83529
83530             chapter.exit = function() {
83531                 timeouts.forEach(window.clearTimeout);
83532                 context.on('enter.intro exit.intro', null);
83533                 context.map().on('move.intro drawn.intro', null);
83534                 context.history().on('change.intro', null);
83535                 d3_select('.inspector-wrap').on('wheel.intro', null);
83536                 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
83537             };
83538
83539
83540             chapter.restart = function() {
83541                 chapter.exit();
83542                 chapter.enter();
83543             };
83544
83545
83546             return utilRebind(chapter, dispatch$1, 'on');
83547         }
83548
83549         function uiIntroPoint(context, reveal) {
83550             var dispatch$1 = dispatch('done');
83551             var timeouts = [];
83552             var intersection = [-85.63279, 41.94394];
83553             var building = [-85.632422, 41.944045];
83554             var cafePreset = context.presets().item('amenity/cafe');
83555             var _pointID = null;
83556
83557
83558             var chapter = {
83559                 title: 'intro.points.title'
83560             };
83561
83562
83563             function timeout(f, t) {
83564                 timeouts.push(window.setTimeout(f, t));
83565             }
83566
83567
83568             function revealEditMenu(loc, text, options) {
83569                 var rect = context.surfaceRect();
83570                 var point = context.curtainProjection(loc);
83571                 var pad = 40;
83572                 var width = 250 + (2 * pad);
83573                 var height = 250;
83574                 var startX = rect.left + point[0];
83575                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
83576                 var box = {
83577                     left: left,
83578                     top: point[1] + rect.top - 60,
83579                     width: width,
83580                     height: height
83581                 };
83582                 reveal(box, text, options);
83583             }
83584
83585
83586             function eventCancel() {
83587                 event.stopPropagation();
83588                 event.preventDefault();
83589             }
83590
83591
83592             function addPoint() {
83593                 context.enter(modeBrowse(context));
83594                 context.history().reset('initial');
83595
83596                 var msec = transitionTime(intersection, context.map().center());
83597                 if (msec) { reveal(null, null, { duration: 0 }); }
83598                 context.map().centerZoomEase(intersection, 19, msec);
83599
83600                 timeout(function() {
83601                     var tooltip = reveal('button.add-point',
83602                         t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
83603
83604                     _pointID = null;
83605
83606                     tooltip.selectAll('.tooltip-inner')
83607                         .insert('svg', 'span')
83608                         .attr('class', 'tooltip-illustration')
83609                         .append('use')
83610                         .attr('xlink:href', '#iD-graphic-points');
83611
83612                     context.on('enter.intro', function(mode) {
83613                         if (mode.id !== 'add-point') return;
83614                         continueTo(placePoint);
83615                     });
83616                 }, msec + 100);
83617
83618                 function continueTo(nextStep) {
83619                     context.on('enter.intro', null);
83620                     nextStep();
83621                 }
83622             }
83623
83624
83625             function placePoint() {
83626                 if (context.mode().id !== 'add-point') {
83627                     return chapter.restart();
83628                 }
83629
83630                 var pointBox = pad$2(building, 150, context);
83631                 reveal(pointBox, t('intro.points.place_point'));
83632
83633                 context.map().on('move.intro drawn.intro', function() {
83634                     pointBox = pad$2(building, 150, context);
83635                     reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
83636                 });
83637
83638                 context.on('enter.intro', function(mode) {
83639                     if (mode.id !== 'select') return chapter.restart();
83640                     _pointID = context.mode().selectedIDs()[0];
83641                     continueTo(searchPreset);
83642                 });
83643
83644                 function continueTo(nextStep) {
83645                     context.map().on('move.intro drawn.intro', null);
83646                     context.on('enter.intro', null);
83647                     nextStep();
83648                 }
83649             }
83650
83651
83652             function searchPreset() {
83653                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83654                     return addPoint();
83655                 }
83656
83657                 // disallow scrolling
83658                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83659
83660                 d3_select('.preset-search-input')
83661                     .on('keydown.intro', null)
83662                     .on('keyup.intro', checkPresetSearch);
83663
83664                 reveal('.preset-search-input',
83665                     t('intro.points.search_cafe', { preset: cafePreset.name() })
83666                 );
83667
83668                 context.on('enter.intro', function(mode) {
83669                     if (!_pointID || !context.hasEntity(_pointID)) {
83670                         return continueTo(addPoint);
83671                     }
83672
83673                     var ids = context.selectedIDs();
83674                     if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
83675                         // keep the user's point selected..
83676                         context.enter(modeSelect(context, [_pointID]));
83677
83678                         // disallow scrolling
83679                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83680
83681                         d3_select('.preset-search-input')
83682                             .on('keydown.intro', null)
83683                             .on('keyup.intro', checkPresetSearch);
83684
83685                         reveal('.preset-search-input',
83686                             t('intro.points.search_cafe', { preset: cafePreset.name() })
83687                         );
83688
83689                         context.history().on('change.intro', null);
83690                     }
83691                 });
83692
83693
83694                 function checkPresetSearch() {
83695                     var first = d3_select('.preset-list-item:first-child');
83696
83697                     if (first.classed('preset-amenity-cafe')) {
83698                         d3_select('.preset-search-input')
83699                             .on('keydown.intro', eventCancel, true)
83700                             .on('keyup.intro', null);
83701
83702                         reveal(first.select('.preset-list-button').node(),
83703                             t('intro.points.choose_cafe', { preset: cafePreset.name() }),
83704                             { duration: 300 }
83705                         );
83706
83707                         context.history().on('change.intro', function() {
83708                             continueTo(aboutFeatureEditor);
83709                         });
83710                     }
83711                 }
83712
83713                 function continueTo(nextStep) {
83714                     context.on('enter.intro', null);
83715                     context.history().on('change.intro', null);
83716                     d3_select('.inspector-wrap').on('wheel.intro', null);
83717                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83718                     nextStep();
83719                 }
83720             }
83721
83722
83723             function aboutFeatureEditor() {
83724                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83725                     return addPoint();
83726                 }
83727
83728                 timeout(function() {
83729                     reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
83730                         tooltipClass: 'intro-points-describe',
83731                         buttonText: t('intro.ok'),
83732                         buttonCallback: function() { continueTo(addName); }
83733                     });
83734                 }, 400);
83735
83736                 context.on('exit.intro', function() {
83737                     // if user leaves select mode here, just continue with the tutorial.
83738                     continueTo(reselectPoint);
83739                 });
83740
83741                 function continueTo(nextStep) {
83742                     context.on('exit.intro', null);
83743                     nextStep();
83744                 }
83745             }
83746
83747
83748             function addName() {
83749                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83750                     return addPoint();
83751                 }
83752
83753                 // reset pane, in case user happened to change it..
83754                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83755
83756                 timeout(function() {
83757                     // It's possible for the user to add a name in a previous step..
83758                     // If so, don't tell them to add the name in this step.
83759                     // Give them an OK button instead.
83760                     var entity = context.entity(_pointID);
83761                     if (entity.tags.name) {
83762                         var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
83763                             tooltipClass: 'intro-points-describe',
83764                             buttonText: t('intro.ok'),
83765                             buttonCallback: function() { continueTo(addCloseEditor); }
83766                         });
83767                         tooltip.select('.instruction').style('display', 'none');
83768
83769                     } else {
83770                         reveal('.entity-editor-pane', t('intro.points.add_name'),
83771                             { tooltipClass: 'intro-points-describe' }
83772                         );
83773                     }
83774                 }, 400);
83775
83776                 context.history().on('change.intro', function() {
83777                     continueTo(addCloseEditor);
83778                 });
83779
83780                 context.on('exit.intro', function() {
83781                     // if user leaves select mode here, just continue with the tutorial.
83782                     continueTo(reselectPoint);
83783                 });
83784
83785                 function continueTo(nextStep) {
83786                     context.on('exit.intro', null);
83787                     context.history().on('change.intro', null);
83788                     nextStep();
83789                 }
83790             }
83791
83792
83793             function addCloseEditor() {
83794                 // reset pane, in case user happened to change it..
83795                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83796
83797                 var selector = '.entity-editor-pane button.preset-close svg use';
83798                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83799
83800                 context.on('exit.intro', function() {
83801                     continueTo(reselectPoint);
83802                 });
83803
83804                 reveal('.entity-editor-pane',
83805                     t('intro.points.add_close', { button: icon(href, 'pre-text') })
83806                 );
83807
83808                 function continueTo(nextStep) {
83809                     context.on('exit.intro', null);
83810                     nextStep();
83811                 }
83812             }
83813
83814
83815             function reselectPoint() {
83816                 if (!_pointID) return chapter.restart();
83817                 var entity = context.hasEntity(_pointID);
83818                 if (!entity) return chapter.restart();
83819
83820                 // make sure it's still a cafe, in case user somehow changed it..
83821                 var oldPreset = context.presets().match(entity, context.graph());
83822                 context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
83823
83824                 context.enter(modeBrowse(context));
83825
83826                 var msec = transitionTime(entity.loc, context.map().center());
83827                 if (msec) { reveal(null, null, { duration: 0 }); }
83828                 context.map().centerEase(entity.loc, msec);
83829
83830                 timeout(function() {
83831                     var box = pointBox(entity.loc, context);
83832                     reveal(box, t('intro.points.reselect'), { duration: 600 });
83833
83834                     timeout(function() {
83835                         context.map().on('move.intro drawn.intro', function() {
83836                             var entity = context.hasEntity(_pointID);
83837                             if (!entity) return chapter.restart();
83838                             var box = pointBox(entity.loc, context);
83839                             reveal(box, t('intro.points.reselect'), { duration: 0 });
83840                         });
83841                     }, 600); // after reveal..
83842
83843                     context.on('enter.intro', function(mode) {
83844                         if (mode.id !== 'select') return;
83845                         continueTo(updatePoint);
83846                     });
83847
83848                 }, msec + 100);
83849
83850                 function continueTo(nextStep) {
83851                     context.map().on('move.intro drawn.intro', null);
83852                     context.on('enter.intro', null);
83853                     nextStep();
83854                 }
83855             }
83856
83857
83858             function updatePoint() {
83859                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83860                     return continueTo(reselectPoint);
83861                 }
83862
83863                 // reset pane, in case user happened to untag the point..
83864                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83865
83866                 context.on('exit.intro', function() {
83867                     continueTo(reselectPoint);
83868                 });
83869
83870                 context.history().on('change.intro', function() {
83871                     continueTo(updateCloseEditor);
83872                 });
83873
83874                 timeout(function() {
83875                     reveal('.entity-editor-pane', t('intro.points.update'),
83876                         { tooltipClass: 'intro-points-describe' }
83877                     );
83878                 }, 400);
83879
83880                 function continueTo(nextStep) {
83881                     context.on('exit.intro', null);
83882                     context.history().on('change.intro', null);
83883                     nextStep();
83884                 }
83885             }
83886
83887
83888             function updateCloseEditor() {
83889                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83890                     return continueTo(reselectPoint);
83891                 }
83892
83893                 // reset pane, in case user happened to change it..
83894                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83895
83896                 context.on('exit.intro', function() {
83897                     continueTo(rightClickPoint);
83898                 });
83899
83900                 timeout(function() {
83901                     reveal('.entity-editor-pane',
83902                         t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
83903                     );
83904                 }, 500);
83905
83906                 function continueTo(nextStep) {
83907                     context.on('exit.intro', null);
83908                     nextStep();
83909                 }
83910             }
83911
83912
83913             function rightClickPoint() {
83914                 if (!_pointID) return chapter.restart();
83915                 var entity = context.hasEntity(_pointID);
83916                 if (!entity) return chapter.restart();
83917
83918                 context.enter(modeBrowse(context));
83919
83920                 var box = pointBox(entity.loc, context);
83921                 reveal(box, t('intro.points.rightclick'), { duration: 600 });
83922
83923                 timeout(function() {
83924                     context.map().on('move.intro drawn.intro', function() {
83925                         var entity = context.hasEntity(_pointID);
83926                         if (!entity) return chapter.restart();
83927                         var box = pointBox(entity.loc, context);
83928                         reveal(box, t('intro.points.rightclick'), { duration: 0 });
83929                     });
83930                 }, 600); // after reveal
83931
83932                 context.on('enter.intro', function(mode) {
83933                     if (mode.id !== 'select') return;
83934                     var ids = context.selectedIDs();
83935                     if (ids.length !== 1 || ids[0] !== _pointID) return;
83936
83937                     timeout(function() {
83938                         var node = selectMenuItem('delete').node();
83939                         if (!node) return;
83940                         continueTo(enterDelete);
83941                     }, 300);  // after menu visible
83942                 });
83943
83944                 function continueTo(nextStep) {
83945                     context.on('enter.intro', null);
83946                     context.map().on('move.intro drawn.intro', null);
83947                     nextStep();
83948                 }
83949             }
83950
83951
83952             function enterDelete() {
83953                 if (!_pointID) return chapter.restart();
83954                 var entity = context.hasEntity(_pointID);
83955                 if (!entity) return chapter.restart();
83956
83957                 var node = selectMenuItem('delete').node();
83958                 if (!node) { return continueTo(rightClickPoint); }
83959
83960                 revealEditMenu(entity.loc,
83961                     t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
83962                 );
83963
83964                 timeout(function() {
83965                     context.map().on('move.intro drawn.intro', function() {
83966                         revealEditMenu(entity.loc,
83967                             t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
83968                             { duration: 0}
83969                         );
83970                     });
83971                 }, 300); // after menu visible
83972
83973                 context.on('exit.intro', function() {
83974                     if (!_pointID) return chapter.restart();
83975                     var entity = context.hasEntity(_pointID);
83976                     if (entity) return continueTo(rightClickPoint);  // point still exists
83977                 });
83978
83979                 context.history().on('change.intro', function(changed) {
83980                     if (changed.deleted().length) {
83981                         continueTo(undo);
83982                     }
83983                 });
83984
83985                 function continueTo(nextStep) {
83986                     context.map().on('move.intro drawn.intro', null);
83987                     context.history().on('change.intro', null);
83988                     context.on('exit.intro', null);
83989                     nextStep();
83990                 }
83991             }
83992
83993
83994             function undo() {
83995                 context.history().on('change.intro', function() {
83996                     continueTo(play);
83997                 });
83998
83999                 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
84000                 reveal('#bar button.undo-button',
84001                     t('intro.points.undo', { button: icon(iconName, 'pre-text') })
84002                 );
84003
84004                 function continueTo(nextStep) {
84005                     context.history().on('change.intro', null);
84006                     nextStep();
84007                 }
84008             }
84009
84010
84011             function play() {
84012                 dispatch$1.call('done');
84013                 reveal('#id-container',
84014                     t('intro.points.play', { next: t('intro.areas.title') }), {
84015                         tooltipBox: '.intro-nav-wrap .chapter-area',
84016                         buttonText: t('intro.ok'),
84017                         buttonCallback: function() { reveal('#id-container'); }
84018                     }
84019                 );
84020             }
84021
84022
84023             chapter.enter = function() {
84024                 addPoint();
84025             };
84026
84027
84028             chapter.exit = function() {
84029                 timeouts.forEach(window.clearTimeout);
84030                 context.on('enter.intro exit.intro', null);
84031                 context.map().on('move.intro drawn.intro', null);
84032                 context.history().on('change.intro', null);
84033                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84034                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84035             };
84036
84037
84038             chapter.restart = function() {
84039                 chapter.exit();
84040                 chapter.enter();
84041             };
84042
84043
84044             return utilRebind(chapter, dispatch$1, 'on');
84045         }
84046
84047         function uiIntroArea(context, reveal) {
84048             var dispatch$1 = dispatch('done');
84049             var playground = [-85.63552, 41.94159];
84050             var playgroundPreset = context.presets().item('leisure/playground');
84051             var descriptionField = context.presets().field('description');
84052             var timeouts = [];
84053             var _areaID;
84054
84055
84056             var chapter = {
84057                 title: 'intro.areas.title'
84058             };
84059
84060
84061             function timeout(f, t) {
84062                 timeouts.push(window.setTimeout(f, t));
84063             }
84064
84065
84066             function eventCancel() {
84067                 event.stopPropagation();
84068                 event.preventDefault();
84069             }
84070
84071
84072             function revealPlayground(center, text, options) {
84073                 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
84074                 var box = pad$2(center, padding, context);
84075                 reveal(box, text, options);
84076             }
84077
84078
84079             function addArea() {
84080                 context.enter(modeBrowse(context));
84081                 context.history().reset('initial');
84082                 _areaID = null;
84083
84084                 var msec = transitionTime(playground, context.map().center());
84085                 if (msec) { reveal(null, null, { duration: 0 }); }
84086                 context.map().centerZoomEase(playground, 19, msec);
84087
84088                 timeout(function() {
84089                     var tooltip = reveal('button.add-area',
84090                         t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
84091
84092                     tooltip.selectAll('.tooltip-inner')
84093                         .insert('svg', 'span')
84094                         .attr('class', 'tooltip-illustration')
84095                         .append('use')
84096                         .attr('xlink:href', '#iD-graphic-areas');
84097
84098                     context.on('enter.intro', function(mode) {
84099                         if (mode.id !== 'add-area') return;
84100                         continueTo(startPlayground);
84101                     });
84102                 }, msec + 100);
84103
84104                 function continueTo(nextStep) {
84105                     context.on('enter.intro', null);
84106                     nextStep();
84107                 }
84108             }
84109
84110
84111             function startPlayground() {
84112                 if (context.mode().id !== 'add-area') {
84113                     return chapter.restart();
84114                 }
84115
84116                 _areaID = null;
84117                 context.map().zoomEase(19.5, 500);
84118
84119                 timeout(function() {
84120                     revealPlayground(playground,
84121                         t('intro.areas.start_playground'), { duration: 250 }
84122                     );
84123
84124                     timeout(function() {
84125                         context.map().on('move.intro drawn.intro', function() {
84126                             revealPlayground(playground,
84127                                 t('intro.areas.start_playground'), { duration: 0 }
84128                             );
84129                         });
84130                         context.on('enter.intro', function(mode) {
84131                             if (mode.id !== 'draw-area') return chapter.restart();
84132                             continueTo(continuePlayground);
84133                         });
84134                     }, 250);  // after reveal
84135
84136                 }, 550);  // after easing
84137
84138                 function continueTo(nextStep) {
84139                     context.map().on('move.intro drawn.intro', null);
84140                     context.on('enter.intro', null);
84141                     nextStep();
84142                 }
84143             }
84144
84145
84146             function continuePlayground() {
84147                 if (context.mode().id !== 'draw-area') {
84148                     return chapter.restart();
84149                 }
84150
84151                 _areaID = null;
84152                 revealPlayground(playground,
84153                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84154                     { duration: 250 }
84155                 );
84156
84157                 timeout(function() {
84158                     context.map().on('move.intro drawn.intro', function() {
84159                         revealPlayground(playground,
84160                             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84161                             { duration: 0 }
84162                         );
84163                     });
84164                 }, 250);  // after reveal
84165
84166                 context.on('enter.intro', function(mode) {
84167                     if (mode.id === 'draw-area') {
84168                         var entity = context.hasEntity(context.selectedIDs()[0]);
84169                         if (entity && entity.nodes.length >= 6) {
84170                             return continueTo(finishPlayground);
84171                         } else {
84172                             return;
84173                         }
84174                     } else if (mode.id === 'select') {
84175                         _areaID = context.selectedIDs()[0];
84176                         return continueTo(searchPresets);
84177                     } else {
84178                         return chapter.restart();
84179                     }
84180                 });
84181
84182                 function continueTo(nextStep) {
84183                     context.map().on('move.intro drawn.intro', null);
84184                     context.on('enter.intro', null);
84185                     nextStep();
84186                 }
84187             }
84188
84189
84190             function finishPlayground() {
84191                 if (context.mode().id !== 'draw-area') {
84192                     return chapter.restart();
84193                 }
84194
84195                 _areaID = null;
84196                 revealPlayground(playground,
84197                     t('intro.areas.finish_playground'), { duration: 250 }
84198                 );
84199
84200                 timeout(function() {
84201                     context.map().on('move.intro drawn.intro', function() {
84202                         revealPlayground(playground,
84203                             t('intro.areas.finish_playground'), { duration: 0 }
84204                         );
84205                     });
84206                 }, 250);  // after reveal
84207
84208                 context.on('enter.intro', function(mode) {
84209                     if (mode.id === 'draw-area') {
84210                         return;
84211                     } else if (mode.id === 'select') {
84212                         _areaID = context.selectedIDs()[0];
84213                         return continueTo(searchPresets);
84214                     } else {
84215                         return chapter.restart();
84216                     }
84217                 });
84218
84219                 function continueTo(nextStep) {
84220                     context.map().on('move.intro drawn.intro', null);
84221                     context.on('enter.intro', null);
84222                     nextStep();
84223                 }
84224             }
84225
84226
84227             function searchPresets() {
84228                 if (!_areaID || !context.hasEntity(_areaID)) {
84229                     return addArea();
84230                 }
84231                 var ids = context.selectedIDs();
84232                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84233                     context.enter(modeSelect(context, [_areaID]));
84234                 }
84235
84236                 // disallow scrolling
84237                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84238
84239                 timeout(function() {
84240                     // reset pane, in case user somehow happened to change it..
84241                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84242
84243                     d3_select('.preset-search-input')
84244                         .on('keydown.intro', null)
84245                         .on('keyup.intro', checkPresetSearch);
84246
84247                     reveal('.preset-search-input',
84248                         t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84249                     );
84250                 }, 400);  // after preset list pane visible..
84251
84252                 context.on('enter.intro', function(mode) {
84253                     if (!_areaID || !context.hasEntity(_areaID)) {
84254                         return continueTo(addArea);
84255                     }
84256
84257                     var ids = context.selectedIDs();
84258                     if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
84259                         // keep the user's area selected..
84260                         context.enter(modeSelect(context, [_areaID]));
84261
84262                         // reset pane, in case user somehow happened to change it..
84263                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84264                         // disallow scrolling
84265                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84266
84267                         d3_select('.preset-search-input')
84268                             .on('keydown.intro', null)
84269                             .on('keyup.intro', checkPresetSearch);
84270
84271                         reveal('.preset-search-input',
84272                             t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84273                         );
84274
84275                         context.history().on('change.intro', null);
84276                     }
84277                 });
84278
84279                 function checkPresetSearch() {
84280                     var first = d3_select('.preset-list-item:first-child');
84281
84282                     if (first.classed('preset-leisure-playground')) {
84283                         reveal(first.select('.preset-list-button').node(),
84284                             t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
84285                             { duration: 300 }
84286                         );
84287
84288                         d3_select('.preset-search-input')
84289                             .on('keydown.intro', eventCancel, true)
84290                             .on('keyup.intro', null);
84291
84292                         context.history().on('change.intro', function() {
84293                             continueTo(clickAddField);
84294                         });
84295                     }
84296                 }
84297
84298                 function continueTo(nextStep) {
84299                     d3_select('.inspector-wrap').on('wheel.intro', null);
84300                     context.on('enter.intro', null);
84301                     context.history().on('change.intro', null);
84302                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84303                     nextStep();
84304                 }
84305             }
84306
84307
84308             function clickAddField() {
84309                 if (!_areaID || !context.hasEntity(_areaID)) {
84310                     return addArea();
84311                 }
84312                 var ids = context.selectedIDs();
84313                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84314                     return searchPresets();
84315                 }
84316
84317                 if (!d3_select('.form-field-description').empty()) {
84318                     return continueTo(describePlayground);
84319                 }
84320
84321                 // disallow scrolling
84322                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84323
84324                 timeout(function() {
84325                     // reset pane, in case user somehow happened to change it..
84326                     d3_select('.inspector-wrap .panewrap').style('right', '0%');
84327
84328                     // It's possible for the user to add a description in a previous step..
84329                     // If they did this already, just continue to next step.
84330                     var entity = context.entity(_areaID);
84331                     if (entity.tags.description) {
84332                         return continueTo(play);
84333                     }
84334
84335                     // scroll "Add field" into view
84336                     var box = d3_select('.more-fields').node().getBoundingClientRect();
84337                     if (box.top > 300) {
84338                         var pane = d3_select('.entity-editor-pane .inspector-body');
84339                         var start = pane.node().scrollTop;
84340                         var end = start + (box.top - 300);
84341
84342                         pane
84343                             .transition()
84344                             .duration(250)
84345                             .tween('scroll.inspector', function() {
84346                                 var node = this;
84347                                 var i = d3_interpolateNumber(start, end);
84348                                 return function(t) {
84349                                     node.scrollTop = i(t);
84350                                 };
84351                             });
84352                     }
84353
84354                     timeout(function() {
84355                         reveal('.more-fields .combobox-input',
84356                             t('intro.areas.add_field'),
84357                             { duration: 300 }
84358                         );
84359
84360                         d3_select('.more-fields .combobox-input')
84361                             .on('click.intro', function() {
84362                                 // Watch for the combobox to appear...
84363                                 var watcher;
84364                                 watcher = window.setInterval(function() {
84365                                     if (!d3_select('div.combobox').empty()) {
84366                                         window.clearInterval(watcher);
84367                                         continueTo(chooseDescriptionField);
84368                                     }
84369                                 }, 300);
84370                             });
84371                     }, 300);  // after "Add Field" visible
84372
84373                 }, 400);  // after editor pane visible
84374
84375                 context.on('exit.intro', function() {
84376                     return continueTo(searchPresets);
84377                 });
84378
84379                 function continueTo(nextStep) {
84380                     d3_select('.inspector-wrap').on('wheel.intro', null);
84381                     d3_select('.more-fields .combobox-input').on('click.intro', null);
84382                     context.on('exit.intro', null);
84383                     nextStep();
84384                 }
84385             }
84386
84387
84388             function chooseDescriptionField() {
84389                 if (!_areaID || !context.hasEntity(_areaID)) {
84390                     return addArea();
84391                 }
84392                 var ids = context.selectedIDs();
84393                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84394                     return searchPresets();
84395                 }
84396
84397                 if (!d3_select('.form-field-description').empty()) {
84398                     return continueTo(describePlayground);
84399                 }
84400
84401                 // Make sure combobox is ready..
84402                 if (d3_select('div.combobox').empty()) {
84403                     return continueTo(clickAddField);
84404                 }
84405                 // Watch for the combobox to go away..
84406                 var watcher;
84407                 watcher = window.setInterval(function() {
84408                     if (d3_select('div.combobox').empty()) {
84409                         window.clearInterval(watcher);
84410                         timeout(function() {
84411                             if (d3_select('.form-field-description').empty()) {
84412                                 continueTo(retryChooseDescription);
84413                             } else {
84414                                 continueTo(describePlayground);
84415                             }
84416                         }, 300);  // after description field added.
84417                     }
84418                 }, 300);
84419
84420                 reveal('div.combobox',
84421                     t('intro.areas.choose_field', { field: descriptionField.label() }),
84422                     { duration: 300 }
84423                 );
84424
84425                 context.on('exit.intro', function() {
84426                     return continueTo(searchPresets);
84427                 });
84428
84429                 function continueTo(nextStep) {
84430                     if (watcher) window.clearInterval(watcher);
84431                     context.on('exit.intro', null);
84432                     nextStep();
84433                 }
84434             }
84435
84436
84437             function describePlayground() {
84438                 if (!_areaID || !context.hasEntity(_areaID)) {
84439                     return addArea();
84440                 }
84441                 var ids = context.selectedIDs();
84442                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84443                     return searchPresets();
84444                 }
84445
84446                 // reset pane, in case user happened to change it..
84447                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84448
84449                 if (d3_select('.form-field-description').empty()) {
84450                     return continueTo(retryChooseDescription);
84451                 }
84452
84453                 context.on('exit.intro', function() {
84454                     continueTo(play);
84455                 });
84456
84457                 reveal('.entity-editor-pane',
84458                     t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
84459                     { duration: 300 }
84460                 );
84461
84462                 function continueTo(nextStep) {
84463                     context.on('exit.intro', null);
84464                     nextStep();
84465                 }
84466             }
84467
84468
84469             function retryChooseDescription() {
84470                 if (!_areaID || !context.hasEntity(_areaID)) {
84471                     return addArea();
84472                 }
84473                 var ids = context.selectedIDs();
84474                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84475                     return searchPresets();
84476                 }
84477
84478                 // reset pane, in case user happened to change it..
84479                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84480
84481                 reveal('.entity-editor-pane',
84482                     t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
84483                     buttonText: t('intro.ok'),
84484                     buttonCallback: function() { continueTo(clickAddField); }
84485                 });
84486
84487                 context.on('exit.intro', function() {
84488                     return continueTo(searchPresets);
84489                 });
84490
84491                 function continueTo(nextStep) {
84492                     context.on('exit.intro', null);
84493                     nextStep();
84494                 }
84495             }
84496
84497
84498             function play() {
84499                 dispatch$1.call('done');
84500                 reveal('#id-container',
84501                     t('intro.areas.play', { next: t('intro.lines.title') }), {
84502                         tooltipBox: '.intro-nav-wrap .chapter-line',
84503                         buttonText: t('intro.ok'),
84504                         buttonCallback: function() { reveal('#id-container'); }
84505                     }
84506                 );
84507             }
84508
84509
84510             chapter.enter = function() {
84511                 addArea();
84512             };
84513
84514
84515             chapter.exit = function() {
84516                 timeouts.forEach(window.clearTimeout);
84517                 context.on('enter.intro exit.intro', null);
84518                 context.map().on('move.intro drawn.intro', null);
84519                 context.history().on('change.intro', null);
84520                 d3_select('.inspector-wrap').on('wheel.intro', null);
84521                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84522                 d3_select('.more-fields .combobox-input').on('click.intro', null);
84523             };
84524
84525
84526             chapter.restart = function() {
84527                 chapter.exit();
84528                 chapter.enter();
84529             };
84530
84531
84532             return utilRebind(chapter, dispatch$1, 'on');
84533         }
84534
84535         function uiIntroLine(context, reveal) {
84536             var dispatch$1 = dispatch('done');
84537             var timeouts = [];
84538             var _tulipRoadID = null;
84539             var flowerRoadID = 'w646';
84540             var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
84541             var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
84542             var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
84543             var roadCategory = context.presets().item('category-road_minor');
84544             var residentialPreset = context.presets().item('highway/residential');
84545             var woodRoadID = 'w525';
84546             var woodRoadEndID = 'n2862';
84547             var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
84548             var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
84549             var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
84550             var washingtonStreetID = 'w522';
84551             var twelfthAvenueID = 'w1';
84552             var eleventhAvenueEndID = 'n3550';
84553             var twelfthAvenueEndID = 'n5';
84554             var _washingtonSegmentID = null;
84555             var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
84556             var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
84557             var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
84558             var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
84559
84560
84561             var chapter = {
84562                 title: 'intro.lines.title'
84563             };
84564
84565
84566             function timeout(f, t) {
84567                 timeouts.push(window.setTimeout(f, t));
84568             }
84569
84570
84571             function eventCancel() {
84572                 event.stopPropagation();
84573                 event.preventDefault();
84574             }
84575
84576
84577             function revealEditMenu(loc, text, options) {
84578                 var rect = context.surfaceRect();
84579                 var point = context.curtainProjection(loc);
84580                 var pad = 40;
84581                 var width = 250 + (2 * pad);
84582                 var height = 350;
84583                 var startX = rect.left + point[0];
84584                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
84585                 var box = {
84586                     left: left,
84587                     top: point[1] + rect.top - 60,
84588                     width: width,
84589                     height: height
84590                 };
84591                 reveal(box, text, options);
84592             }
84593
84594
84595             function addLine() {
84596                 context.enter(modeBrowse(context));
84597                 context.history().reset('initial');
84598
84599                 var msec = transitionTime(tulipRoadStart, context.map().center());
84600                 if (msec) { reveal(null, null, { duration: 0 }); }
84601                 context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
84602
84603                 timeout(function() {
84604                     var tooltip = reveal('button.add-line',
84605                         t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
84606
84607                     tooltip.selectAll('.tooltip-inner')
84608                         .insert('svg', 'span')
84609                         .attr('class', 'tooltip-illustration')
84610                         .append('use')
84611                         .attr('xlink:href', '#iD-graphic-lines');
84612
84613                     context.on('enter.intro', function(mode) {
84614                         if (mode.id !== 'add-line') return;
84615                         continueTo(startLine);
84616                     });
84617                 }, msec + 100);
84618
84619                 function continueTo(nextStep) {
84620                     context.on('enter.intro', null);
84621                     nextStep();
84622                 }
84623             }
84624
84625
84626             function startLine() {
84627                 if (context.mode().id !== 'add-line') return chapter.restart();
84628
84629                 _tulipRoadID = null;
84630
84631                 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
84632                 var box = pad$2(tulipRoadStart, padding, context);
84633                 box.height = box.height + 100;
84634                 reveal(box, t('intro.lines.start_line'));
84635
84636                 context.map().on('move.intro drawn.intro', function() {
84637                     padding = 70 * Math.pow(2, context.map().zoom() - 18);
84638                     box = pad$2(tulipRoadStart, padding, context);
84639                     box.height = box.height + 100;
84640                     reveal(box, t('intro.lines.start_line'), { duration: 0 });
84641                 });
84642
84643                 context.on('enter.intro', function(mode) {
84644                     if (mode.id !== 'draw-line') return chapter.restart();
84645                     continueTo(drawLine);
84646                 });
84647
84648                 function continueTo(nextStep) {
84649                     context.map().on('move.intro drawn.intro', null);
84650                     context.on('enter.intro', null);
84651                     nextStep();
84652                 }
84653             }
84654
84655
84656             function drawLine() {
84657                 if (context.mode().id !== 'draw-line') return chapter.restart();
84658
84659                 _tulipRoadID = context.mode().selectedIDs()[0];
84660                 context.map().centerEase(tulipRoadMidpoint, 500);
84661
84662                 timeout(function() {
84663                     var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84664                     var box = pad$2(tulipRoadMidpoint, padding, context);
84665                     box.height = box.height * 2;
84666                     reveal(box,
84667                         t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
84668                     );
84669
84670                     context.map().on('move.intro drawn.intro', function() {
84671                         padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84672                         box = pad$2(tulipRoadMidpoint, padding, context);
84673                         box.height = box.height * 2;
84674                         reveal(box,
84675                             t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
84676                             { duration: 0 }
84677                         );
84678                     });
84679                 }, 550);  // after easing..
84680
84681                 context.history().on('change.intro', function() {
84682                     if (isLineConnected()) {
84683                         continueTo(continueLine);
84684                     }
84685                 });
84686
84687                 context.on('enter.intro', function(mode) {
84688                     if (mode.id === 'draw-line') {
84689                         return;
84690                     } else if (mode.id === 'select') {
84691                         continueTo(retryIntersect);
84692                         return;
84693                     } else {
84694                         return chapter.restart();
84695                     }
84696                 });
84697
84698                 function continueTo(nextStep) {
84699                     context.map().on('move.intro drawn.intro', null);
84700                     context.history().on('change.intro', null);
84701                     context.on('enter.intro', null);
84702                     nextStep();
84703                 }
84704             }
84705
84706
84707             function isLineConnected() {
84708                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84709                 if (!entity) return false;
84710
84711                 var drawNodes = context.graph().childNodes(entity);
84712                 return drawNodes.some(function(node) {
84713                     return context.graph().parentWays(node).some(function(parent) {
84714                         return parent.id === flowerRoadID;
84715                     });
84716                 });
84717             }
84718
84719
84720             function retryIntersect() {
84721                 d3_select(window).on('mousedown.intro', eventCancel, true);
84722
84723                 var box = pad$2(tulipRoadIntersection, 80, context);
84724                 reveal(box,
84725                     t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
84726                 );
84727
84728                 timeout(chapter.restart, 3000);
84729             }
84730
84731
84732             function continueLine() {
84733                 if (context.mode().id !== 'draw-line') return chapter.restart();
84734                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84735                 if (!entity) return chapter.restart();
84736
84737                 context.map().centerEase(tulipRoadIntersection, 500);
84738
84739                 reveal('#surface', t('intro.lines.continue_line'));
84740
84741                 context.on('enter.intro', function(mode) {
84742                     if (mode.id === 'draw-line')
84743                         return;
84744                     else if (mode.id === 'select')
84745                         return continueTo(chooseCategoryRoad);
84746                     else
84747                         return chapter.restart();
84748                 });
84749
84750                 function continueTo(nextStep) {
84751                     context.on('enter.intro', null);
84752                     nextStep();
84753                 }
84754             }
84755
84756
84757             function chooseCategoryRoad() {
84758                 if (context.mode().id !== 'select') return chapter.restart();
84759
84760                 context.on('exit.intro', function() {
84761                     return chapter.restart();
84762                 });
84763
84764                 var button = d3_select('.preset-category-road_minor .preset-list-button');
84765                 if (button.empty()) return chapter.restart();
84766
84767                 // disallow scrolling
84768                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84769
84770                 timeout(function() {
84771                     // reset pane, in case user somehow happened to change it..
84772                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84773
84774                     reveal(button.node(),
84775                         t('intro.lines.choose_category_road', { category: roadCategory.name() })
84776                     );
84777
84778                     button.on('click.intro', function() {
84779                         continueTo(choosePresetResidential);
84780                     });
84781
84782                 }, 400);  // after editor pane visible
84783
84784                 function continueTo(nextStep) {
84785                     d3_select('.inspector-wrap').on('wheel.intro', null);
84786                     d3_select('.preset-list-button').on('click.intro', null);
84787                     context.on('exit.intro', null);
84788                     nextStep();
84789                 }
84790             }
84791
84792
84793             function choosePresetResidential() {
84794                 if (context.mode().id !== 'select') return chapter.restart();
84795
84796                 context.on('exit.intro', function() {
84797                     return chapter.restart();
84798                 });
84799
84800                 var subgrid = d3_select('.preset-category-road_minor .subgrid');
84801                 if (subgrid.empty()) return chapter.restart();
84802
84803                 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
84804                     .on('click.intro', function() {
84805                         continueTo(retryPresetResidential);
84806                     });
84807
84808                 subgrid.selectAll('.preset-highway-residential .preset-list-button')
84809                     .on('click.intro', function() {
84810                         continueTo(nameRoad);
84811                     });
84812
84813                 timeout(function() {
84814                     reveal(subgrid.node(),
84815                         t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
84816                         { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
84817                     );
84818                 }, 300);
84819
84820                 function continueTo(nextStep) {
84821                     d3_select('.preset-list-button').on('click.intro', null);
84822                     context.on('exit.intro', null);
84823                     nextStep();
84824                 }
84825             }
84826
84827
84828             // selected wrong road type
84829             function retryPresetResidential() {
84830                 if (context.mode().id !== 'select') return chapter.restart();
84831
84832                 context.on('exit.intro', function() {
84833                     return chapter.restart();
84834                 });
84835
84836                 // disallow scrolling
84837                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84838
84839                 timeout(function() {
84840                     var button = d3_select('.entity-editor-pane .preset-list-button');
84841
84842                     reveal(button.node(),
84843                         t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
84844                     );
84845
84846                     button.on('click.intro', function() {
84847                         continueTo(chooseCategoryRoad);
84848                     });
84849
84850                 }, 500);
84851
84852                 function continueTo(nextStep) {
84853                     d3_select('.inspector-wrap').on('wheel.intro', null);
84854                     d3_select('.preset-list-button').on('click.intro', null);
84855                     context.on('exit.intro', null);
84856                     nextStep();
84857                 }
84858             }
84859
84860
84861             function nameRoad() {
84862                 context.on('exit.intro', function() {
84863                     continueTo(didNameRoad);
84864                 });
84865
84866                 timeout(function() {
84867                     reveal('.entity-editor-pane',
84868                         t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
84869                         { tooltipClass: 'intro-lines-name_road' }
84870                     );
84871                 }, 500);
84872
84873                 function continueTo(nextStep) {
84874                     context.on('exit.intro', null);
84875                     nextStep();
84876                 }
84877             }
84878
84879
84880             function didNameRoad() {
84881                 context.history().checkpoint('doneAddLine');
84882
84883                 timeout(function() {
84884                     reveal('#surface', t('intro.lines.did_name_road'), {
84885                         buttonText: t('intro.ok'),
84886                         buttonCallback: function() { continueTo(updateLine); }
84887                     });
84888                 }, 500);
84889
84890                 function continueTo(nextStep) {
84891                     nextStep();
84892                 }
84893             }
84894
84895
84896             function updateLine() {
84897                 context.history().reset('doneAddLine');
84898                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84899                     return chapter.restart();
84900                 }
84901
84902                 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
84903                 if (msec) { reveal(null, null, { duration: 0 }); }
84904                 context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
84905
84906                 timeout(function() {
84907                     var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84908                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84909                     var advance = function() { continueTo(addNode); };
84910
84911                     reveal(box, t('intro.lines.update_line'),
84912                         { buttonText: t('intro.ok'), buttonCallback: advance }
84913                     );
84914
84915                     context.map().on('move.intro drawn.intro', function() {
84916                         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84917                         var box = pad$2(woodRoadDragMidpoint, padding, context);
84918                         reveal(box, t('intro.lines.update_line'),
84919                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84920                         );
84921                     });
84922                 }, msec + 100);
84923
84924                 function continueTo(nextStep) {
84925                     context.map().on('move.intro drawn.intro', null);
84926                     nextStep();
84927                 }
84928             }
84929
84930
84931             function addNode() {
84932                 context.history().reset('doneAddLine');
84933                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84934                     return chapter.restart();
84935                 }
84936
84937                 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84938                 var box = pad$2(woodRoadAddNode, padding, context);
84939                 reveal(box, t('intro.lines.add_node'));
84940
84941                 context.map().on('move.intro drawn.intro', function() {
84942                     var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84943                     var box = pad$2(woodRoadAddNode, padding, context);
84944                     reveal(box, t('intro.lines.add_node'), { duration: 0 });
84945                 });
84946
84947                 context.history().on('change.intro', function(changed) {
84948                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84949                         return continueTo(updateLine);
84950                     }
84951                     if (changed.created().length === 1) {
84952                         timeout(function() { continueTo(startDragEndpoint); }, 500);
84953                     }
84954                 });
84955
84956                 context.on('enter.intro', function(mode) {
84957                     if (mode.id !== 'select') {
84958                         continueTo(updateLine);
84959                     }
84960                 });
84961
84962                 function continueTo(nextStep) {
84963                     context.map().on('move.intro drawn.intro', null);
84964                     context.history().on('change.intro', null);
84965                     context.on('enter.intro', null);
84966                     nextStep();
84967                 }
84968             }
84969
84970
84971             function startDragEndpoint() {
84972                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84973                     return continueTo(updateLine);
84974                 }
84975                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84976                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84977                 reveal(box, t('intro.lines.start_drag_endpoint'));
84978
84979                 context.map().on('move.intro drawn.intro', function() {
84980                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84981                         return continueTo(updateLine);
84982                     }
84983                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84984                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84985                     reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
84986
84987                     var entity = context.entity(woodRoadEndID);
84988                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
84989                         continueTo(finishDragEndpoint);
84990                     }
84991                 });
84992
84993                 function continueTo(nextStep) {
84994                     context.map().on('move.intro drawn.intro', null);
84995                     nextStep();
84996                 }
84997             }
84998
84999
85000             function finishDragEndpoint() {
85001                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85002                     return continueTo(updateLine);
85003                 }
85004
85005                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85006                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85007                 reveal(box, t('intro.lines.finish_drag_endpoint'));
85008
85009                 context.map().on('move.intro drawn.intro', function() {
85010                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85011                         return continueTo(updateLine);
85012                     }
85013                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85014                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85015                     reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
85016
85017                     var entity = context.entity(woodRoadEndID);
85018                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
85019                         continueTo(startDragEndpoint);
85020                     }
85021                 });
85022
85023                 context.on('enter.intro', function() {
85024                     continueTo(startDragMidpoint);
85025                 });
85026
85027                 function continueTo(nextStep) {
85028                     context.map().on('move.intro drawn.intro', null);
85029                     context.on('enter.intro', null);
85030                     nextStep();
85031                 }
85032             }
85033
85034
85035             function startDragMidpoint() {
85036                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85037                     return continueTo(updateLine);
85038                 }
85039                 if (context.selectedIDs().indexOf(woodRoadID) === -1) {
85040                     context.enter(modeSelect(context, [woodRoadID]));
85041                 }
85042
85043                 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85044                 var box = pad$2(woodRoadDragMidpoint, padding, context);
85045                 reveal(box, t('intro.lines.start_drag_midpoint'));
85046
85047                 context.map().on('move.intro drawn.intro', function() {
85048                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85049                         return continueTo(updateLine);
85050                     }
85051                     var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85052                     var box = pad$2(woodRoadDragMidpoint, padding, context);
85053                     reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
85054                 });
85055
85056                 context.history().on('change.intro', function(changed) {
85057                     if (changed.created().length === 1) {
85058                         continueTo(continueDragMidpoint);
85059                     }
85060                 });
85061
85062                 context.on('enter.intro', function(mode) {
85063                     if (mode.id !== 'select') {
85064                         // keep Wood Road selected so midpoint triangles are drawn..
85065                         context.enter(modeSelect(context, [woodRoadID]));
85066                     }
85067                 });
85068
85069                 function continueTo(nextStep) {
85070                     context.map().on('move.intro drawn.intro', null);
85071                     context.history().on('change.intro', null);
85072                     context.on('enter.intro', null);
85073                     nextStep();
85074                 }
85075             }
85076
85077
85078             function continueDragMidpoint() {
85079                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85080                     return continueTo(updateLine);
85081                 }
85082
85083                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85084                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85085                 box.height += 400;
85086
85087                 var advance = function() {
85088                     context.history().checkpoint('doneUpdateLine');
85089                     continueTo(deleteLines);
85090                 };
85091
85092                 reveal(box, t('intro.lines.continue_drag_midpoint'),
85093                     { buttonText: t('intro.ok'), buttonCallback: advance }
85094                 );
85095
85096                 context.map().on('move.intro drawn.intro', function() {
85097                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85098                         return continueTo(updateLine);
85099                     }
85100                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85101                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85102                     box.height += 400;
85103                     reveal(box, t('intro.lines.continue_drag_midpoint'),
85104                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85105                     );
85106                 });
85107
85108                 function continueTo(nextStep) {
85109                     context.map().on('move.intro drawn.intro', null);
85110                     nextStep();
85111                 }
85112             }
85113
85114
85115             function deleteLines() {
85116                 context.history().reset('doneUpdateLine');
85117                 context.enter(modeBrowse(context));
85118
85119                 if (!context.hasEntity(washingtonStreetID) ||
85120                     !context.hasEntity(twelfthAvenueID) ||
85121                     !context.hasEntity(eleventhAvenueEndID)) {
85122                     return chapter.restart();
85123                 }
85124
85125                 var msec = transitionTime(deleteLinesLoc, context.map().center());
85126                 if (msec) { reveal(null, null, { duration: 0 }); }
85127                 context.map().centerZoomEase(deleteLinesLoc, 18, msec);
85128
85129                 timeout(function() {
85130                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85131                     var box = pad$2(deleteLinesLoc, padding, context);
85132                     box.top -= 200;
85133                     box.height += 400;
85134                     var advance = function() { continueTo(rightClickIntersection); };
85135
85136                     reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85137                         { buttonText: t('intro.ok'), buttonCallback: advance }
85138                     );
85139
85140                     context.map().on('move.intro drawn.intro', function() {
85141                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85142                         var box = pad$2(deleteLinesLoc, padding, context);
85143                         box.top -= 200;
85144                         box.height += 400;
85145                         reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85146                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85147                         );
85148                     });
85149
85150                     context.history().on('change.intro', function() {
85151                         timeout(function() {
85152                             continueTo(deleteLines);
85153                         }, 500);  // after any transition (e.g. if user deleted intersection)
85154                     });
85155
85156                 }, msec + 100);
85157
85158                 function continueTo(nextStep) {
85159                     context.map().on('move.intro drawn.intro', null);
85160                     context.history().on('change.intro', null);
85161                     nextStep();
85162                 }
85163             }
85164
85165
85166             function rightClickIntersection() {
85167                 context.history().reset('doneUpdateLine');
85168                 context.enter(modeBrowse(context));
85169
85170                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85171
85172                 timeout(function() {
85173                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85174                     var box = pad$2(eleventhAvenueEnd, padding, context);
85175                     reveal(box, t('intro.lines.rightclick_intersection',
85176                         { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
85177                     );
85178
85179                     context.map().on('move.intro drawn.intro', function() {
85180                         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85181                         var box = pad$2(eleventhAvenueEnd, padding, context);
85182                         reveal(box, t('intro.lines.rightclick_intersection',
85183                             { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
85184                             { duration: 0 }
85185                         );
85186                     });
85187
85188                     context.on('enter.intro', function(mode) {
85189                         if (mode.id !== 'select') return;
85190                         var ids = context.selectedIDs();
85191                         if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
85192
85193                         timeout(function() {
85194                             var node = selectMenuItem('split').node();
85195                             if (!node) return;
85196                             continueTo(splitIntersection);
85197                         }, 300);  // after menu visible
85198                     });
85199
85200                     context.history().on('change.intro', function() {
85201                         timeout(function() {
85202                             continueTo(deleteLines);
85203                         }, 300);  // after any transition (e.g. if user deleted intersection)
85204                     });
85205
85206                 }, 600);
85207
85208                 function continueTo(nextStep) {
85209                     context.map().on('move.intro drawn.intro', null);
85210                     context.on('enter.intro', null);
85211                     context.history().on('change.intro', null);
85212                     nextStep();
85213                 }
85214             }
85215
85216
85217             function splitIntersection() {
85218                 if (!context.hasEntity(washingtonStreetID) ||
85219                     !context.hasEntity(twelfthAvenueID) ||
85220                     !context.hasEntity(eleventhAvenueEndID)) {
85221                     return continueTo(deleteLines);
85222                 }
85223
85224                 var node = selectMenuItem('split').node();
85225                 if (!node) { return continueTo(rightClickIntersection); }
85226
85227                 var wasChanged = false;
85228                 var menuCoords = context.map().mouseCoordinates();
85229                 _washingtonSegmentID = null;
85230
85231                 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85232                     { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
85233                 );
85234
85235                 context.map().on('move.intro drawn.intro', function() {
85236                     var node = selectMenuItem('split').node();
85237                     if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
85238
85239                     revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85240                         { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
85241                         { duration: 0 }
85242                     );
85243                 });
85244
85245                 context.history().on('change.intro', function(changed) {
85246                     wasChanged = true;
85247                     timeout(function() {
85248                         if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
85249                             _washingtonSegmentID = changed.created()[0].id;
85250                             continueTo(didSplit);
85251                         } else {
85252                             _washingtonSegmentID = null;
85253                             continueTo(retrySplit);
85254                         }
85255                     }, 300);  // after any transition (e.g. if user deleted intersection)
85256                 });
85257
85258                 function continueTo(nextStep) {
85259                     context.map().on('move.intro drawn.intro', null);
85260                     context.history().on('change.intro', null);
85261                     nextStep();
85262                 }
85263             }
85264
85265
85266             function retrySplit() {
85267                 context.enter(modeBrowse(context));
85268                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85269                 var advance = function() { continueTo(rightClickIntersection); };
85270
85271                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85272                 var box = pad$2(eleventhAvenueEnd, padding, context);
85273                 reveal(box, t('intro.lines.retry_split'),
85274                     { buttonText: t('intro.ok'), buttonCallback: advance }
85275                 );
85276
85277                 context.map().on('move.intro drawn.intro', function() {
85278                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85279                     var box = pad$2(eleventhAvenueEnd, padding, context);
85280                     reveal(box, t('intro.lines.retry_split'),
85281                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85282                     );
85283                 });
85284
85285                 function continueTo(nextStep) {
85286                     context.map().on('move.intro drawn.intro', null);
85287                     nextStep();
85288                 }
85289             }
85290
85291
85292             function didSplit() {
85293                 if (!_washingtonSegmentID ||
85294                     !context.hasEntity(_washingtonSegmentID) ||
85295                     !context.hasEntity(washingtonStreetID) ||
85296                     !context.hasEntity(twelfthAvenueID) ||
85297                     !context.hasEntity(eleventhAvenueEndID)) {
85298                     return continueTo(rightClickIntersection);
85299                 }
85300
85301                 var ids = context.selectedIDs();
85302                 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
85303                 var street = t('intro.graph.name.washington-street');
85304
85305                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85306                 var box = pad$2(twelfthAvenue, padding, context);
85307                 box.width = box.width / 2;
85308                 reveal(box, t(string, { street1: street, street2: street }),
85309                     { duration: 500 }
85310                 );
85311
85312                 timeout(function() {
85313                     context.map().centerZoomEase(twelfthAvenue, 18, 500);
85314
85315                     context.map().on('move.intro drawn.intro', function() {
85316                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85317                         var box = pad$2(twelfthAvenue, padding, context);
85318                         box.width = box.width / 2;
85319                         reveal(box, t(string, { street1: street, street2: street }),
85320                             { duration: 0 }
85321                         );
85322                     });
85323                 }, 600);  // after initial reveal and curtain cut
85324
85325                 context.on('enter.intro', function() {
85326                     var ids = context.selectedIDs();
85327                     if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
85328                         continueTo(multiSelect);
85329                     }
85330                 });
85331
85332                 context.history().on('change.intro', function() {
85333                     if (!_washingtonSegmentID ||
85334                         !context.hasEntity(_washingtonSegmentID) ||
85335                         !context.hasEntity(washingtonStreetID) ||
85336                         !context.hasEntity(twelfthAvenueID) ||
85337                         !context.hasEntity(eleventhAvenueEndID)) {
85338                         return continueTo(rightClickIntersection);
85339                     }
85340                 });
85341
85342                 function continueTo(nextStep) {
85343                     context.map().on('move.intro drawn.intro', null);
85344                     context.on('enter.intro', null);
85345                     context.history().on('change.intro', null);
85346                     nextStep();
85347                 }
85348             }
85349
85350
85351             function multiSelect() {
85352                 if (!_washingtonSegmentID ||
85353                     !context.hasEntity(_washingtonSegmentID) ||
85354                     !context.hasEntity(washingtonStreetID) ||
85355                     !context.hasEntity(twelfthAvenueID) ||
85356                     !context.hasEntity(eleventhAvenueEndID)) {
85357                     return continueTo(rightClickIntersection);
85358                 }
85359
85360                 var ids = context.selectedIDs();
85361                 var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
85362                 var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
85363
85364                 if (hasWashington && hasTwelfth) {
85365                     return continueTo(multiRightClick);
85366                 } else if (!hasWashington && !hasTwelfth) {
85367                     return continueTo(didSplit);
85368                 }
85369
85370                 context.map().centerZoomEase(twelfthAvenue, 18, 500);
85371
85372                 timeout(function() {
85373                     var selected, other, padding, box;
85374                     if (hasWashington) {
85375                         selected = t('intro.graph.name.washington-street');
85376                         other = t('intro.graph.name.12th-avenue');
85377                         padding = 60 * Math.pow(2, context.map().zoom() - 18);
85378                         box = pad$2(twelfthAvenueEnd, padding, context);
85379                         box.width *= 3;
85380                     } else {
85381                         selected = t('intro.graph.name.12th-avenue');
85382                         other = t('intro.graph.name.washington-street');
85383                         padding = 200 * Math.pow(2, context.map().zoom() - 18);
85384                         box = pad$2(twelfthAvenue, padding, context);
85385                         box.width /= 2;
85386                     }
85387
85388                     reveal(box,
85389                         t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
85390                     );
85391
85392                     context.map().on('move.intro drawn.intro', function() {
85393                         if (hasWashington) {
85394                             selected = t('intro.graph.name.washington-street');
85395                             other = t('intro.graph.name.12th-avenue');
85396                             padding = 60 * Math.pow(2, context.map().zoom() - 18);
85397                             box = pad$2(twelfthAvenueEnd, padding, context);
85398                             box.width *= 3;
85399                         } else {
85400                             selected = t('intro.graph.name.12th-avenue');
85401                             other = t('intro.graph.name.washington-street');
85402                             padding = 200 * Math.pow(2, context.map().zoom() - 18);
85403                             box = pad$2(twelfthAvenue, padding, context);
85404                             box.width /= 2;
85405                         }
85406
85407                         reveal(box,
85408                             t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
85409                             { duration: 0 }
85410                         );
85411                     });
85412
85413                     context.on('enter.intro', function() {
85414                         continueTo(multiSelect);
85415                     });
85416
85417                     context.history().on('change.intro', function() {
85418                         if (!_washingtonSegmentID ||
85419                             !context.hasEntity(_washingtonSegmentID) ||
85420                             !context.hasEntity(washingtonStreetID) ||
85421                             !context.hasEntity(twelfthAvenueID) ||
85422                             !context.hasEntity(eleventhAvenueEndID)) {
85423                             return continueTo(rightClickIntersection);
85424                         }
85425                     });
85426                 }, 600);
85427
85428                 function continueTo(nextStep) {
85429                     context.map().on('move.intro drawn.intro', null);
85430                     context.on('enter.intro', null);
85431                     context.history().on('change.intro', null);
85432                     nextStep();
85433                 }
85434             }
85435
85436
85437             function multiRightClick() {
85438                 if (!_washingtonSegmentID ||
85439                     !context.hasEntity(_washingtonSegmentID) ||
85440                     !context.hasEntity(washingtonStreetID) ||
85441                     !context.hasEntity(twelfthAvenueID) ||
85442                     !context.hasEntity(eleventhAvenueEndID)) {
85443                     return continueTo(rightClickIntersection);
85444                 }
85445
85446                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85447                 var box = pad$2(twelfthAvenue, padding, context);
85448                 reveal(box, t('intro.lines.multi_rightclick'));
85449
85450                 context.map().on('move.intro drawn.intro', function() {
85451                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85452                     var box = pad$2(twelfthAvenue, padding, context);
85453                     reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
85454                 });
85455
85456                 d3_select(window).on('click.intro contextmenu.intro', function() {
85457                     timeout(function() {
85458                         var ids = context.selectedIDs();
85459                         if (ids.length === 2 &&
85460                             ids.indexOf(twelfthAvenueID) !== -1 &&
85461                             ids.indexOf(_washingtonSegmentID) !== -1) {
85462                                 var node = selectMenuItem('delete').node();
85463                                 if (!node) return;
85464                                 continueTo(multiDelete);
85465                         } else if (ids.length === 1 &&
85466                             ids.indexOf(_washingtonSegmentID) !== -1) {
85467                             return continueTo(multiSelect);
85468                         } else {
85469                             return continueTo(didSplit);
85470                         }
85471                     }, 300);  // after edit menu visible
85472                 }, true);
85473
85474                 context.history().on('change.intro', function() {
85475                     if (!_washingtonSegmentID ||
85476                         !context.hasEntity(_washingtonSegmentID) ||
85477                         !context.hasEntity(washingtonStreetID) ||
85478                         !context.hasEntity(twelfthAvenueID) ||
85479                         !context.hasEntity(eleventhAvenueEndID)) {
85480                         return continueTo(rightClickIntersection);
85481                     }
85482                 });
85483
85484                 function continueTo(nextStep) {
85485                     context.map().on('move.intro drawn.intro', null);
85486                     d3_select(window).on('click.intro contextmenu.intro', null, true);
85487                     context.history().on('change.intro', null);
85488                     nextStep();
85489                 }
85490             }
85491
85492
85493             function multiDelete() {
85494                 if (!_washingtonSegmentID ||
85495                     !context.hasEntity(_washingtonSegmentID) ||
85496                     !context.hasEntity(washingtonStreetID) ||
85497                     !context.hasEntity(twelfthAvenueID) ||
85498                     !context.hasEntity(eleventhAvenueEndID)) {
85499                     return continueTo(rightClickIntersection);
85500                 }
85501
85502                 var node = selectMenuItem('delete').node();
85503                 if (!node) return continueTo(multiRightClick);
85504
85505                 var menuCoords = context.map().mouseCoordinates();
85506                 revealEditMenu(menuCoords,
85507                     t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
85508                 );
85509
85510                 context.map().on('move.intro drawn.intro', function() {
85511                     revealEditMenu(menuCoords,
85512                         t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
85513                         { duration: 0 }
85514                     );
85515                 });
85516
85517                 context.on('exit.intro', function() {
85518                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85519                         return continueTo(multiSelect);  // left select mode but roads still exist
85520                     }
85521                 });
85522
85523                 context.history().on('change.intro', function() {
85524                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85525                         continueTo(retryDelete);         // changed something but roads still exist
85526                     } else {
85527                         continueTo(play);
85528                     }
85529                 });
85530
85531                 function continueTo(nextStep) {
85532                     context.map().on('move.intro drawn.intro', null);
85533                     context.on('exit.intro', null);
85534                     context.history().on('change.intro', null);
85535                     nextStep();
85536                 }
85537             }
85538
85539
85540             function retryDelete() {
85541                 context.enter(modeBrowse(context));
85542
85543                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85544                 var box = pad$2(twelfthAvenue, padding, context);
85545                 reveal(box, t('intro.lines.retry_delete'), {
85546                     buttonText: t('intro.ok'),
85547                     buttonCallback: function() { continueTo(multiSelect); }
85548                 });
85549
85550                 function continueTo(nextStep) {
85551                     nextStep();
85552                 }
85553             }
85554
85555
85556             function play() {
85557                 dispatch$1.call('done');
85558                 reveal('#id-container',
85559                     t('intro.lines.play', { next: t('intro.buildings.title') }), {
85560                         tooltipBox: '.intro-nav-wrap .chapter-building',
85561                         buttonText: t('intro.ok'),
85562                         buttonCallback: function() { reveal('#id-container'); }
85563                     }
85564                 );
85565            }
85566
85567
85568             chapter.enter = function() {
85569                 addLine();
85570             };
85571
85572
85573             chapter.exit = function() {
85574                 timeouts.forEach(window.clearTimeout);
85575                 d3_select(window).on('mousedown.intro', null, true);
85576                 context.on('enter.intro exit.intro', null);
85577                 context.map().on('move.intro drawn.intro', null);
85578                 context.history().on('change.intro', null);
85579                 d3_select('.inspector-wrap').on('wheel.intro', null);
85580                 d3_select('.preset-list-button').on('click.intro', null);
85581             };
85582
85583
85584             chapter.restart = function() {
85585                 chapter.exit();
85586                 chapter.enter();
85587             };
85588
85589
85590             return utilRebind(chapter, dispatch$1, 'on');
85591         }
85592
85593         function uiIntroBuilding(context, reveal) {
85594             var dispatch$1 = dispatch('done');
85595             var house = [-85.62815, 41.95638];
85596             var tank = [-85.62732, 41.95347];
85597             var buildingCatetory = context.presets().item('category-building');
85598             var housePreset = context.presets().item('building/house');
85599             var tankPreset = context.presets().item('man_made/storage_tank');
85600             var timeouts = [];
85601             var _houseID = null;
85602             var _tankID = null;
85603
85604
85605             var chapter = {
85606                 title: 'intro.buildings.title'
85607             };
85608
85609
85610             function timeout(f, t) {
85611                 timeouts.push(window.setTimeout(f, t));
85612             }
85613
85614
85615             function eventCancel() {
85616                 event.stopPropagation();
85617                 event.preventDefault();
85618             }
85619
85620
85621             function revealHouse(center, text, options) {
85622                 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
85623                 var box = pad$2(center, padding, context);
85624                 reveal(box, text, options);
85625             }
85626
85627
85628             function revealTank(center, text, options) {
85629                 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
85630                 var box = pad$2(center, padding, context);
85631                 reveal(box, text, options);
85632             }
85633
85634
85635             function revealEditMenu(loc, text, options) {
85636                 var rect = context.surfaceRect();
85637                 var point = context.curtainProjection(loc);
85638                 var pad = 40;
85639                 var width = 250 + (2 * pad);
85640                 var height = 350;
85641                 var startX = rect.left + point[0];
85642                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
85643                 var box = {
85644                     left: left,
85645                     top: point[1] + rect.top - 60,
85646                     width: width,
85647                     height: height
85648                 };
85649                 reveal(box, text, options);
85650             }
85651
85652
85653             function addHouse() {
85654                 context.enter(modeBrowse(context));
85655                 context.history().reset('initial');
85656                 _houseID = null;
85657
85658                 var msec = transitionTime(house, context.map().center());
85659                 if (msec) { reveal(null, null, { duration: 0 }); }
85660                 context.map().centerZoomEase(house, 19, msec);
85661
85662                 timeout(function() {
85663                     var tooltip = reveal('button.add-area',
85664                         t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
85665
85666                     tooltip.selectAll('.tooltip-inner')
85667                         .insert('svg', 'span')
85668                         .attr('class', 'tooltip-illustration')
85669                         .append('use')
85670                         .attr('xlink:href', '#iD-graphic-buildings');
85671
85672                     context.on('enter.intro', function(mode) {
85673                         if (mode.id !== 'add-area') return;
85674                         continueTo(startHouse);
85675                     });
85676                 }, msec + 100);
85677
85678                 function continueTo(nextStep) {
85679                     context.on('enter.intro', null);
85680                     nextStep();
85681                 }
85682             }
85683
85684
85685             function startHouse() {
85686                 if (context.mode().id !== 'add-area') {
85687                     return continueTo(addHouse);
85688                 }
85689
85690                 _houseID = null;
85691                 context.map().zoomEase(20, 500);
85692
85693                 timeout(function() {
85694                     revealHouse(house, t('intro.buildings.start_building'));
85695
85696                     context.map().on('move.intro drawn.intro', function() {
85697                         revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
85698                     });
85699
85700                     context.on('enter.intro', function(mode) {
85701                         if (mode.id !== 'draw-area') return chapter.restart();
85702                         continueTo(continueHouse);
85703                     });
85704
85705                 }, 550);  // after easing
85706
85707                 function continueTo(nextStep) {
85708                     context.map().on('move.intro drawn.intro', null);
85709                     context.on('enter.intro', null);
85710                     nextStep();
85711                 }
85712             }
85713
85714
85715             function continueHouse() {
85716                 if (context.mode().id !== 'draw-area') {
85717                     return continueTo(addHouse);
85718                 }
85719
85720                 _houseID = null;
85721
85722                 revealHouse(house, t('intro.buildings.continue_building'));
85723
85724                 context.map().on('move.intro drawn.intro', function() {
85725                     revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
85726                 });
85727
85728                 context.on('enter.intro', function(mode) {
85729                     if (mode.id === 'draw-area') {
85730                         return;
85731                     } else if (mode.id === 'select') {
85732                         var graph = context.graph();
85733                         var way = context.entity(context.selectedIDs()[0]);
85734                         var nodes = graph.childNodes(way);
85735                         var points = utilArrayUniq(nodes)
85736                             .map(function(n) { return context.projection(n.loc); });
85737
85738                         if (isMostlySquare(points)) {
85739                             _houseID = way.id;
85740                             return continueTo(chooseCategoryBuilding);
85741                         } else {
85742                             return continueTo(retryHouse);
85743                         }
85744
85745                     } else {
85746                         return chapter.restart();
85747                     }
85748                 });
85749
85750                 function continueTo(nextStep) {
85751                     context.map().on('move.intro drawn.intro', null);
85752                     context.on('enter.intro', null);
85753                     nextStep();
85754                 }
85755             }
85756
85757
85758             function retryHouse() {
85759                 var onClick = function() { continueTo(addHouse); };
85760
85761                 revealHouse(house, t('intro.buildings.retry_building'),
85762                     { buttonText: t('intro.ok'), buttonCallback: onClick }
85763                 );
85764
85765                 context.map().on('move.intro drawn.intro', function() {
85766                     revealHouse(house, t('intro.buildings.retry_building'),
85767                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
85768                     );
85769                 });
85770
85771                 function continueTo(nextStep) {
85772                     context.map().on('move.intro drawn.intro', null);
85773                     nextStep();
85774                 }
85775             }
85776
85777
85778             function chooseCategoryBuilding() {
85779                 if (!_houseID || !context.hasEntity(_houseID)) {
85780                     return addHouse();
85781                 }
85782                 var ids = context.selectedIDs();
85783                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85784                     context.enter(modeSelect(context, [_houseID]));
85785                 }
85786
85787                 // disallow scrolling
85788                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85789
85790                 timeout(function() {
85791                     // reset pane, in case user somehow happened to change it..
85792                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85793
85794                     var button = d3_select('.preset-category-building .preset-list-button');
85795
85796                     reveal(button.node(),
85797                         t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
85798                     );
85799
85800                     button.on('click.intro', function() {
85801                         button.on('click.intro', null);
85802                         continueTo(choosePresetHouse);
85803                     });
85804
85805                 }, 400);  // after preset list pane visible..
85806
85807
85808                 context.on('enter.intro', function(mode) {
85809                     if (!_houseID || !context.hasEntity(_houseID)) {
85810                         return continueTo(addHouse);
85811                     }
85812                     var ids = context.selectedIDs();
85813                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85814                         return continueTo(chooseCategoryBuilding);
85815                     }
85816                 });
85817
85818                 function continueTo(nextStep) {
85819                     d3_select('.inspector-wrap').on('wheel.intro', null);
85820                     d3_select('.preset-list-button').on('click.intro', null);
85821                     context.on('enter.intro', null);
85822                     nextStep();
85823                 }
85824             }
85825
85826
85827             function choosePresetHouse() {
85828                 if (!_houseID || !context.hasEntity(_houseID)) {
85829                     return addHouse();
85830                 }
85831                 var ids = context.selectedIDs();
85832                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85833                     context.enter(modeSelect(context, [_houseID]));
85834                 }
85835
85836                 // disallow scrolling
85837                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85838
85839                 timeout(function() {
85840                     // reset pane, in case user somehow happened to change it..
85841                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85842
85843                     var button = d3_select('.preset-building-house .preset-list-button');
85844
85845                     reveal(button.node(),
85846                         t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
85847                         { duration: 300 }
85848                     );
85849
85850                     button.on('click.intro', function() {
85851                         button.on('click.intro', null);
85852                         continueTo(closeEditorHouse);
85853                     });
85854
85855                 }, 400);  // after preset list pane visible..
85856
85857                 context.on('enter.intro', function(mode) {
85858                     if (!_houseID || !context.hasEntity(_houseID)) {
85859                         return continueTo(addHouse);
85860                     }
85861                     var ids = context.selectedIDs();
85862                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85863                         return continueTo(chooseCategoryBuilding);
85864                     }
85865                 });
85866
85867                 function continueTo(nextStep) {
85868                     d3_select('.inspector-wrap').on('wheel.intro', null);
85869                     d3_select('.preset-list-button').on('click.intro', null);
85870                     context.on('enter.intro', null);
85871                     nextStep();
85872                 }
85873             }
85874
85875
85876             function closeEditorHouse() {
85877                 if (!_houseID || !context.hasEntity(_houseID)) {
85878                     return addHouse();
85879                 }
85880                 var ids = context.selectedIDs();
85881                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85882                     context.enter(modeSelect(context, [_houseID]));
85883                 }
85884
85885                 context.history().checkpoint('hasHouse');
85886
85887                 context.on('exit.intro', function() {
85888                     continueTo(rightClickHouse);
85889                 });
85890
85891                 timeout(function() {
85892                     reveal('.entity-editor-pane',
85893                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
85894                     );
85895                 }, 500);
85896
85897                 function continueTo(nextStep) {
85898                     context.on('exit.intro', null);
85899                     nextStep();
85900                 }
85901             }
85902
85903
85904             function rightClickHouse() {
85905                 if (!_houseID) return chapter.restart();
85906
85907                 context.enter(modeBrowse(context));
85908                 context.history().reset('hasHouse');
85909                 var zoom = context.map().zoom();
85910                 if (zoom < 20) {
85911                     zoom = 20;
85912                 }
85913                 context.map().centerZoomEase(house, zoom, 500);
85914
85915                 context.on('enter.intro', function(mode) {
85916                     if (mode.id !== 'select') return;
85917                     var ids = context.selectedIDs();
85918                     if (ids.length !== 1 || ids[0] !== _houseID) return;
85919
85920                     timeout(function() {
85921                         var node = selectMenuItem('orthogonalize').node();
85922                         if (!node) return;
85923                         continueTo(clickSquare);
85924                     }, 300);  // after menu visible
85925                 });
85926
85927                 context.map().on('move.intro drawn.intro', function() {
85928                     revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
85929                 });
85930
85931                 context.history().on('change.intro', function() {
85932                     continueTo(rightClickHouse);
85933                 });
85934
85935                 function continueTo(nextStep) {
85936                     context.on('enter.intro', null);
85937                     context.map().on('move.intro drawn.intro', null);
85938                     context.history().on('change.intro', null);
85939                     nextStep();
85940                 }
85941             }
85942
85943
85944             function clickSquare() {
85945                 if (!_houseID) return chapter.restart();
85946                 var entity = context.hasEntity(_houseID);
85947                 if (!entity) return continueTo(rightClickHouse);
85948
85949                 var node = selectMenuItem('orthogonalize').node();
85950                 if (!node) { return continueTo(rightClickHouse); }
85951
85952                 var wasChanged = false;
85953                 var menuCoords = context.map().mouseCoordinates();
85954
85955                 revealEditMenu(menuCoords,
85956                     t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
85957                 );
85958
85959                 context.on('enter.intro', function(mode) {
85960                     if (mode.id === 'browse') {
85961                         continueTo(rightClickHouse);
85962                     } else if (mode.id === 'move' || mode.id === 'rotate') {
85963                         continueTo(retryClickSquare);
85964                     }
85965                 });
85966
85967                 context.map().on('move.intro drawn.intro', function() {
85968                     var node = selectMenuItem('orthogonalize').node();
85969                     if (!wasChanged && !node) { return continueTo(rightClickHouse); }
85970
85971                     revealEditMenu(menuCoords,
85972                         t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
85973                         { duration: 0 }
85974                     );
85975                 });
85976
85977                 context.history().on('change.intro', function() {
85978                     wasChanged = true;
85979                     context.history().on('change.intro', null);
85980
85981                     // Something changed.  Wait for transition to complete and check undo annotation.
85982                     timeout(function() {
85983                         if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
85984                             continueTo(doneSquare);
85985                         } else {
85986                             continueTo(retryClickSquare);
85987                         }
85988                     }, 500);  // after transitioned actions
85989                 });
85990
85991                 function continueTo(nextStep) {
85992                     context.on('enter.intro', null);
85993                     context.map().on('move.intro drawn.intro', null);
85994                     context.history().on('change.intro', null);
85995                     nextStep();
85996                 }
85997             }
85998
85999
86000             function retryClickSquare() {
86001                 context.enter(modeBrowse(context));
86002
86003                 revealHouse(house, t('intro.buildings.retry_square'), {
86004                     buttonText: t('intro.ok'),
86005                     buttonCallback: function() { continueTo(rightClickHouse); }
86006                 });
86007
86008                 function continueTo(nextStep) {
86009                     nextStep();
86010                 }
86011             }
86012
86013
86014             function doneSquare() {
86015                 context.history().checkpoint('doneSquare');
86016
86017                 revealHouse(house, t('intro.buildings.done_square'), {
86018                     buttonText: t('intro.ok'),
86019                     buttonCallback: function() { continueTo(addTank); }
86020                 });
86021
86022                 function continueTo(nextStep) {
86023                     nextStep();
86024                 }
86025             }
86026
86027
86028             function addTank() {
86029                 context.enter(modeBrowse(context));
86030                 context.history().reset('doneSquare');
86031                 _tankID = null;
86032
86033                 var msec = transitionTime(tank, context.map().center());
86034                 if (msec) { reveal(null, null, { duration: 0 }); }
86035                 context.map().centerZoomEase(tank, 19.5, msec);
86036
86037                 timeout(function() {
86038                     reveal('button.add-area',
86039                         t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
86040                     );
86041
86042                     context.on('enter.intro', function(mode) {
86043                         if (mode.id !== 'add-area') return;
86044                         continueTo(startTank);
86045                     });
86046                 }, msec + 100);
86047
86048                 function continueTo(nextStep) {
86049                     context.on('enter.intro', null);
86050                     nextStep();
86051                 }
86052             }
86053
86054
86055             function startTank() {
86056                 if (context.mode().id !== 'add-area') {
86057                     return continueTo(addTank);
86058                 }
86059
86060                 _tankID = null;
86061
86062                 timeout(function() {
86063                     revealTank(tank, t('intro.buildings.start_tank'));
86064
86065                     context.map().on('move.intro drawn.intro', function() {
86066                         revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
86067                     });
86068
86069                     context.on('enter.intro', function(mode) {
86070                         if (mode.id !== 'draw-area') return chapter.restart();
86071                         continueTo(continueTank);
86072                     });
86073
86074                 }, 550);  // after easing
86075
86076                 function continueTo(nextStep) {
86077                     context.map().on('move.intro drawn.intro', null);
86078                     context.on('enter.intro', null);
86079                     nextStep();
86080                 }
86081             }
86082
86083
86084             function continueTank() {
86085                 if (context.mode().id !== 'draw-area') {
86086                     return continueTo(addTank);
86087                 }
86088
86089                 _tankID = null;
86090
86091                 revealTank(tank, t('intro.buildings.continue_tank'));
86092
86093                 context.map().on('move.intro drawn.intro', function() {
86094                     revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
86095                 });
86096
86097                 context.on('enter.intro', function(mode) {
86098                     if (mode.id === 'draw-area') {
86099                         return;
86100                     } else if (mode.id === 'select') {
86101                         _tankID = context.selectedIDs()[0];
86102                         return continueTo(searchPresetTank);
86103                     } else {
86104                         return continueTo(addTank);
86105                     }
86106                 });
86107
86108                 function continueTo(nextStep) {
86109                     context.map().on('move.intro drawn.intro', null);
86110                     context.on('enter.intro', null);
86111                     nextStep();
86112                 }
86113             }
86114
86115
86116             function searchPresetTank() {
86117                 if (!_tankID || !context.hasEntity(_tankID)) {
86118                     return addTank();
86119                 }
86120                 var ids = context.selectedIDs();
86121                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86122                     context.enter(modeSelect(context, [_tankID]));
86123                 }
86124
86125                 // disallow scrolling
86126                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86127
86128                 timeout(function() {
86129                     // reset pane, in case user somehow happened to change it..
86130                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86131
86132                     d3_select('.preset-search-input')
86133                         .on('keydown.intro', null)
86134                         .on('keyup.intro', checkPresetSearch);
86135
86136                     reveal('.preset-search-input',
86137                         t('intro.buildings.search_tank', { preset: tankPreset.name() })
86138                     );
86139                 }, 400);  // after preset list pane visible..
86140
86141                 context.on('enter.intro', function(mode) {
86142                     if (!_tankID || !context.hasEntity(_tankID)) {
86143                         return continueTo(addTank);
86144                     }
86145
86146                     var ids = context.selectedIDs();
86147                     if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
86148                         // keep the user's area selected..
86149                         context.enter(modeSelect(context, [_tankID]));
86150
86151                         // reset pane, in case user somehow happened to change it..
86152                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86153                         // disallow scrolling
86154                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86155
86156                         d3_select('.preset-search-input')
86157                             .on('keydown.intro', null)
86158                             .on('keyup.intro', checkPresetSearch);
86159
86160                         reveal('.preset-search-input',
86161                             t('intro.buildings.search_tank', { preset: tankPreset.name() })
86162                         );
86163
86164                         context.history().on('change.intro', null);
86165                     }
86166                 });
86167
86168                 function checkPresetSearch() {
86169                     var first = d3_select('.preset-list-item:first-child');
86170
86171                     if (first.classed('preset-man_made-storage_tank')) {
86172                         reveal(first.select('.preset-list-button').node(),
86173                             t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
86174                             { duration: 300 }
86175                         );
86176
86177                         d3_select('.preset-search-input')
86178                             .on('keydown.intro', eventCancel, true)
86179                             .on('keyup.intro', null);
86180
86181                         context.history().on('change.intro', function() {
86182                             continueTo(closeEditorTank);
86183                         });
86184                     }
86185                 }
86186
86187                 function continueTo(nextStep) {
86188                     d3_select('.inspector-wrap').on('wheel.intro', null);
86189                     context.on('enter.intro', null);
86190                     context.history().on('change.intro', null);
86191                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86192                     nextStep();
86193                 }
86194             }
86195
86196
86197             function closeEditorTank() {
86198                 if (!_tankID || !context.hasEntity(_tankID)) {
86199                     return addTank();
86200                 }
86201                 var ids = context.selectedIDs();
86202                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86203                     context.enter(modeSelect(context, [_tankID]));
86204                 }
86205
86206                 context.history().checkpoint('hasTank');
86207
86208                 context.on('exit.intro', function() {
86209                     continueTo(rightClickTank);
86210                 });
86211
86212                 timeout(function() {
86213                     reveal('.entity-editor-pane',
86214                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
86215                     );
86216                 }, 500);
86217
86218                 function continueTo(nextStep) {
86219                     context.on('exit.intro', null);
86220                     nextStep();
86221                 }
86222             }
86223
86224
86225             function rightClickTank() {
86226                 if (!_tankID) return continueTo(addTank);
86227
86228                 context.enter(modeBrowse(context));
86229                 context.history().reset('hasTank');
86230                 context.map().centerEase(tank, 500);
86231
86232                 timeout(function() {
86233                     context.on('enter.intro', function(mode) {
86234                         if (mode.id !== 'select') return;
86235                         var ids = context.selectedIDs();
86236                         if (ids.length !== 1 || ids[0] !== _tankID) return;
86237
86238                         timeout(function() {
86239                             var node = selectMenuItem('circularize').node();
86240                             if (!node) return;
86241                             continueTo(clickCircle);
86242                         }, 300);  // after menu visible
86243                     });
86244
86245                     revealTank(tank, t('intro.buildings.rightclick_tank'));
86246
86247                     context.map().on('move.intro drawn.intro', function() {
86248                         revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
86249                     });
86250
86251                     context.history().on('change.intro', function() {
86252                         continueTo(rightClickTank);
86253                     });
86254
86255                 }, 600);
86256
86257                 function continueTo(nextStep) {
86258                     context.on('enter.intro', null);
86259                     context.map().on('move.intro drawn.intro', null);
86260                     context.history().on('change.intro', null);
86261                     nextStep();
86262                 }
86263             }
86264
86265
86266             function clickCircle() {
86267                 if (!_tankID) return chapter.restart();
86268                 var entity = context.hasEntity(_tankID);
86269                 if (!entity) return continueTo(rightClickTank);
86270
86271                 var node = selectMenuItem('circularize').node();
86272                 if (!node) { return continueTo(rightClickTank); }
86273
86274                 var wasChanged = false;
86275                 var menuCoords = context.map().mouseCoordinates();
86276
86277                 revealEditMenu(menuCoords,
86278                     t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
86279                 );
86280
86281                 context.on('enter.intro', function(mode) {
86282                     if (mode.id === 'browse') {
86283                         continueTo(rightClickTank);
86284                     } else if (mode.id === 'move' || mode.id === 'rotate') {
86285                         continueTo(retryClickCircle);
86286                     }
86287                 });
86288
86289                 context.map().on('move.intro drawn.intro', function() {
86290                     var node = selectMenuItem('circularize').node();
86291                     if (!wasChanged && !node) { return continueTo(rightClickTank); }
86292
86293                     revealEditMenu(menuCoords,
86294                         t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
86295                         { duration: 0 }
86296                     );
86297                 });
86298
86299                 context.history().on('change.intro', function() {
86300                     wasChanged = true;
86301                     context.history().on('change.intro', null);
86302
86303                     // Something changed.  Wait for transition to complete and check undo annotation.
86304                     timeout(function() {
86305                         if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
86306                             continueTo(play);
86307                         } else {
86308                             continueTo(retryClickCircle);
86309                         }
86310                     }, 500);  // after transitioned actions
86311                 });
86312
86313                 function continueTo(nextStep) {
86314                     context.on('enter.intro', null);
86315                     context.map().on('move.intro drawn.intro', null);
86316                     context.history().on('change.intro', null);
86317                     nextStep();
86318                 }
86319             }
86320
86321
86322             function retryClickCircle() {
86323                 context.enter(modeBrowse(context));
86324
86325                 revealTank(tank, t('intro.buildings.retry_circle'), {
86326                     buttonText: t('intro.ok'),
86327                     buttonCallback: function() { continueTo(rightClickTank); }
86328                 });
86329
86330                 function continueTo(nextStep) {
86331                     nextStep();
86332                 }
86333             }
86334
86335
86336             function play() {
86337                 dispatch$1.call('done');
86338                 reveal('#id-container',
86339                     t('intro.buildings.play', { next: t('intro.startediting.title') }), {
86340                         tooltipBox: '.intro-nav-wrap .chapter-startEditing',
86341                         buttonText: t('intro.ok'),
86342                         buttonCallback: function() { reveal('#id-container'); }
86343                     }
86344                 );
86345             }
86346
86347
86348             chapter.enter = function() {
86349                 addHouse();
86350             };
86351
86352
86353             chapter.exit = function() {
86354                 timeouts.forEach(window.clearTimeout);
86355                 context.on('enter.intro exit.intro', null);
86356                 context.map().on('move.intro drawn.intro', null);
86357                 context.history().on('change.intro', null);
86358                 d3_select('.inspector-wrap').on('wheel.intro', null);
86359                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86360                 d3_select('.more-fields .combobox-input').on('click.intro', null);
86361             };
86362
86363
86364             chapter.restart = function() {
86365                 chapter.exit();
86366                 chapter.enter();
86367             };
86368
86369
86370             return utilRebind(chapter, dispatch$1, 'on');
86371         }
86372
86373         function uiIntroStartEditing(context, reveal) {
86374             var dispatch$1 = dispatch('done', 'startEditing');
86375             var modalSelection = d3_select(null);
86376
86377
86378             var chapter = {
86379                 title: 'intro.startediting.title'
86380             };
86381
86382             function showHelp() {
86383                 reveal('.map-control.help-control',
86384                     t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
86385                         buttonText: t('intro.ok'),
86386                         buttonCallback: function() { shortcuts(); }
86387                     }
86388                 );
86389             }
86390
86391             function shortcuts() {
86392                 reveal('.map-control.help-control',
86393                     t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
86394                         buttonText: t('intro.ok'),
86395                         buttonCallback: function() { showSave(); }
86396                     }
86397                 );
86398             }
86399
86400             function showSave() {
86401                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86402                 reveal('#bar button.save',
86403                     t('intro.startediting.save'), {
86404                         buttonText: t('intro.ok'),
86405                         buttonCallback: function() { showStart(); }
86406                     }
86407                 );
86408             }
86409
86410             function showStart() {
86411                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86412
86413                 modalSelection = uiModal(context.container());
86414
86415                 modalSelection.select('.modal')
86416                     .attr('class', 'modal-splash modal col6');
86417
86418                 modalSelection.selectAll('.close').remove();
86419
86420                 var startbutton = modalSelection.select('.content')
86421                     .attr('class', 'fillL')
86422                     .append('button')
86423                         .attr('class', 'modal-section huge-modal-button')
86424                         .on('click', function() {
86425                             modalSelection.remove();
86426                         });
86427
86428                     startbutton
86429                         .append('svg')
86430                         .attr('class', 'illustration')
86431                         .append('use')
86432                         .attr('xlink:href', '#iD-logo-walkthrough');
86433
86434                     startbutton
86435                         .append('h2')
86436                         .text(t('intro.startediting.start'));
86437
86438                 dispatch$1.call('startEditing');
86439             }
86440
86441
86442             chapter.enter = function() {
86443                 showHelp();
86444             };
86445
86446
86447             chapter.exit = function() {
86448                 modalSelection.remove();
86449                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86450             };
86451
86452
86453             return utilRebind(chapter, dispatch$1, 'on');
86454         }
86455
86456         var chapterUi = {
86457             welcome: uiIntroWelcome,
86458             navigation: uiIntroNavigation,
86459             point: uiIntroPoint,
86460             area: uiIntroArea,
86461             line: uiIntroLine,
86462             building: uiIntroBuilding,
86463             startEditing: uiIntroStartEditing
86464         };
86465
86466         var chapterFlow = [
86467             'welcome',
86468             'navigation',
86469             'point',
86470             'area',
86471             'line',
86472             'building',
86473             'startEditing'
86474         ];
86475
86476
86477         function uiIntro(context) {
86478             var INTRO_IMAGERY = 'EsriWorldImageryClarity';
86479             var introGraph = {};
86480             var _currChapter;
86481
86482             // create entities for intro graph and localize names
86483             for (var id in dataIntroGraph) {
86484                 introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
86485             }
86486
86487
86488             function intro(selection) {
86489                 context.enter(modeBrowse(context));
86490
86491                 // Save current map state
86492                 var osm = context.connection();
86493                 var history = context.history().toJSON();
86494                 var hash = window.location.hash;
86495                 var center = context.map().center();
86496                 var zoom = context.map().zoom();
86497                 var background = context.background().baseLayerSource();
86498                 var overlays = context.background().overlayLayerSources();
86499                 var opacity = d3_selectAll('#map .layer-background').style('opacity');
86500                 var caches = osm && osm.caches();
86501                 var baseEntities = context.history().graph().base().entities;
86502                 var countryCode = services$1.geocoder.countryCode;
86503
86504                 // Show sidebar and disable the sidebar resizing button
86505                 // (this needs to be before `context.inIntro(true)`)
86506                 context.ui().sidebar.expand();
86507                 d3_selectAll('button.sidebar-toggle').classed('disabled', true);
86508
86509                 // Block saving
86510                 context.inIntro(true);
86511
86512                 // Load semi-real data used in intro
86513                 if (osm) { osm.toggle(false).reset(); }
86514                 context.history().reset();
86515                 context.history().merge(Object.values(coreGraph().load(introGraph).entities));
86516                 context.history().checkpoint('initial');
86517
86518                 // Setup imagery
86519                 var imagery = context.background().findSource(INTRO_IMAGERY);
86520                 if (imagery) {
86521                     context.background().baseLayerSource(imagery);
86522                 } else {
86523                     context.background().bing();
86524                 }
86525                 overlays.forEach(function(d) {
86526                     context.background().toggleOverlayLayer(d);
86527                 });
86528
86529                 // Setup data layers (only OSM)
86530                 var layers = context.layers();
86531                 layers.all().forEach(function(item) {
86532                     // if the layer has the function `enabled`
86533                     if (typeof item.layer.enabled === 'function') {
86534                         item.layer.enabled(item.id === 'osm');
86535                     }
86536                 });
86537
86538                 // Mock geocoder
86539                 services$1.geocoder.countryCode = function(location, callback) {
86540                     callback(null, t('intro.graph.countrycode'));
86541                 };
86542
86543
86544                 d3_selectAll('#map .layer-background').style('opacity', 1);
86545
86546                 var curtain = uiCurtain();
86547                 selection.call(curtain);
86548
86549                 // Store that the user started the walkthrough..
86550                 context.storage('walkthrough_started', 'yes');
86551
86552                 // Restore previous walkthrough progress..
86553                 var storedProgress = context.storage('walkthrough_progress') || '';
86554                 var progress = storedProgress.split(';').filter(Boolean);
86555
86556                 var chapters = chapterFlow.map(function(chapter, i) {
86557                     var s = chapterUi[chapter](context, curtain.reveal)
86558                         .on('done', function() {
86559                             context.presets().init();  // clear away "recent" presets
86560
86561                             buttons.filter(function(d) {
86562                                 return d.title === s.title;
86563                             }).classed('finished', true);
86564
86565                             if (i < chapterFlow.length - 1) {
86566                                 var next = chapterFlow[i + 1];
86567                                 d3_select('button.chapter-' + next)
86568                                     .classed('next', true);
86569                             }
86570
86571                             // Store walkthrough progress..
86572                             progress.push(chapter);
86573                             context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86574                         });
86575                     return s;
86576                 });
86577
86578                 chapters[chapters.length - 1].on('startEditing', function() {
86579                     // Store walkthrough progress..
86580                     progress.push('startEditing');
86581                     context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86582
86583                     // Store if walkthrough is completed..
86584                     var incomplete = utilArrayDifference(chapterFlow, progress);
86585                     if (!incomplete.length) {
86586                         context.storage('walkthrough_completed', 'yes');
86587                     }
86588
86589                     curtain.remove();
86590                     navwrap.remove();
86591                     d3_selectAll('#map .layer-background').style('opacity', opacity);
86592                     d3_selectAll('button.sidebar-toggle').classed('disabled', false);
86593                     if (osm) { osm.toggle(true).reset().caches(caches); }
86594                     context.history().reset().merge(Object.values(baseEntities));
86595                     context.background().baseLayerSource(background);
86596                     overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
86597                     if (history) { context.history().fromJSON(history, false); }
86598                     context.map().centerZoom(center, zoom);
86599                     window.location.replace(hash);
86600                     services$1.geocoder.countryCode = countryCode;
86601                     context.inIntro(false);
86602                 });
86603
86604                 var navwrap = selection
86605                     .append('div')
86606                     .attr('class', 'intro-nav-wrap fillD');
86607
86608                 navwrap
86609                     .append('svg')
86610                     .attr('class', 'intro-nav-wrap-logo')
86611                     .append('use')
86612                     .attr('xlink:href', '#iD-logo-walkthrough');
86613
86614                 var buttonwrap = navwrap
86615                     .append('div')
86616                     .attr('class', 'joined')
86617                     .selectAll('button.chapter');
86618
86619                 var buttons = buttonwrap
86620                     .data(chapters)
86621                     .enter()
86622                     .append('button')
86623                     .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
86624                     .on('click', enterChapter);
86625
86626                 buttons
86627                     .append('span')
86628                     .text(function(d) { return t(d.title); });
86629
86630                 buttons
86631                     .append('span')
86632                     .attr('class', 'status')
86633                     .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86634
86635                 enterChapter(chapters[0]);
86636
86637
86638                 function enterChapter(newChapter) {
86639                     if (_currChapter) { _currChapter.exit(); }
86640                     context.enter(modeBrowse(context));
86641
86642                     _currChapter = newChapter;
86643                     _currChapter.enter();
86644
86645                     buttons
86646                         .classed('next', false)
86647                         .classed('active', function(d) {
86648                             return d.title === _currChapter.title;
86649                         });
86650                 }
86651             }
86652
86653
86654             return intro;
86655         }
86656
86657         function uiShortcuts(context) {
86658             var detected = utilDetect();
86659             var _activeTab = 0;
86660             var _modalSelection;
86661             var _selection = d3_select(null);
86662
86663
86664             context.keybinding()
86665                 .on([t('shortcuts.toggle.key'), '?'], function () {
86666                     if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
86667                         if (_modalSelection) {
86668                             _modalSelection.close();
86669                             _modalSelection = null;
86670                         }
86671                     } else {
86672                         _modalSelection = uiModal(_selection);
86673                         shortcutsModal(_modalSelection);
86674                     }
86675                 });
86676
86677
86678             function shortcutsModal(_modalSelection) {
86679                 _modalSelection.select('.modal')
86680                     .classed('modal-shortcuts', true);
86681
86682                 var shortcutsModal = _modalSelection.select('.content');
86683
86684                 shortcutsModal
86685                     .append('div')
86686                     .attr('class', 'modal-section')
86687                     .append('h3')
86688                     .text(t('shortcuts.title'));
86689
86690                 shortcutsModal
86691                     .call(render);
86692             }
86693
86694
86695             function render(selection) {
86696                 var wrapper = selection
86697                     .selectAll('.wrapper')
86698                     .data([0]);
86699
86700                 var wrapperEnter = wrapper
86701                     .enter()
86702                     .append('div')
86703                     .attr('class', 'wrapper modal-section');
86704
86705                 var tabsBar = wrapperEnter
86706                     .append('div')
86707                     .attr('class', 'tabs-bar');
86708
86709                 var shortcutsList = wrapperEnter
86710                     .append('div')
86711                     .attr('class', 'shortcuts-list');
86712
86713                 wrapper = wrapper.merge(wrapperEnter);
86714
86715                 var tabs = tabsBar
86716                     .selectAll('.tab')
86717                     .data(dataShortcuts);
86718
86719                 var tabsEnter = tabs
86720                     .enter()
86721                     .append('div')
86722                     .attr('class', 'tab')
86723                     .on('click', function (d, i) {
86724                         _activeTab = i;
86725                         render(selection);
86726                     });
86727
86728                 tabsEnter
86729                     .append('span')
86730                     .text(function (d) { return t(d.text); });
86731
86732                 tabs = tabs
86733                     .merge(tabsEnter);
86734
86735                 // Update
86736                 wrapper.selectAll('.tab')
86737                     .classed('active', function (d, i) {
86738                         return i === _activeTab;
86739                     });
86740
86741
86742                 var shortcuts = shortcutsList
86743                     .selectAll('.shortcut-tab')
86744                     .data(dataShortcuts);
86745
86746                 var shortcutsEnter = shortcuts
86747                     .enter()
86748                     .append('div')
86749                     .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
86750
86751                 var columnsEnter = shortcutsEnter
86752                     .selectAll('.shortcut-column')
86753                     .data(function (d) { return d.columns; })
86754                     .enter()
86755                     .append('table')
86756                     .attr('class', 'shortcut-column');
86757
86758                 var rowsEnter = columnsEnter
86759                     .selectAll('.shortcut-row')
86760                     .data(function (d) { return d.rows; })
86761                     .enter()
86762                     .append('tr')
86763                     .attr('class', 'shortcut-row');
86764
86765
86766                 var sectionRows = rowsEnter
86767                     .filter(function (d) { return !d.shortcuts; });
86768
86769                 sectionRows
86770                     .append('td');
86771
86772                 sectionRows
86773                     .append('td')
86774                     .attr('class', 'shortcut-section')
86775                     .append('h3')
86776                     .text(function (d) { return t(d.text); });
86777
86778
86779                 var shortcutRows = rowsEnter
86780                     .filter(function (d) { return d.shortcuts; });
86781
86782                 var shortcutKeys = shortcutRows
86783                     .append('td')
86784                     .attr('class', 'shortcut-keys');
86785
86786                 var modifierKeys = shortcutKeys
86787                     .filter(function (d) { return d.modifiers; });
86788
86789                 modifierKeys
86790                     .selectAll('kbd.modifier')
86791                     .data(function (d) {
86792                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86793                             return ['⌘'];
86794                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86795                             return [];
86796                         } else {
86797                             return d.modifiers;
86798                         }
86799                     })
86800                     .enter()
86801                     .each(function () {
86802                         var selection = d3_select(this);
86803
86804                         selection
86805                             .append('kbd')
86806                             .attr('class', 'modifier')
86807                             .text(function (d) { return uiCmd.display(d); });
86808
86809                         selection
86810                             .append('span')
86811                             .text('+');
86812                     });
86813
86814
86815                 shortcutKeys
86816                     .selectAll('kbd.shortcut')
86817                     .data(function (d) {
86818                         var arr = d.shortcuts;
86819                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86820                             arr = ['Y'];
86821                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86822                             arr = ['F11'];
86823                         }
86824
86825                         // replace translations
86826                         arr = arr.map(function(s) {
86827                             return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
86828                         });
86829
86830                         return utilArrayUniq(arr).map(function(s) {
86831                             return {
86832                                 shortcut: s,
86833                                 separator: d.separator,
86834                                 suffix: d.suffix
86835                             };
86836                         });
86837                     })
86838                     .enter()
86839                     .each(function (d, i, nodes) {
86840                         var selection = d3_select(this);
86841                         var click = d.shortcut.toLowerCase().match(/(.*).click/);
86842
86843                         if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
86844                             selection
86845                                 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
86846                         } else {
86847                             selection
86848                                 .append('kbd')
86849                                 .attr('class', 'shortcut')
86850                                 .text(function (d) { return d.shortcut; });
86851                         }
86852
86853                         if (i < nodes.length - 1) {
86854                             selection
86855                                 .append('span')
86856                                 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
86857                         } else if (i === nodes.length - 1 && d.suffix) {
86858                             selection
86859                                 .append('span')
86860                                 .text(d.suffix);
86861                         }
86862                     });
86863
86864
86865                 shortcutKeys
86866                     .filter(function(d) { return d.gesture; })
86867                     .each(function () {
86868                         var selection = d3_select(this);
86869
86870                         selection
86871                             .append('span')
86872                             .text('+');
86873
86874                         selection
86875                             .append('span')
86876                             .attr('class', 'gesture')
86877                             .text(function (d) { return t(d.gesture); });
86878                     });
86879
86880
86881                 shortcutRows
86882                     .append('td')
86883                     .attr('class', 'shortcut-desc')
86884                     .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
86885
86886
86887                 shortcuts = shortcuts
86888                     .merge(shortcutsEnter);
86889
86890                 // Update
86891                 wrapper.selectAll('.shortcut-tab')
86892                     .style('display', function (d, i) {
86893                         return i === _activeTab ? 'flex' : 'none';
86894                     });
86895             }
86896
86897
86898             return function(selection, show) {
86899                 _selection = selection;
86900                 if (show) {
86901                     _modalSelection = uiModal(selection);
86902                     shortcutsModal(_modalSelection);
86903                 }
86904             };
86905         }
86906
86907         function uiHelp(context) {
86908             var key = t('help.key');
86909
86910             var _pane = d3_select(null), _toggleButton = d3_select(null);
86911
86912             var docKeys = [
86913                 ['help', [
86914                     'welcome',
86915                     'open_data_h',
86916                     'open_data',
86917                     'before_start_h',
86918                     'before_start',
86919                     'open_source_h',
86920                     'open_source',
86921                     'open_source_help'
86922                 ]],
86923                 ['overview', [
86924                     'navigation_h',
86925                     'navigation_drag',
86926                     'navigation_zoom',
86927                     'features_h',
86928                     'features',
86929                     'nodes_ways'
86930                 ]],
86931                 ['editing', [
86932                     'select_h',
86933                     'select_left_click',
86934                     'select_right_click',
86935                     'multiselect_h',
86936                     'multiselect_shift_click',
86937                     'multiselect_lasso',
86938                     'undo_redo_h',
86939                     'undo_redo',
86940                     'save_h',
86941                     'save',
86942                     'save_validation',
86943                     'upload_h',
86944                     'upload',
86945                     'backups_h',
86946                     'backups',
86947                     'keyboard_h',
86948                     'keyboard'
86949                 ]],
86950                 ['feature_editor', [
86951                     'intro',
86952                     'definitions',
86953                     'type_h',
86954                     'type',
86955                     'type_picker',
86956                     'fields_h',
86957                     'fields_all_fields',
86958                     'fields_example',
86959                     'fields_add_field',
86960                     'tags_h',
86961                     'tags_all_tags',
86962                     'tags_resources'
86963                 ]],
86964                 ['points', [
86965                     'intro',
86966                     'add_point_h',
86967                     'add_point',
86968                     'add_point_finish',
86969                     'move_point_h',
86970                     'move_point',
86971                     'delete_point_h',
86972                     'delete_point',
86973                     'delete_point_command'
86974                 ]],
86975                 ['lines', [
86976                     'intro',
86977                     'add_line_h',
86978                     'add_line',
86979                     'add_line_draw',
86980                     'add_line_finish',
86981                     'modify_line_h',
86982                     'modify_line_dragnode',
86983                     'modify_line_addnode',
86984                     'connect_line_h',
86985                     'connect_line',
86986                     'connect_line_display',
86987                     'connect_line_drag',
86988                     'connect_line_tag',
86989                     'disconnect_line_h',
86990                     'disconnect_line_command',
86991                     'move_line_h',
86992                     'move_line_command',
86993                     'move_line_connected',
86994                     'delete_line_h',
86995                     'delete_line',
86996                     'delete_line_command'
86997                 ]],
86998                 ['areas', [
86999                     'intro',
87000                     'point_or_area_h',
87001                     'point_or_area',
87002                     'add_area_h',
87003                     'add_area_command',
87004                     'add_area_draw',
87005                     'add_area_finish',
87006                     'square_area_h',
87007                     'square_area_command',
87008                     'modify_area_h',
87009                     'modify_area_dragnode',
87010                     'modify_area_addnode',
87011                     'delete_area_h',
87012                     'delete_area',
87013                     'delete_area_command'
87014                 ]],
87015                 ['relations', [
87016                     'intro',
87017                     'edit_relation_h',
87018                     'edit_relation',
87019                     'edit_relation_add',
87020                     'edit_relation_delete',
87021                     'maintain_relation_h',
87022                     'maintain_relation',
87023                     'relation_types_h',
87024                     'multipolygon_h',
87025                     'multipolygon',
87026                     'multipolygon_create',
87027                     'multipolygon_merge',
87028                     'turn_restriction_h',
87029                     'turn_restriction',
87030                     'turn_restriction_field',
87031                     'turn_restriction_editing',
87032                     'route_h',
87033                     'route',
87034                     'route_add',
87035                     'boundary_h',
87036                     'boundary',
87037                     'boundary_add'
87038                 ]],
87039                 ['notes', [
87040                     'intro',
87041                     'add_note_h',
87042                     'add_note',
87043                     'move_note',
87044                     'update_note_h',
87045                     'update_note',
87046                     'save_note_h',
87047                     'save_note'
87048                 ]],
87049
87050                 ['imagery', [
87051                     'intro',
87052                     'sources_h',
87053                     'choosing',
87054                     'sources',
87055                     'offsets_h',
87056                     'offset',
87057                     'offset_change'
87058                 ]],
87059                 ['streetlevel', [
87060                     'intro',
87061                     'using_h',
87062                     'using',
87063                     'photos',
87064                     'viewer'
87065                 ]],
87066                 ['gps', [
87067                     'intro',
87068                     'survey',
87069                     'using_h',
87070                     'using',
87071                     'tracing',
87072                     'upload'
87073                 ]],
87074                 ['qa', [
87075                     'intro',
87076                     'tools_h',
87077                     'tools',
87078                     'issues_h',
87079                     'issues'
87080                 ]]
87081             ];
87082
87083             var headings = {
87084                 'help.help.open_data_h': 3,
87085                 'help.help.before_start_h': 3,
87086                 'help.help.open_source_h': 3,
87087                 'help.overview.navigation_h': 3,
87088                 'help.overview.features_h': 3,
87089                 'help.editing.select_h': 3,
87090                 'help.editing.multiselect_h': 3,
87091                 'help.editing.undo_redo_h': 3,
87092                 'help.editing.save_h': 3,
87093                 'help.editing.upload_h': 3,
87094                 'help.editing.backups_h': 3,
87095                 'help.editing.keyboard_h': 3,
87096                 'help.feature_editor.type_h': 3,
87097                 'help.feature_editor.fields_h': 3,
87098                 'help.feature_editor.tags_h': 3,
87099                 'help.points.add_point_h': 3,
87100                 'help.points.move_point_h': 3,
87101                 'help.points.delete_point_h': 3,
87102                 'help.lines.add_line_h': 3,
87103                 'help.lines.modify_line_h': 3,
87104                 'help.lines.connect_line_h': 3,
87105                 'help.lines.disconnect_line_h': 3,
87106                 'help.lines.move_line_h': 3,
87107                 'help.lines.delete_line_h': 3,
87108                 'help.areas.point_or_area_h': 3,
87109                 'help.areas.add_area_h': 3,
87110                 'help.areas.square_area_h': 3,
87111                 'help.areas.modify_area_h': 3,
87112                 'help.areas.delete_area_h': 3,
87113                 'help.relations.edit_relation_h': 3,
87114                 'help.relations.maintain_relation_h': 3,
87115                 'help.relations.relation_types_h': 2,
87116                 'help.relations.multipolygon_h': 3,
87117                 'help.relations.turn_restriction_h': 3,
87118                 'help.relations.route_h': 3,
87119                 'help.relations.boundary_h': 3,
87120                 'help.notes.add_note_h': 3,
87121                 'help.notes.update_note_h': 3,
87122                 'help.notes.save_note_h': 3,
87123                 'help.imagery.sources_h': 3,
87124                 'help.imagery.offsets_h': 3,
87125                 'help.streetlevel.using_h': 3,
87126                 'help.gps.using_h': 3,
87127                 'help.qa.tools_h': 3,
87128                 'help.qa.issues_h': 3
87129             };
87130
87131             var replacements = {
87132                 point: icon('#iD-icon-point', 'pre-text'),
87133                 line: icon('#iD-icon-line', 'pre-text'),
87134                 area: icon('#iD-icon-area', 'pre-text'),
87135                 note: icon('#iD-icon-note', 'pre-text add-note'),
87136                 plus: icon('#iD-icon-plus', 'pre-text'),
87137                 minus: icon('#iD-icon-minus', 'pre-text'),
87138                 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
87139                 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
87140                 layers: icon('#iD-icon-layers', 'pre-text'),
87141                 data: icon('#iD-icon-data', 'pre-text'),
87142                 inspect: icon('#iD-icon-inspect', 'pre-text'),
87143                 move: icon('#iD-operation-move', 'pre-text'),
87144                 merge: icon('#iD-operation-merge', 'pre-text'),
87145                 delete: icon('#iD-operation-delete', 'pre-text'),
87146                 close: icon('#iD-icon-close', 'pre-text'),
87147                 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
87148                 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
87149                 save: icon('#iD-icon-save', 'pre-text'),
87150                 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
87151                 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
87152                 shift: uiCmd.display('⇧'),
87153                 alt: uiCmd.display('⌥'),
87154                 return: uiCmd.display('↵'),
87155                 version: context.version
87156             };
87157
87158             // For each section, squash all the texts into a single markdown document
87159             var docs = docKeys.map(function(key) {
87160                 var helpkey = 'help.' + key[0];
87161                 var text = key[1].reduce(function(all, part) {
87162                     var subkey = helpkey + '.' + part;
87163                     var depth = headings[subkey];                              // is this subkey a heading?
87164                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
87165                     return all + hhh + t(subkey, replacements) + '\n\n';
87166                 }, '');
87167
87168                 return {
87169                     title: t(helpkey + '.title'),
87170                     html: marked(text.trim())
87171                 };
87172             });
87173
87174             var paneTooltip = tooltip()
87175                 .placement((textDirection === 'rtl') ? 'right' : 'left')
87176                 .html(true)
87177                 .title(uiTooltipHtml(t('help.title'), key));
87178
87179             function hidePane() {
87180                 context.ui().togglePanes();
87181             }
87182
87183             uiHelp.togglePane = function() {
87184                 if (event) event.preventDefault();
87185                 paneTooltip.hide(_toggleButton);
87186                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
87187             };
87188
87189             uiHelp.renderToggleButton = function(selection) {
87190
87191                 _toggleButton = selection.append('button')
87192                     .attr('tabindex', -1)
87193                     .on('click', uiHelp.togglePane)
87194                     .call(svgIcon('#iD-icon-help', 'light'))
87195                     .call(paneTooltip);
87196             };
87197
87198
87199             uiHelp.renderPane = function(selection) {
87200
87201                 function clickHelp(d, i) {
87202                     var rtl = (textDirection === 'rtl');
87203                     content.property('scrollTop', 0);
87204                     doctitle.html(d.title);
87205
87206                     body.html(d.html);
87207                     body.selectAll('a')
87208                         .attr('target', '_blank');
87209                     menuItems.classed('selected', function(m) {
87210                         return m.title === d.title;
87211                     });
87212
87213                     nav.html('');
87214                     if (rtl) {
87215                         nav.call(drawNext).call(drawPrevious);
87216                     } else {
87217                         nav.call(drawPrevious).call(drawNext);
87218                     }
87219
87220
87221                     function drawNext(selection) {
87222                         if (i < docs.length - 1) {
87223                             var nextLink = selection
87224                                 .append('a')
87225                                 .attr('class', 'next')
87226                                 .on('click', function() {
87227                                     clickHelp(docs[i + 1], i + 1);
87228                                 });
87229
87230                             nextLink
87231                                 .append('span')
87232                                 .text(docs[i + 1].title)
87233                                 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
87234                         }
87235                     }
87236
87237
87238                     function drawPrevious(selection) {
87239                         if (i > 0) {
87240                             var prevLink = selection
87241                                 .append('a')
87242                                 .attr('class', 'previous')
87243                                 .on('click', function() {
87244                                     clickHelp(docs[i - 1], i - 1);
87245                                 });
87246
87247                             prevLink
87248                                 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
87249                                 .append('span')
87250                                 .text(docs[i - 1].title);
87251                         }
87252                     }
87253                 }
87254
87255
87256                 function clickWalkthrough() {
87257                     if (context.inIntro()) return;
87258                     context.container().call(uiIntro(context));
87259                     context.ui().togglePanes();
87260                 }
87261
87262
87263                 function clickShortcuts() {
87264                     context.container().call(uiShortcuts(context), true);
87265                 }
87266
87267
87268                 _pane = selection.append('div')
87269                     .attr('class', 'help-wrap map-pane fillL hide')
87270                     .attr('pane', 'help');
87271
87272                 var heading = _pane
87273                     .append('div')
87274                     .attr('class', 'pane-heading');
87275
87276                 var doctitle = heading
87277                     .append('h2')
87278                     .text(t('help.title'));
87279
87280                 heading
87281                     .append('button')
87282                     .on('click', hidePane)
87283                     .call(svgIcon('#iD-icon-close'));
87284
87285
87286                 var content = _pane
87287                     .append('div')
87288                     .attr('class', 'pane-content');
87289
87290                 var toc = content
87291                     .append('ul')
87292                     .attr('class', 'toc');
87293
87294                 var menuItems = toc.selectAll('li')
87295                     .data(docs)
87296                     .enter()
87297                     .append('li')
87298                     .append('a')
87299                     .html(function(d) { return d.title; })
87300                     .on('click', clickHelp);
87301
87302                 var shortcuts = toc
87303                     .append('li')
87304                     .attr('class', 'shortcuts')
87305                     .call(tooltip()
87306                         .html(true)
87307                         .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
87308                         .placement('top')
87309                     )
87310                     .append('a')
87311                     .on('click', clickShortcuts);
87312
87313                 shortcuts
87314                     .append('div')
87315                     .text(t('shortcuts.title'));
87316
87317                 var walkthrough = toc
87318                     .append('li')
87319                     .attr('class', 'walkthrough')
87320                     .append('a')
87321                     .on('click', clickWalkthrough);
87322
87323                 walkthrough
87324                     .append('svg')
87325                     .attr('class', 'logo logo-walkthrough')
87326                     .append('use')
87327                     .attr('xlink:href', '#iD-logo-walkthrough');
87328
87329                 walkthrough
87330                     .append('div')
87331                     .text(t('splash.walkthrough'));
87332
87333
87334                 var helpContent = content
87335                     .append('div')
87336                     .attr('class', 'left-content');
87337
87338                 var body = helpContent
87339                     .append('div')
87340                     .attr('class', 'body');
87341
87342                 var nav = helpContent
87343                     .append('div')
87344                     .attr('class', 'nav');
87345
87346                 clickHelp(docs[0], 0);
87347
87348                 context.keybinding()
87349                     .on(key, uiHelp.togglePane);
87350
87351             };
87352
87353             return uiHelp;
87354         }
87355
87356         function uiPanelBackground(context) {
87357             var background = context.background();
87358             var currSourceName = null;
87359             var metadata = {};
87360             var metadataKeys = [
87361                 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
87362             ];
87363
87364             var debouncedRedraw = debounce(redraw, 250);
87365
87366             function redraw(selection) {
87367                 var source = background.baseLayerSource();
87368                 var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
87369
87370                 if (currSourceName !== source.name()) {
87371                     currSourceName = source.name();
87372                     metadata = {};
87373                 }
87374
87375                 selection.html('');
87376
87377                 var list = selection
87378                     .append('ul')
87379                     .attr('class', 'background-info');
87380
87381                 list
87382                     .append('li')
87383                     .text(currSourceName);
87384
87385                 metadataKeys.forEach(function(k) {
87386                     // DigitalGlobe vintage is available in raster layers for now.
87387                     if (isDG && k === 'vintage') return;
87388
87389                     list
87390                         .append('li')
87391                         .attr('class', 'background-info-list-' + k)
87392                         .classed('hide', !metadata[k])
87393                         .text(t('info_panels.background.' + k) + ':')
87394                         .append('span')
87395                         .attr('class', 'background-info-span-' + k)
87396                         .text(metadata[k]);
87397                 });
87398
87399                 debouncedGetMetadata(selection);
87400
87401                 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
87402
87403                 selection
87404                     .append('a')
87405                     .text(t('info_panels.background.' + toggleTiles))
87406                     .attr('href', '#')
87407                     .attr('class', 'button button-toggle-tiles')
87408                     .on('click', function() {
87409                         event.preventDefault();
87410                         context.setDebug('tile', !context.getDebug('tile'));
87411                         selection.call(redraw);
87412                     });
87413
87414                 if (isDG) {
87415                     var key = source.id + '-vintage';
87416                     var sourceVintage = context.background().findSource(key);
87417                     var showsVintage = context.background().showsLayer(sourceVintage);
87418                     var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
87419                     selection
87420                         .append('a')
87421                         .text(t('info_panels.background.' + toggleVintage))
87422                         .attr('href', '#')
87423                         .attr('class', 'button button-toggle-vintage')
87424                         .on('click', function() {
87425                             event.preventDefault();
87426                             context.background().toggleOverlayLayer(sourceVintage);
87427                             selection.call(redraw);
87428                         });
87429                 }
87430
87431                 // disable if necessary
87432                 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
87433                     if (source.id !== layerId) {
87434                         var key = layerId + '-vintage';
87435                         var sourceVintage = context.background().findSource(key);
87436                         if (context.background().showsLayer(sourceVintage)) {
87437                             context.background().toggleOverlayLayer(sourceVintage);
87438                         }
87439                     }
87440                 });
87441             }
87442
87443
87444             var debouncedGetMetadata = debounce(getMetadata, 250);
87445
87446             function getMetadata(selection) {
87447                 var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
87448                 if (tile.empty()) return;
87449
87450                 var sourceName = currSourceName;
87451                 var d = tile.datum();
87452                 var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
87453                 var center = context.map().center();
87454
87455                 // update zoom
87456                 metadata.zoom = String(zoom);
87457                 selection.selectAll('.background-info-list-zoom')
87458                     .classed('hide', false)
87459                     .selectAll('.background-info-span-zoom')
87460                     .text(metadata.zoom);
87461
87462                 if (!d || !d.length >= 3) return;
87463
87464                 background.baseLayerSource().getMetadata(center, d, function(err, result) {
87465                     if (err || currSourceName !== sourceName) return;
87466
87467                     // update vintage
87468                     var vintage = result.vintage;
87469                     metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
87470                     selection.selectAll('.background-info-list-vintage')
87471                         .classed('hide', false)
87472                         .selectAll('.background-info-span-vintage')
87473                         .text(metadata.vintage);
87474
87475                     // update other metdata
87476                     metadataKeys.forEach(function(k) {
87477                         if (k === 'zoom' || k === 'vintage') return;  // done already
87478                         var val = result[k];
87479                         metadata[k] = val;
87480                         selection.selectAll('.background-info-list-' + k)
87481                             .classed('hide', !val)
87482                             .selectAll('.background-info-span-' + k)
87483                             .text(val);
87484                     });
87485                 });
87486             }
87487
87488
87489             var panel = function(selection) {
87490                 selection.call(redraw);
87491
87492                 context.map()
87493                     .on('drawn.info-background', function() {
87494                         selection.call(debouncedRedraw);
87495                     })
87496                     .on('move.info-background', function() {
87497                         selection.call(debouncedGetMetadata);
87498                     });
87499
87500             };
87501
87502             panel.off = function() {
87503                 context.map()
87504                     .on('drawn.info-background', null)
87505                     .on('move.info-background', null);
87506             };
87507
87508             panel.id = 'background';
87509             panel.title = t('info_panels.background.title');
87510             panel.key = t('info_panels.background.key');
87511
87512
87513             return panel;
87514         }
87515
87516         function uiPanelHistory(context) {
87517             var osm;
87518
87519             function displayTimestamp(timestamp) {
87520                 if (!timestamp) return t('info_panels.history.unknown');
87521                 var detected = utilDetect();
87522                 var options = {
87523                     day: 'numeric', month: 'short', year: 'numeric',
87524                     hour: 'numeric', minute: 'numeric', second: 'numeric'
87525                 };
87526                 var d = new Date(timestamp);
87527                 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
87528                 return d.toLocaleString(detected.locale, options);
87529             }
87530
87531
87532             function displayUser(selection, userName) {
87533                 if (!userName) {
87534                     selection
87535                         .append('span')
87536                         .text(t('info_panels.history.unknown'));
87537                     return;
87538                 }
87539
87540                 selection
87541                     .append('span')
87542                     .attr('class', 'user-name')
87543                     .text(userName);
87544
87545                 var links = selection
87546                     .append('div')
87547                     .attr('class', 'links');
87548
87549                 if (osm) {
87550                     links
87551                         .append('a')
87552                         .attr('class', 'user-osm-link')
87553                         .attr('href', osm.userURL(userName))
87554                         .attr('target', '_blank')
87555                         .attr('tabindex', -1)
87556                         .text('OSM');
87557                 }
87558
87559                 links
87560                     .append('a')
87561                     .attr('class', 'user-hdyc-link')
87562                     .attr('href', 'https://hdyc.neis-one.org/?' + userName)
87563                     .attr('target', '_blank')
87564                     .attr('tabindex', -1)
87565                     .text('HDYC');
87566             }
87567
87568
87569             function displayChangeset(selection, changeset) {
87570                 if (!changeset) {
87571                     selection
87572                         .append('span')
87573                         .text(t('info_panels.history.unknown'));
87574                     return;
87575                 }
87576
87577                 selection
87578                     .append('span')
87579                     .attr('class', 'changeset-id')
87580                     .text(changeset);
87581
87582                 var links = selection
87583                     .append('div')
87584                     .attr('class', 'links');
87585
87586                 if (osm) {
87587                     links
87588                         .append('a')
87589                         .attr('class', 'changeset-osm-link')
87590                         .attr('href', osm.changesetURL(changeset))
87591                         .attr('target', '_blank')
87592                         .attr('tabindex', -1)
87593                         .text('OSM');
87594                 }
87595
87596                 links
87597                     .append('a')
87598                     .attr('class', 'changeset-osmcha-link')
87599                     .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
87600                     .attr('target', '_blank')
87601                     .attr('tabindex', -1)
87602                     .text('OSMCha');
87603             }
87604
87605
87606             function redraw(selection) {
87607                 var selectedNoteID = context.selectedNoteID();
87608                 osm = context.connection();
87609
87610                 var selected, note, entity;
87611                 if (selectedNoteID && osm) {       // selected 1 note
87612                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87613                     note = osm.getNote(selectedNoteID);
87614                 } else {                           // selected 1..n entities
87615                     selected = context.selectedIDs()
87616                         .filter(function(e) { return context.hasEntity(e); });
87617                     if (selected.length) {
87618                         entity = context.entity(selected[0]);
87619                     }
87620                 }
87621
87622                 var singular = selected.length === 1 ? selected[0] : null;
87623
87624                 selection.html('');
87625
87626                 selection
87627                     .append('h4')
87628                     .attr('class', 'history-heading')
87629                     .text(singular || t('info_panels.history.selected', { n: selected.length }));
87630
87631                 if (!singular) return;
87632
87633                 if (entity) {
87634                     selection.call(redrawEntity, entity);
87635                 } else if (note) {
87636                     selection.call(redrawNote, note);
87637                 }
87638             }
87639
87640
87641             function redrawNote(selection, note) {
87642                 if (!note || note.isNew()) {
87643                     selection
87644                         .append('div')
87645                         .text(t('info_panels.history.note_no_history'));
87646                     return;
87647                 }
87648
87649                 var list = selection
87650                     .append('ul');
87651
87652                 list
87653                     .append('li')
87654                     .text(t('info_panels.history.note_comments') + ':')
87655                     .append('span')
87656                     .text(note.comments.length);
87657
87658                 if (note.comments.length) {
87659                     list
87660                         .append('li')
87661                         .text(t('info_panels.history.note_created_date') + ':')
87662                         .append('span')
87663                         .text(displayTimestamp(note.comments[0].date));
87664
87665                     list
87666                         .append('li')
87667                         .text(t('info_panels.history.note_created_user') + ':')
87668                         .call(displayUser, note.comments[0].user);
87669                 }
87670
87671                 if (osm) {
87672                     selection
87673                         .append('a')
87674                         .attr('class', 'view-history-on-osm')
87675                         .attr('target', '_blank')
87676                         .attr('tabindex', -1)
87677                         .attr('href', osm.noteURL(note))
87678                         .call(svgIcon('#iD-icon-out-link', 'inline'))
87679                         .append('span')
87680                         .text(t('info_panels.history.note_link_text'));
87681                 }
87682             }
87683
87684
87685             function redrawEntity(selection, entity) {
87686                 if (!entity || entity.isNew()) {
87687                     selection
87688                         .append('div')
87689                         .text(t('info_panels.history.no_history'));
87690                     return;
87691                 }
87692
87693                 var links = selection
87694                     .append('div')
87695                     .attr('class', 'links');
87696
87697                 if (osm) {
87698                     links
87699                         .append('a')
87700                         .attr('class', 'view-history-on-osm')
87701                         .attr('href', osm.historyURL(entity))
87702                         .attr('target', '_blank')
87703                         .attr('tabindex', -1)
87704                         .attr('title', t('info_panels.history.link_text'))
87705                         .text('OSM');
87706                 }
87707                 links
87708                     .append('a')
87709                     .attr('class', 'pewu-history-viewer-link')
87710                     .attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId())
87711                     .attr('target', '_blank')
87712                     .attr('tabindex', -1)
87713                     .text('PeWu');
87714
87715                 var list = selection
87716                     .append('ul');
87717
87718                 list
87719                     .append('li')
87720                     .text(t('info_panels.history.version') + ':')
87721                     .append('span')
87722                     .text(entity.version);
87723
87724                 list
87725                     .append('li')
87726                     .text(t('info_panels.history.last_edit') + ':')
87727                     .append('span')
87728                     .text(displayTimestamp(entity.timestamp));
87729
87730                 list
87731                     .append('li')
87732                     .text(t('info_panels.history.edited_by') + ':')
87733                     .call(displayUser, entity.user);
87734
87735                 list
87736                     .append('li')
87737                     .text(t('info_panels.history.changeset') + ':')
87738                     .call(displayChangeset, entity.changeset);
87739             }
87740
87741
87742             var panel = function(selection) {
87743                 selection.call(redraw);
87744
87745                 context.map()
87746                     .on('drawn.info-history', function() {
87747                         selection.call(redraw);
87748                     });
87749
87750                 context
87751                     .on('enter.info-history', function() {
87752                         selection.call(redraw);
87753                     });
87754             };
87755
87756             panel.off = function() {
87757                 context.map().on('drawn.info-history', null);
87758                 context.on('enter.info-history', null);
87759             };
87760
87761             panel.id = 'history';
87762             panel.title = t('info_panels.history.title');
87763             panel.key = t('info_panels.history.key');
87764
87765
87766             return panel;
87767         }
87768
87769         var OSM_PRECISION = 7;
87770         var locale$2 = utilDetect().locale;
87771
87772         /**
87773          * Returns a localized representation of the given length measurement.
87774          *
87775          * @param {Number} m area in meters
87776          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87777          */
87778         function displayLength(m, isImperial) {
87779             var d = m * (isImperial ? 3.28084 : 1);
87780             var unit;
87781
87782             if (isImperial) {
87783                 if (d >= 5280) {
87784                     d /= 5280;
87785                     unit = 'miles';
87786                 } else {
87787                     unit = 'feet';
87788                 }
87789             } else {
87790                 if (d >= 1000) {
87791                     d /= 1000;
87792                     unit = 'kilometers';
87793                 } else {
87794                     unit = 'meters';
87795                 }
87796             }
87797
87798             return t('units.' + unit, {
87799                 quantity: d.toLocaleString(locale$2, {
87800                     maximumSignificantDigits: 4
87801                 })
87802             });
87803         }
87804
87805         /**
87806          * Returns a localized representation of the given area measurement.
87807          *
87808          * @param {Number} m2 area in square meters
87809          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87810          */
87811         function displayArea(m2, isImperial) {
87812             var d = m2 * (isImperial ? 10.7639111056 : 1);
87813             var d1, d2, area;
87814             var unit1 = '';
87815             var unit2 = '';
87816
87817             if (isImperial) {
87818                 if (d >= 6969600) { // > 0.25mi² show mi²
87819                     d1 = d / 27878400;
87820                     unit1 = 'square_miles';
87821                 } else {
87822                     d1 = d;
87823                     unit1 = 'square_feet';
87824                 }
87825
87826                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
87827                     d2 = d / 43560;
87828                     unit2 = 'acres';
87829                 }
87830
87831             } else {
87832                 if (d >= 250000) { // > 0.25km² show km²
87833                     d1 = d / 1000000;
87834                     unit1 = 'square_kilometers';
87835                 } else {
87836                     d1 = d;
87837                     unit1 = 'square_meters';
87838                 }
87839
87840                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
87841                     d2 = d / 10000;
87842                     unit2 = 'hectares';
87843                 }
87844             }
87845
87846             area = t('units.' + unit1, {
87847                 quantity: d1.toLocaleString(locale$2, {
87848                     maximumSignificantDigits: 4
87849                 })
87850             });
87851
87852             if (d2) {
87853                 return t('units.area_pair', {
87854                     area1: area,
87855                     area2: t('units.' + unit2, {
87856                         quantity: d2.toLocaleString(locale$2, {
87857                             maximumSignificantDigits: 2
87858                         })
87859                     })
87860                 });
87861             } else {
87862                 return area;
87863             }
87864         }
87865
87866         function wrap(x, min, max) {
87867             var d = max - min;
87868             return ((x - min) % d + d) % d + min;
87869         }
87870
87871         function clamp$1(x, min, max) {
87872             return Math.max(min, Math.min(x, max));
87873         }
87874
87875         function displayCoordinate(deg, pos, neg) {
87876             var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
87877             var sec = (min - Math.floor(min)) * 60;
87878             var displayDegrees = t('units.arcdegrees', {
87879                 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
87880             });
87881             var displayCoordinate;
87882
87883             if (Math.floor(sec) > 0) {
87884                 displayCoordinate = displayDegrees +
87885                     t('units.arcminutes', {
87886                         quantity: Math.floor(min).toLocaleString(locale$2)
87887                     }) +
87888                     t('units.arcseconds', {
87889                         quantity: Math.round(sec).toLocaleString(locale$2)
87890                     });
87891             } else if (Math.floor(min) > 0) {
87892                 displayCoordinate = displayDegrees +
87893                     t('units.arcminutes', {
87894                         quantity: Math.round(min).toLocaleString(locale$2)
87895                     });
87896             } else {
87897                 displayCoordinate = t('units.arcdegrees', {
87898                     quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
87899                 });
87900             }
87901
87902             if (deg === 0) {
87903                 return displayCoordinate;
87904             } else {
87905                 return t('units.coordinate', {
87906                     coordinate: displayCoordinate,
87907                     direction: t('units.' + (deg > 0 ? pos : neg))
87908                 });
87909             }
87910         }
87911
87912         /**
87913          * Returns given coordinate pair in degree-minute-second format.
87914          *
87915          * @param {Array<Number>} coord longitude and latitude
87916          */
87917         function dmsCoordinatePair(coord) {
87918             return t('units.coordinate_pair', {
87919                 latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
87920                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
87921             });
87922         }
87923
87924         /**
87925          * Returns the given coordinate pair in decimal format.
87926          * note: unlocalized to avoid comma ambiguity - see #4765
87927          *
87928          * @param {Array<Number>} coord longitude and latitude
87929          */
87930         function decimalCoordinatePair(coord) {
87931             return t('units.coordinate_pair', {
87932                 latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
87933                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
87934             });
87935         }
87936
87937         function uiPanelLocation(context) {
87938             var currLocation = '';
87939
87940
87941             function redraw(selection) {
87942                 selection.html('');
87943
87944                 var list = selection
87945                     .append('ul');
87946
87947                 // Mouse coordinates
87948                 var coord = context.map().mouseCoordinates();
87949                 if (coord.some(isNaN)) {
87950                     coord = context.map().center();
87951                 }
87952
87953                 list
87954                     .append('li')
87955                     .text(dmsCoordinatePair(coord))
87956                     .append('li')
87957                     .text(decimalCoordinatePair(coord));
87958
87959                 // Location Info
87960                 selection
87961                     .append('div')
87962                     .attr('class', 'location-info')
87963                     .text(currLocation || ' ');
87964
87965                 debouncedGetLocation(selection, coord);
87966             }
87967
87968
87969             var debouncedGetLocation = debounce(getLocation, 250);
87970             function getLocation(selection, coord) {
87971                 if (!services$1.geocoder) {
87972                     currLocation = t('info_panels.location.unknown_location');
87973                     selection.selectAll('.location-info')
87974                         .text(currLocation);
87975                 } else {
87976                     services$1.geocoder.reverse(coord, function(err, result) {
87977                         currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
87978                         selection.selectAll('.location-info')
87979                             .text(currLocation);
87980                     });
87981                 }
87982             }
87983
87984
87985             var panel = function(selection) {
87986                 selection.call(redraw);
87987
87988                 context.surface()
87989                     .on('mousemove.info-location', function() {
87990                         selection.call(redraw);
87991                     });
87992             };
87993
87994             panel.off = function() {
87995                 context.surface()
87996                     .on('mousemove.info-location', null);
87997             };
87998
87999             panel.id = 'location';
88000             panel.title = t('info_panels.location.title');
88001             panel.key = t('info_panels.location.key');
88002
88003
88004             return panel;
88005         }
88006
88007         function uiPanelMeasurement(context) {
88008             var locale = utilDetect().locale;
88009             var isImperial = (locale.toLowerCase() === 'en-us');
88010
88011
88012             function radiansToMeters(r) {
88013                 // using WGS84 authalic radius (6371007.1809 m)
88014                 return r * 6371007.1809;
88015             }
88016
88017             function steradiansToSqmeters(r) {
88018                 // http://gis.stackexchange.com/a/124857/40446
88019                 return r / (4 * Math.PI) * 510065621724000;
88020             }
88021
88022
88023             function toLineString(feature) {
88024                 if (feature.type === 'LineString') return feature;
88025
88026                 var result = { type: 'LineString', coordinates: [] };
88027                 if (feature.type === 'Polygon') {
88028                     result.coordinates = feature.coordinates[0];
88029                 } else if (feature.type === 'MultiPolygon') {
88030                     result.coordinates = feature.coordinates[0][0];
88031                 }
88032
88033                 return result;
88034             }
88035
88036
88037             function nodeCount(feature) {
88038               if (feature.type === 'LineString') return feature.coordinates.length;
88039               if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
88040             }
88041
88042
88043             function redraw(selection) {
88044                 var resolver = context.graph();
88045                 var selectedNoteID = context.selectedNoteID();
88046                 var osm = services$1.osm;
88047
88048                 var selected, center, entity, note, geometry;
88049
88050                 if (selectedNoteID && osm) {       // selected 1 note
88051                     selected = [ t('note.note') + ' ' + selectedNoteID ];
88052                     note = osm.getNote(selectedNoteID);
88053                     center = note.loc;
88054                     geometry = 'note';
88055
88056                 } else {                           // selected 1..n entities
88057                     var extent = geoExtent();
88058                     selected = context.selectedIDs()
88059                         .filter(function(e) { return context.hasEntity(e); });
88060                     if (selected.length) {
88061                         for (var i = 0; i < selected.length; i++) {
88062                             entity = context.entity(selected[i]);
88063                             extent._extend(entity.extent(resolver));
88064                         }
88065                         center = extent.center();
88066                         geometry = entity.geometry(resolver);
88067                     }
88068                 }
88069
88070                 var singular = selected.length === 1 ? selected[0] : null;
88071
88072                 selection.html('');
88073
88074                 selection
88075                     .append('h4')
88076                     .attr('class', 'measurement-heading')
88077                     .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
88078
88079                 if (!selected.length) return;
88080
88081
88082                 var list = selection
88083                     .append('ul');
88084                 var coordItem;
88085
88086                 // multiple selected features, just display extent center..
88087                 if (!singular) {
88088                     coordItem = list
88089                         .append('li')
88090                         .text(t('info_panels.measurement.center') + ':');
88091                     coordItem.append('span')
88092                         .text(dmsCoordinatePair(center));
88093                     coordItem.append('span')
88094                         .text(decimalCoordinatePair(center));
88095                     return;
88096                 }
88097
88098                 // single selected feature, display details..
88099                 if (geometry === 'line' || geometry === 'area') {
88100                     var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
88101                     var feature = entity.asGeoJSON(resolver);
88102                     var length = radiansToMeters(d3_geoLength(toLineString(feature)));
88103                     var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
88104                     var centroid = d3_geoCentroid(feature);
88105
88106                     list
88107                         .append('li')
88108                         .text(t('info_panels.measurement.geometry') + ':')
88109                         .append('span')
88110                         .text(
88111                             closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
88112                         );
88113
88114                     if (entity.type !== 'relation') {
88115                         list
88116                             .append('li')
88117                             .text(t('info_panels.measurement.node_count') + ':')
88118                             .append('span')
88119                             .text(nodeCount(feature).toLocaleString(locale));
88120                     }
88121
88122                     if (closed) {
88123                         var area = steradiansToSqmeters(entity.area(resolver));
88124                         list
88125                             .append('li')
88126                             .text(t('info_panels.measurement.area') + ':')
88127                             .append('span')
88128                             .text(displayArea(area, isImperial));
88129                     }
88130
88131
88132                     list
88133                         .append('li')
88134                         .text(lengthLabel + ':')
88135                         .append('span')
88136                         .text(displayLength(length, isImperial));
88137
88138                     coordItem = list
88139                         .append('li')
88140                         .text(t('info_panels.measurement.centroid') + ':');
88141                     coordItem.append('span')
88142                         .text(dmsCoordinatePair(centroid));
88143                     coordItem.append('span')
88144                         .text(decimalCoordinatePair(centroid));
88145
88146                     var toggle  = isImperial ? 'imperial' : 'metric';
88147
88148                     selection
88149                         .append('a')
88150                         .text(t('info_panels.measurement.' + toggle))
88151                         .attr('href', '#')
88152                         .attr('class', 'button button-toggle-units')
88153                         .on('click', function() {
88154                             event.preventDefault();
88155                             isImperial = !isImperial;
88156                             selection.call(redraw);
88157                         });
88158
88159                 } else {
88160                     var centerLabel = t('info_panels.measurement.' +
88161                         (note || entity.type === 'node' ? 'location' : 'center'));
88162
88163                     list
88164                         .append('li')
88165                         .text(t('info_panels.measurement.geometry') + ':')
88166                         .append('span')
88167                         .text(t('geometry.' + geometry));
88168
88169                     coordItem = list
88170                         .append('li')
88171                         .text(centerLabel + ':');
88172                     coordItem.append('span')
88173                         .text(dmsCoordinatePair(center));
88174                     coordItem.append('span')
88175                         .text(decimalCoordinatePair(center));
88176                 }
88177             }
88178
88179
88180             var panel = function(selection) {
88181                 selection.call(redraw);
88182
88183                 context.map()
88184                     .on('drawn.info-measurement', function() {
88185                         selection.call(redraw);
88186                     });
88187
88188                 context
88189                     .on('enter.info-measurement', function() {
88190                         selection.call(redraw);
88191                     });
88192             };
88193
88194             panel.off = function() {
88195                 context.map().on('drawn.info-measurement', null);
88196                 context.on('enter.info-measurement', null);
88197             };
88198
88199             panel.id = 'measurement';
88200             panel.title = t('info_panels.measurement.title');
88201             panel.key = t('info_panels.measurement.key');
88202
88203
88204             return panel;
88205         }
88206
88207         var uiInfoPanels = {
88208             background: uiPanelBackground,
88209             history: uiPanelHistory,
88210             location: uiPanelLocation,
88211             measurement: uiPanelMeasurement,
88212         };
88213
88214         function uiInfo(context) {
88215             var ids = Object.keys(uiInfoPanels);
88216             var wasActive = ['measurement'];
88217             var panels = {};
88218             var active = {};
88219
88220             // create panels
88221             ids.forEach(function(k) {
88222                 if (!panels[k]) {
88223                     panels[k] = uiInfoPanels[k](context);
88224                     active[k] = false;
88225                 }
88226             });
88227
88228
88229             function info(selection) {
88230
88231                 function redraw() {
88232                     var activeids = ids.filter(function(k) { return active[k]; }).sort();
88233
88234                     var containers = infoPanels.selectAll('.panel-container')
88235                         .data(activeids, function(k) { return k; });
88236
88237                     containers.exit()
88238                         .style('opacity', 1)
88239                         .transition()
88240                         .duration(200)
88241                         .style('opacity', 0)
88242                         .on('end', function(d) {
88243                             d3_select(this)
88244                                 .call(panels[d].off)
88245                                 .remove();
88246                         });
88247
88248                     var enter = containers.enter()
88249                         .append('div')
88250                         .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
88251
88252                     enter
88253                         .style('opacity', 0)
88254                         .transition()
88255                         .duration(200)
88256                         .style('opacity', 1);
88257
88258                     var title = enter
88259                         .append('div')
88260                         .attr('class', 'panel-title fillD2');
88261
88262                     title
88263                         .append('h3')
88264                         .text(function(d) { return panels[d].title; });
88265
88266                     title
88267                         .append('button')
88268                         .attr('class', 'close')
88269                         .on('click', function (d) { toggle(d); })
88270                         .call(svgIcon('#iD-icon-close'));
88271
88272                     enter
88273                         .append('div')
88274                         .attr('class', function(d) { return 'panel-content panel-content-' + d; });
88275
88276
88277                     // redraw the panels
88278                     infoPanels.selectAll('.panel-content')
88279                         .each(function(d) {
88280                             d3_select(this).call(panels[d]);
88281                         });
88282                 }
88283
88284
88285                 function toggle(which) {
88286                     if (event) {
88287                         event.stopImmediatePropagation();
88288                         event.preventDefault();
88289                     }
88290
88291                     var activeids = ids.filter(function(k) { return active[k]; });
88292
88293                     if (which) {  // toggle one
88294                         active[which] = !active[which];
88295                         if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
88296                             wasActive = [which];
88297                         }
88298                     } else {      // toggle all
88299                         if (activeids.length) {
88300                             wasActive = activeids;
88301                             activeids.forEach(function(k) { active[k] = false; });
88302                         } else {
88303                             wasActive.forEach(function(k) { active[k] = true; });
88304                         }
88305                     }
88306
88307                     redraw();
88308                 }
88309
88310
88311                 var infoPanels = selection.selectAll('.info-panels')
88312                     .data([0]);
88313
88314                 infoPanels = infoPanels.enter()
88315                     .append('div')
88316                     .attr('class', 'info-panels')
88317                     .merge(infoPanels);
88318
88319                 redraw();
88320
88321                 context.keybinding()
88322                     .on(uiCmd('⌘' + t('info_panels.key')), toggle);
88323
88324                 ids.forEach(function(k) {
88325                     var key = t('info_panels.' + k + '.key', { default: null });
88326                     if (!key) return;
88327                     context.keybinding()
88328                         .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
88329                 });
88330             }
88331
88332             return info;
88333         }
88334
88335         function uiIssues(context) {
88336             var key = t('issues.key');
88337
88338             var MINSQUARE = 0;
88339             var MAXSQUARE = 20;
88340             var DEFAULTSQUARE = 5;  // see also unsquare_way.js
88341
88342             var _errorsSelection = d3_select(null);
88343             var _warningsSelection = d3_select(null);
88344             var _rulesList = d3_select(null);
88345             var _pane = d3_select(null);
88346             var _toggleButton = d3_select(null);
88347
88348             var _errors = [];
88349             var _warnings = [];
88350             var _options = {
88351                 what: context.storage('validate-what') || 'edited',    // 'all', 'edited'
88352                 where: context.storage('validate-where') || 'all'  // 'all', 'visible'
88353             };
88354
88355             // listeners
88356             context.validator().on('validated.uiIssues',
88357                 function() { window.requestIdleCallback(update); }
88358             );
88359             context.map().on('move.uiIssues',
88360                 debounce(function() { window.requestIdleCallback(update); }, 1000)
88361             );
88362
88363
88364             function addNotificationBadge(selection) {
88365                 var d = 10;
88366                 selection.selectAll('svg.notification-badge')
88367                     .data([0])
88368                     .enter()
88369                     .append('svg')
88370                     .attr('viewbox', '0 0 ' + d + ' ' + d)
88371                     .attr('class', 'notification-badge hide')
88372                     .append('circle')
88373                     .attr('cx', d / 2)
88374                     .attr('cy', d / 2)
88375                     .attr('r', (d / 2) - 1)
88376                     .attr('fill', 'currentColor');
88377             }
88378
88379
88380             function renderErrorsList(selection) {
88381                 _errorsSelection = selection
88382                     .call(drawIssuesList, 'errors', _errors);
88383             }
88384
88385
88386             function renderWarningsList(selection) {
88387                 _warningsSelection = selection
88388                     .call(drawIssuesList, 'warnings', _warnings);
88389             }
88390
88391
88392             function drawIssuesList(selection, which, issues) {
88393                 var list = selection.selectAll('.issues-list')
88394                     .data([0]);
88395
88396                 list = list.enter()
88397                     .append('ul')
88398                     .attr('class', 'layer-list issues-list ' + which + '-list')
88399                     .merge(list);
88400
88401
88402                 var items = list.selectAll('li')
88403                     .data(issues, function(d) { return d.id; });
88404
88405                 // Exit
88406                 items.exit()
88407                     .remove();
88408
88409                 // Enter
88410                 var itemsEnter = items.enter()
88411                     .append('li')
88412                     .attr('class', function (d) { return 'issue severity-' + d.severity; })
88413                     .on('click', function(d) {
88414                         context.validator().focusIssue(d);
88415                     })
88416                     .on('mouseover', function(d) {
88417                         utilHighlightEntities(d.entityIds, true, context);
88418                     })
88419                     .on('mouseout', function(d) {
88420                         utilHighlightEntities(d.entityIds, false, context);
88421                     });
88422
88423
88424                 var labelsEnter = itemsEnter
88425                     .append('div')
88426                     .attr('class', 'issue-label');
88427
88428                 var textEnter = labelsEnter
88429                     .append('span')
88430                     .attr('class', 'issue-text');
88431
88432                 textEnter
88433                     .append('span')
88434                     .attr('class', 'issue-icon')
88435                     .each(function(d) {
88436                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
88437                         d3_select(this)
88438                             .call(svgIcon(iconName));
88439                     });
88440
88441                 textEnter
88442                     .append('span')
88443                     .attr('class', 'issue-message');
88444
88445                 /*
88446                 labelsEnter
88447                     .append('span')
88448                     .attr('class', 'issue-autofix')
88449                     .each(function(d) {
88450                         if (!d.autoFix) return;
88451
88452                         d3_select(this)
88453                             .append('button')
88454                             .attr('title', t('issues.fix_one.title'))
88455                             .datum(d.autoFix)  // set button datum to the autofix
88456                             .attr('class', 'autofix action')
88457                             .on('click', function(d) {
88458                                 d3_event.preventDefault();
88459                                 d3_event.stopPropagation();
88460
88461                                 var issuesEntityIDs = d.issue.entityIds;
88462                                 utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
88463
88464                                 context.perform.apply(context, d.autoArgs);
88465                                 context.validator().validate();
88466                             })
88467                             .call(svgIcon('#iD-icon-wrench'));
88468                     });
88469                 */
88470
88471                 // Update
88472                 items = items
88473                     .merge(itemsEnter)
88474                     .order();
88475
88476                 items.selectAll('.issue-message')
88477                     .text(function(d) {
88478                         return d.message(context);
88479                     });
88480
88481                 /*
88482                 // autofix
88483                 var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
88484
88485                 var autoFixAll = selection.selectAll('.autofix-all')
88486                     .data(canAutoFix.length ? [0] : []);
88487
88488                 // exit
88489                 autoFixAll.exit()
88490                     .remove();
88491
88492                 // enter
88493                 var autoFixAllEnter = autoFixAll.enter()
88494                     .insert('div', '.issues-list')
88495                     .attr('class', 'autofix-all');
88496
88497                 var linkEnter = autoFixAllEnter
88498                     .append('a')
88499                     .attr('class', 'autofix-all-link')
88500                     .attr('href', '#');
88501
88502                 linkEnter
88503                     .append('span')
88504                     .attr('class', 'autofix-all-link-text')
88505                     .text(t('issues.fix_all.title'));
88506
88507                 linkEnter
88508                     .append('span')
88509                     .attr('class', 'autofix-all-link-icon')
88510                     .call(svgIcon('#iD-icon-wrench'));
88511
88512                 if (which === 'warnings') {
88513                     renderIgnoredIssuesReset(selection);
88514                 }
88515
88516                 // update
88517                 autoFixAll = autoFixAll
88518                     .merge(autoFixAllEnter);
88519
88520                 autoFixAll.selectAll('.autofix-all-link')
88521                     .on('click', function() {
88522                         context.pauseChangeDispatch();
88523                         context.perform(actionNoop());
88524                         canAutoFix.forEach(function(issue) {
88525                             var args = issue.autoFix.autoArgs.slice();  // copy
88526                             if (typeof args[args.length - 1] !== 'function') {
88527                                 args.pop();
88528                             }
88529                             args.push(t('issues.fix_all.annotation'));
88530                             context.replace.apply(context, args);
88531                         });
88532                         context.resumeChangeDispatch();
88533                         context.validator().validate();
88534                     });
88535                 */
88536             }
88537
88538
88539             function updateOptionValue(d, val) {
88540                 if (!val && event && event.target) {
88541                     val = event.target.value;
88542                 }
88543
88544                 _options[d] = val;
88545                 context.storage('validate-' + d, val);
88546                 update();
88547             }
88548
88549
88550             function renderIssuesOptions(selection) {
88551                 var container = selection.selectAll('.issues-options-container')
88552                     .data([0]);
88553
88554                 container = container.enter()
88555                     .append('div')
88556                     .attr('class', 'issues-options-container')
88557                     .merge(container);
88558
88559                 var data = [
88560                     { key: 'what', values: ['edited', 'all'] },
88561                     { key: 'where', values: ['visible', 'all'] }
88562                 ];
88563
88564                 var options = container.selectAll('.issues-option')
88565                     .data(data, function(d) { return d.key; });
88566
88567                 var optionsEnter = options.enter()
88568                     .append('div')
88569                     .attr('class', function(d) { return 'issues-option issues-option-' + d.key; });
88570
88571                 optionsEnter
88572                     .append('div')
88573                     .attr('class', 'issues-option-title')
88574                     .text(function(d) { return t('issues.options.' + d.key + '.title'); });
88575
88576                 var valuesEnter = optionsEnter.selectAll('label')
88577                     .data(function(d) {
88578                         return d.values.map(function(val) { return { value: val, key: d.key }; });
88579                     })
88580                     .enter()
88581                     .append('label');
88582
88583                 valuesEnter
88584                     .append('input')
88585                     .attr('type', 'radio')
88586                     .attr('name', function(d) { return 'issues-option-' + d.key; })
88587                     .attr('value', function(d) { return d.value; })
88588                     .property('checked', function(d) { return _options[d.key] === d.value; })
88589                     .on('change', function(d) { updateOptionValue(d.key, d.value); });
88590
88591                 valuesEnter
88592                     .append('span')
88593                     .text(function(d) { return t('issues.options.' + d.key + '.' + d.value); });
88594             }
88595
88596
88597             function renderNoIssuesBox(selection) {
88598
88599                 var box = selection.append('div')
88600                     .attr('class', 'box');
88601
88602                 box
88603                     .append('div')
88604                     .call(svgIcon('#iD-icon-apply', 'pre-text'));
88605
88606                 var noIssuesMessage = box
88607                     .append('span');
88608
88609                 noIssuesMessage
88610                     .append('strong')
88611                     .attr('class', 'message');
88612
88613                 noIssuesMessage
88614                     .append('br');
88615
88616                 noIssuesMessage
88617                     .append('span')
88618                     .attr('class', 'details');
88619             }
88620
88621             function renderIgnoredIssuesReset(selection) {
88622
88623                 var ignoredIssues = context.validator()
88624                     .getIssues(Object.assign({ includeIgnored: 'only' }, _options));
88625
88626                 var resetIgnored = selection.selectAll('.reset-ignored')
88627                     .data(ignoredIssues.length ? [0] : []);
88628
88629                 // exit
88630                 resetIgnored.exit()
88631                     .remove();
88632
88633                 // enter
88634                 var resetIgnoredEnter = resetIgnored.enter()
88635                     .append('div')
88636                     .attr('class', 'reset-ignored section-footer');
88637
88638                 resetIgnoredEnter
88639                     .append('a')
88640                     .attr('href', '#');
88641
88642                 // update
88643                 resetIgnored = resetIgnored
88644                     .merge(resetIgnoredEnter);
88645
88646                 resetIgnored.select('a')
88647                     .text(t('issues.reset_ignored', { count: ignoredIssues.length.toString() }));
88648
88649                 resetIgnored.on('click', function() {
88650                         context.validator().resetIgnoredIssues();
88651                     });
88652             }
88653
88654
88655             function renderRulesList(selection) {
88656                 var container = selection.selectAll('.issues-rulelist-container')
88657                     .data([0]);
88658
88659                 var containerEnter = container.enter()
88660                     .append('div')
88661                     .attr('class', 'issues-rulelist-container');
88662
88663                 containerEnter
88664                     .append('ul')
88665                     .attr('class', 'layer-list issue-rules-list');
88666
88667                 var ruleLinks = containerEnter
88668                     .append('div')
88669                     .attr('class', 'issue-rules-links section-footer');
88670
88671                 ruleLinks
88672                     .append('a')
88673                     .attr('class', 'issue-rules-link')
88674                     .attr('href', '#')
88675                     .text(t('issues.enable_all'))
88676                     .on('click', function() {
88677                         context.validator().disableRules([]);
88678                     });
88679
88680                 ruleLinks
88681                     .append('a')
88682                     .attr('class', 'issue-rules-link')
88683                     .attr('href', '#')
88684                     .text(t('issues.disable_all'))
88685                     .on('click', function() {
88686                         var keys = context.validator().getRuleKeys();
88687                         context.validator().disableRules(keys);
88688                     });
88689
88690
88691                 // Update
88692                 container = container
88693                     .merge(containerEnter);
88694
88695                 _rulesList = container.selectAll('.issue-rules-list');
88696
88697                 updateRulesList();
88698             }
88699
88700
88701             function updateRulesList() {
88702                 var ruleKeys = context.validator().getRuleKeys();
88703                 _rulesList
88704                     .call(drawListItems, ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
88705             }
88706
88707
88708             function isRuleEnabled(d) {
88709                 return context.validator().isRuleEnabled(d);
88710             }
88711
88712
88713             function toggleRule(d) {
88714                 context.validator().toggleRule(d);
88715             }
88716
88717             function setNoIssuesText() {
88718
88719                 function checkForHiddenIssues(cases) {
88720                     for (var type in cases) {
88721                         var opts = cases[type];
88722                         var hiddenIssues = context.validator().getIssues(opts);
88723                         if (hiddenIssues.length) {
88724                             _pane.select('.issues-none .details')
88725                                 .text(t(
88726                                     'issues.no_issues.hidden_issues.' + type,
88727                                     { count: hiddenIssues.length.toString() }
88728                                 ));
88729                             return;
88730                         }
88731                     }
88732                     _pane.select('.issues-none .details')
88733                         .text(t('issues.no_issues.hidden_issues.none'));
88734                 }
88735
88736                 var messageType;
88737
88738                 if (_options.what === 'edited' && _options.where === 'visible') {
88739
88740                     messageType = 'edits_in_view';
88741
88742                     checkForHiddenIssues({
88743                         elsewhere: { what: 'edited', where: 'all' },
88744                         other_features: { what: 'all', where: 'visible' },
88745                         disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
88746                         other_features_elsewhere: { what: 'all', where: 'all' },
88747                         disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88748                         ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
88749                         ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
88750                     });
88751
88752                 } else if (_options.what === 'edited' && _options.where === 'all') {
88753
88754                     messageType = 'edits';
88755
88756                     checkForHiddenIssues({
88757                         other_features: { what: 'all', where: 'all' },
88758                         disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88759                         ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
88760                     });
88761
88762                 } else if (_options.what === 'all' && _options.where === 'visible') {
88763
88764                     messageType = 'everything_in_view';
88765
88766                     checkForHiddenIssues({
88767                         elsewhere: { what: 'all', where: 'all' },
88768                         disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
88769                         disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88770                         ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
88771                         ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
88772                     });
88773                 } else if (_options.what === 'all' && _options.where === 'all') {
88774
88775                     messageType = 'everything';
88776
88777                     checkForHiddenIssues({
88778                         disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88779                         ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
88780                     });
88781                 }
88782
88783                 _pane.select('.issues-none .message')
88784                     .text(t('issues.no_issues.message.' + messageType));
88785
88786             }
88787
88788
88789             function update() {
88790                 var issuesBySeverity = context.validator().getIssuesBySeverity(_options);
88791
88792                 // sort issues by distance away from the center of the map
88793                 var center = context.map().center();
88794                 var graph = context.graph();
88795                 _errors = issuesBySeverity.error.map(withDistance).sort(byDistance);
88796                 _warnings = issuesBySeverity.warning.map(withDistance).sort(byDistance);
88797
88798                 // cut off at 1000
88799                 var errorCount = _errors.length > 1000 ? '1000+' : String(_errors.length);
88800                 var warningCount = _warnings.length > 1000 ? '1000+' : String(_warnings.length);
88801                 _errors = _errors.slice(0, 1000);
88802                 _warnings = _warnings.slice(0, 1000);
88803
88804
88805                 _toggleButton.selectAll('.notification-badge')
88806                     .classed('error', (_errors.length > 0))
88807                     .classed('warning', (_errors.length === 0 && _warnings.length > 0))
88808                     .classed('hide', (_errors.length === 0 && _warnings.length === 0));
88809
88810
88811                 _pane.selectAll('.issues-errors')
88812                     .classed('hide', _errors.length === 0);
88813
88814                 if (_errors.length > 0) {
88815                     _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text')
88816                         .text(t('issues.errors.list_title', { count: errorCount }));
88817                     if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
88818                         _errorsSelection
88819                             .call(drawIssuesList, 'errors', _errors);
88820                     }
88821                 }
88822
88823                 _pane.selectAll('.issues-warnings')
88824                     .classed('hide', _warnings.length === 0);
88825
88826                 if (_warnings.length > 0) {
88827                     _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text')
88828                         .text(t('issues.warnings.list_title', { count: warningCount }));
88829                     if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
88830                         _warningsSelection
88831                             .call(drawIssuesList, 'warnings', _warnings);
88832                     }
88833                 }
88834
88835                 var hasIssues = _warnings.length > 0 || _errors.length > 0;
88836
88837                 var issuesNone = _pane.select('.issues-none');
88838                 issuesNone.classed('hide', hasIssues);
88839                 if (!hasIssues) {
88840                     renderIgnoredIssuesReset(issuesNone);
88841                     setNoIssuesText();
88842                 }
88843
88844                 if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
88845                     updateRulesList();
88846                 }
88847
88848
88849                 function byDistance(a, b) {
88850                     return a.dist - b.dist;
88851                 }
88852
88853                 function withDistance(issue) {
88854                     var extent = issue.extent(graph);
88855                     var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
88856                     return Object.assign(issue, { dist: dist });
88857                 }
88858             }
88859
88860
88861             function drawListItems(selection, data, type, name, change, active) {
88862                 var items = selection.selectAll('li')
88863                     .data(data);
88864
88865                 // Exit
88866                 items.exit()
88867                     .remove();
88868
88869                 // Enter
88870                 var enter = items.enter()
88871                     .append('li');
88872
88873                 if (name === 'rule') {
88874                     enter
88875                         .call(tooltip()
88876                             .title(function(d) { return t('issues.' + d + '.tip'); })
88877                             .placement('top')
88878                         );
88879                 }
88880
88881                 var label = enter
88882                     .append('label');
88883
88884                 label
88885                     .append('input')
88886                     .attr('type', type)
88887                     .attr('name', name)
88888                     .on('change', change);
88889
88890                 label
88891                     .append('span')
88892                     .html(function(d) {
88893                         var params = {};
88894                         if (d === 'unsquare_way') {
88895                             params.val = '<span class="square-degrees"></span>';
88896                         }
88897                         return t('issues.' + d + '.title', params);
88898                     });
88899
88900                 // Update
88901                 items = items
88902                     .merge(enter);
88903
88904                 items
88905                     .classed('active', active)
88906                     .selectAll('input')
88907                     .property('checked', active)
88908                     .property('indeterminate', false);
88909
88910
88911                 // user-configurable square threshold
88912                 var degStr = context.storage('validate-square-degrees');
88913                 if (degStr === null) {
88914                     degStr = '' + DEFAULTSQUARE;
88915                 }
88916
88917                 var span = items.selectAll('.square-degrees');
88918                 var input = span.selectAll('.square-degrees-input')
88919                     .data([0]);
88920
88921                 // enter / update
88922                 input.enter()
88923                     .append('input')
88924                     .attr('type', 'number')
88925                     .attr('min', '' + MINSQUARE)
88926                     .attr('max', '' + MAXSQUARE)
88927                     .attr('step', '0.5')
88928                     .attr('class', 'square-degrees-input')
88929                     .call(utilNoAuto)
88930                     .on('input', function() {
88931                         this.style.width = (this.value.length + 2.5) + 'ch';   // resize
88932                     })
88933                     .on('click', function () {
88934                         event.preventDefault();
88935                         event.stopPropagation();
88936                         this.select();
88937                     })
88938                     .on('keyup', function () {
88939                         if (event.keyCode === 13) { // enter
88940                             this.blur();
88941                             this.select();
88942                         }
88943                     })
88944                     .on('blur', changeSquare)
88945                     .merge(input)
88946                     .property('value', degStr)
88947                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88948             }
88949
88950
88951             function changeSquare() {
88952                 var input = d3_select(this);
88953                 var degStr = utilGetSetValue(input).trim();
88954                 var degNum = parseFloat(degStr, 10);
88955
88956                 if (!isFinite(degNum)) {
88957                     degNum = DEFAULTSQUARE;
88958                 } else if (degNum > MAXSQUARE) {
88959                     degNum = MAXSQUARE;
88960                 } else if (degNum < MINSQUARE) {
88961                     degNum = MINSQUARE;
88962                 }
88963
88964                 degNum = Math.round(degNum * 10 ) / 10;   // round to 1 decimal
88965                 degStr = '' + degNum;
88966
88967                 input
88968                     .property('value', degStr)
88969                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88970
88971                 context.storage('validate-square-degrees', degStr);
88972                 context.validator().changeSquareThreshold(degNum);
88973             }
88974
88975
88976             function hidePane() {
88977                 context.ui().togglePanes();
88978             }
88979
88980
88981
88982             var paneTooltip = tooltip()
88983                 .placement((textDirection === 'rtl') ? 'right' : 'left')
88984                 .html(true)
88985                 .title(uiTooltipHtml(t('issues.title'), key));
88986
88987
88988
88989             uiIssues.togglePane = function() {
88990                 if (event) event.preventDefault();
88991                 paneTooltip.hide(_toggleButton);
88992                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
88993             };
88994
88995
88996             uiIssues.renderToggleButton = function(selection) {
88997                 _toggleButton = selection
88998                     .append('button')
88999                     .attr('tabindex', -1)
89000                     .on('click', uiIssues.togglePane)
89001                     .call(svgIcon('#iD-icon-alert', 'light'))
89002                     .call(addNotificationBadge)
89003                     .call(paneTooltip);
89004             };
89005
89006
89007             uiIssues.renderPane = function(selection) {
89008                 _pane = selection
89009                     .append('div')
89010                     .attr('class', 'fillL map-pane issues-pane hide')
89011                     .attr('pane', 'map-issues');
89012
89013                 var heading = _pane
89014                     .append('div')
89015                     .attr('class', 'pane-heading');
89016
89017                 heading
89018                     .append('h2')
89019                     .text(t('issues.title'));
89020
89021                 heading
89022                     .append('button')
89023                     .on('click', hidePane)
89024                     .call(svgIcon('#iD-icon-close'));
89025
89026                 var content = _pane
89027                     .append('div')
89028                     .attr('class', 'pane-content');
89029
89030                 content
89031                     .append('div')
89032                     .attr('class', 'issues-options')
89033                     .call(renderIssuesOptions);
89034
89035                 content
89036                     .append('div')
89037                     .attr('class', 'issues-none')
89038                     .call(renderNoIssuesBox);
89039
89040                 // errors
89041                 content
89042                     .append('div')
89043                     .attr('class', 'issues-errors')
89044                     .call(uiDisclosure(context, 'issues_errors', true)
89045                         .content(renderErrorsList)
89046                     );
89047
89048                 // warnings
89049                 content
89050                     .append('div')
89051                     .attr('class', 'issues-warnings')
89052                     .call(uiDisclosure(context, 'issues_warnings', true)
89053                         .content(renderWarningsList)
89054                     );
89055
89056                 // rules
89057                 content
89058                     .append('div')
89059                     .attr('class', 'issues-rules')
89060                     .call(uiDisclosure(context, 'issues_rules', false)
89061                         .title(t('issues.rules.title'))
89062                         .content(renderRulesList)
89063                     );
89064
89065                 // update();
89066
89067                 context.keybinding()
89068                     .on(key, uiIssues.togglePane);
89069             };
89070
89071             return uiIssues;
89072         }
89073
89074         function uiSettingsCustomData(context) {
89075             var dispatch$1 = dispatch('change');
89076
89077             function render(selection) {
89078                 var dataLayer = context.layers().layer('data');
89079
89080                 // keep separate copies of original and current settings
89081                 var _origSettings = {
89082                     fileList: (dataLayer && dataLayer.fileList()) || null,
89083                     url: context.storage('settings-custom-data-url')
89084                 };
89085                 var _currSettings = {
89086                     fileList: (dataLayer && dataLayer.fileList()) || null,
89087                     url: context.storage('settings-custom-data-url')
89088                 };
89089
89090                 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
89091                 var modal = uiConfirm(selection).okButton();
89092
89093                 modal
89094                     .classed('settings-modal settings-custom-data', true);
89095
89096                 modal.select('.modal-section.header')
89097                     .append('h3')
89098                     .text(t('settings.custom_data.header'));
89099
89100
89101                 var textSection = modal.select('.modal-section.message-text');
89102
89103                 textSection
89104                     .append('pre')
89105                     .attr('class', 'instructions-file')
89106                     .text(t('settings.custom_data.file.instructions'));
89107
89108                 textSection
89109                     .append('input')
89110                     .attr('class', 'field-file')
89111                     .attr('type', 'file')
89112                     .property('files', _currSettings.fileList)  // works for all except IE11
89113                     .on('change', function() {
89114                         var files = event.target.files;
89115                         if (files && files.length) {
89116                             _currSettings.url = '';
89117                             textSection.select('.field-url').property('value', '');
89118                             _currSettings.fileList = files;
89119                         } else {
89120                             _currSettings.fileList = null;
89121                         }
89122                     });
89123
89124                 textSection
89125                     .append('h4')
89126                     .text(t('settings.custom_data.or'));
89127
89128                 textSection
89129                     .append('pre')
89130                     .attr('class', 'instructions-url')
89131                     .text(t('settings.custom_data.url.instructions'));
89132
89133                 textSection
89134                     .append('textarea')
89135                     .attr('class', 'field-url')
89136                     .attr('placeholder', t('settings.custom_data.url.placeholder'))
89137                     .call(utilNoAuto)
89138                     .property('value', _currSettings.url);
89139
89140
89141                 // insert a cancel button
89142                 var buttonSection = modal.select('.modal-section.buttons');
89143
89144                 buttonSection
89145                     .insert('button', '.ok-button')
89146                     .attr('class', 'button cancel-button secondary-action')
89147                     .text(t('confirm.cancel'));
89148
89149
89150                 buttonSection.select('.cancel-button')
89151                     .on('click.cancel', clickCancel);
89152
89153                 buttonSection.select('.ok-button')
89154                     .attr('disabled', isSaveDisabled)
89155                     .on('click.save', clickSave);
89156
89157
89158                 function isSaveDisabled() {
89159                     return null;
89160                 }
89161
89162
89163                 // restore the original url
89164                 function clickCancel() {
89165                     textSection.select('.field-url').property('value', _origSettings.url);
89166                     context.storage('settings-custom-data-url', _origSettings.url);
89167                     this.blur();
89168                     modal.close();
89169                 }
89170
89171                 // accept the current url
89172                 function clickSave() {
89173                     _currSettings.url = textSection.select('.field-url').property('value').trim();
89174
89175                     // one or the other but not both
89176                     if (_currSettings.url) { _currSettings.fileList = null; }
89177                     if (_currSettings.fileList) { _currSettings.url = ''; }
89178
89179                     context.storage('settings-custom-data-url', _currSettings.url);
89180                     this.blur();
89181                     modal.close();
89182                     dispatch$1.call('change', this, _currSettings);
89183                 }
89184             }
89185
89186             return utilRebind(render, dispatch$1, 'on');
89187         }
89188
89189         function uiMapData(context) {
89190             var key = t('map_data.key');
89191             var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key'));
89192             var features = context.features().keys();
89193             var layers = context.layers();
89194             var fills = ['wireframe', 'partial', 'full'];
89195
89196             var settingsCustomData = uiSettingsCustomData(context)
89197                 .on('change', customChanged);
89198
89199             var _pane = d3_select(null), _toggleButton = d3_select(null);
89200
89201             var _fillSelected = context.storage('area-fill') || 'partial';
89202             var _dataLayerContainer = d3_select(null);
89203             var _photoOverlayContainer = d3_select(null);
89204             var _fillList = d3_select(null);
89205             var _featureList = d3_select(null);
89206             var _QAList = d3_select(null);
89207
89208
89209             function showsFeature(d) {
89210                 return context.features().enabled(d);
89211             }
89212
89213
89214             function autoHiddenFeature(d) {
89215                 if (d.type === 'kr_error') return context.errors().autoHidden(d);
89216                 return context.features().autoHidden(d);
89217             }
89218
89219
89220             function clickFeature(d) {
89221                 context.features().toggle(d);
89222                 update();
89223             }
89224
89225
89226             function showsQA(d) {
89227                 var QAKeys = [d];
89228                 var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
89229                 var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
89230
89231                 function layerSupported(d) {
89232                     return d.layer && d.layer.supported();
89233                 }
89234                 function layerEnabled(d) {
89235                     return layerSupported(d) && d.layer.enabled();
89236                 }
89237
89238                 return layerEnabled(data[0]);
89239             }
89240
89241
89242             function showsFill(d) {
89243                 return _fillSelected === d;
89244             }
89245
89246
89247             function setFill(d) {
89248                 fills.forEach(function(opt) {
89249                     context.surface().classed('fill-' + opt, Boolean(opt === d));
89250                 });
89251
89252                 _fillSelected = d;
89253                 context.storage('area-fill', d);
89254                 if (d !== 'wireframe') {
89255                     context.storage('area-fill-toggle', d);
89256                 }
89257                 update();
89258             }
89259
89260
89261             function showsLayer(which) {
89262                 var layer = layers.layer(which);
89263                 if (layer) {
89264                     return layer.enabled();
89265                 }
89266                 return false;
89267             }
89268
89269
89270             function setLayer(which, enabled) {
89271                 var layer = layers.layer(which);
89272                 if (layer) {
89273                     layer.enabled(enabled);
89274
89275                     if (!enabled && (which === 'osm' || which === 'notes')) {
89276                         context.enter(modeBrowse(context));
89277                     }
89278
89279                     update();
89280                 }
89281             }
89282
89283
89284             function toggleLayer(which) {
89285                 setLayer(which, !showsLayer(which));
89286             }
89287
89288
89289             function drawPhotoItems(selection) {
89290                 var photoKeys = context.photos().overlayLayerIDs();
89291                 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
89292                 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
89293
89294                 function layerSupported(d) {
89295                     return d.layer && d.layer.supported();
89296                 }
89297                 function layerEnabled(d) {
89298                     return layerSupported(d) && d.layer.enabled();
89299                 }
89300
89301                 var ul = selection
89302                     .selectAll('.layer-list-photos')
89303                     .data([0]);
89304
89305                 ul = ul.enter()
89306                     .append('ul')
89307                     .attr('class', 'layer-list layer-list-photos')
89308                     .merge(ul);
89309
89310                 var li = ul.selectAll('.list-item-photos')
89311                     .data(data);
89312
89313                 li.exit()
89314                     .remove();
89315
89316                 var liEnter = li.enter()
89317                     .append('li')
89318                     .attr('class', function(d) {
89319                         var classes = 'list-item-photos list-item-' + d.id;
89320                         if (d.id === 'mapillary-signs') {
89321                             classes += ' indented';
89322                         }
89323                         return classes;
89324                     });
89325
89326                 var labelEnter = liEnter
89327                     .append('label')
89328                     .each(function(d) {
89329                         var titleID;
89330                         if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
89331                         else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
89332                         else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
89333                         else titleID = d.id.replace('-', '_') + '.tooltip';
89334                         d3_select(this)
89335                             .call(tooltip()
89336                                 .title(t(titleID))
89337                                 .placement('top')
89338                             );
89339                     });
89340
89341                 labelEnter
89342                     .append('input')
89343                     .attr('type', 'checkbox')
89344                     .on('change', function(d) { toggleLayer(d.id); });
89345
89346                 labelEnter
89347                     .append('span')
89348                     .text(function(d) {
89349                         var id = d.id;
89350                         if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
89351                         return t(id.replace('-', '_') + '.title');
89352                     });
89353
89354
89355                 // Update
89356                 li
89357                     .merge(liEnter)
89358                     .classed('active', layerEnabled)
89359                     .selectAll('input')
89360                     .property('checked', layerEnabled);
89361             }
89362
89363             function drawPhotoTypeItems(selection) {
89364                 var data = context.photos().allPhotoTypes();
89365
89366                 function typeEnabled(d) {
89367                     return context.photos().showsPhotoType(d);
89368                 }
89369
89370                 var ul = selection
89371                     .selectAll('.layer-list-photo-types')
89372                     .data(context.photos().shouldFilterByPhotoType() ? [0] : []);
89373
89374                 ul.exit()
89375                     .remove();
89376
89377                 ul = ul.enter()
89378                     .append('ul')
89379                     .attr('class', 'layer-list layer-list-photo-types')
89380                     .merge(ul);
89381
89382                 var li = ul.selectAll('.list-item-photo-types')
89383                     .data(data);
89384
89385                 li.exit()
89386                     .remove();
89387
89388                 var liEnter = li.enter()
89389                     .append('li')
89390                     .attr('class', function(d) {
89391                         return 'list-item-photo-types list-item-' + d;
89392                     });
89393
89394                 var labelEnter = liEnter
89395                     .append('label')
89396                     .each(function(d) {
89397                         d3_select(this)
89398                             .call(tooltip()
89399                                 .title(t('photo_overlays.photo_type.' + d + '.tooltip'))
89400                                 .placement('top')
89401                             );
89402                     });
89403
89404                 labelEnter
89405                     .append('input')
89406                     .attr('type', 'checkbox')
89407                     .on('change', function(d) {
89408                         context.photos().togglePhotoType(d);
89409                         update();
89410                     });
89411
89412                 labelEnter
89413                     .append('span')
89414                     .text(function(d) {
89415                         return t('photo_overlays.photo_type.' + d + '.title');
89416                     });
89417
89418
89419                 // Update
89420                 li
89421                     .merge(liEnter)
89422                     .classed('active', typeEnabled)
89423                     .selectAll('input')
89424                     .property('checked', typeEnabled);
89425             }
89426
89427
89428             function drawOsmItems(selection) {
89429                 var osmKeys = ['osm', 'notes'];
89430                 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
89431
89432                 var ul = selection
89433                     .selectAll('.layer-list-osm')
89434                     .data([0]);
89435
89436                 ul = ul.enter()
89437                     .append('ul')
89438                     .attr('class', 'layer-list layer-list-osm')
89439                     .merge(ul);
89440
89441                 var li = ul.selectAll('.list-item')
89442                     .data(osmLayers);
89443
89444                 li.exit()
89445                     .remove();
89446
89447                 var liEnter = li.enter()
89448                     .append('li')
89449                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89450
89451                 var labelEnter = liEnter
89452                     .append('label')
89453                     .each(function(d) {
89454                         if (d.id === 'osm') {
89455                             d3_select(this)
89456                                 .call(tooltip()
89457                                     .html(true)
89458                                     .title(uiTooltipHtml(t('map_data.layers.' + d.id + '.tooltip'), osmDataToggleKey))
89459                                     .placement('bottom')
89460                                 );
89461                         } else {
89462                             d3_select(this)
89463                                 .call(tooltip()
89464                                     .title(t('map_data.layers.' + d.id + '.tooltip'))
89465                                     .placement('bottom')
89466                                 );
89467                         }
89468                     });
89469
89470                 labelEnter
89471                     .append('input')
89472                     .attr('type', 'checkbox')
89473                     .on('change', function(d) { toggleLayer(d.id); });
89474
89475                 labelEnter
89476                     .append('span')
89477                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89478
89479
89480                 // Update
89481                 li
89482                     .merge(liEnter)
89483                     .classed('active', function (d) { return d.layer.enabled(); })
89484                     .selectAll('input')
89485                     .property('checked', function (d) { return d.layer.enabled(); });
89486             }
89487
89488
89489             function drawQAItems(selection) {
89490                 var qaKeys = ['keepRight', 'improveOSM'];
89491                 var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
89492
89493                 var ul = selection
89494                     .selectAll('.layer-list-qa')
89495                     .data([0]);
89496
89497                 ul = ul.enter()
89498                     .append('ul')
89499                     .attr('class', 'layer-list layer-list-qa')
89500                     .merge(ul);
89501
89502                 var li = ul.selectAll('.list-item')
89503                     .data(qaLayers);
89504
89505                 li.exit()
89506                     .remove();
89507
89508                 var liEnter = li.enter()
89509                     .append('li')
89510                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89511
89512                 var labelEnter = liEnter
89513                     .append('label')
89514                     .each(function(d) {
89515                         d3_select(this)
89516                             .call(tooltip()
89517                                 .title(t('map_data.layers.' + d.id + '.tooltip'))
89518                                 .placement('bottom')
89519                             );
89520                     });
89521
89522                 labelEnter
89523                     .append('input')
89524                     .attr('type', 'checkbox')
89525                     .on('change', function(d) { toggleLayer(d.id); });
89526
89527                 labelEnter
89528                     .append('span')
89529                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89530
89531
89532                 // Update
89533                 li
89534                     .merge(liEnter)
89535                     .classed('active', function (d) { return d.layer.enabled(); })
89536                     .selectAll('input')
89537                     .property('checked', function (d) { return d.layer.enabled(); });
89538             }
89539
89540
89541             // Beta feature - sample vector layers to support Detroit Mapping Challenge
89542             // https://github.com/osmus/detroit-mapping-challenge
89543             function drawVectorItems(selection) {
89544                 var dataLayer = layers.layer('data');
89545                 var vtData = [
89546                     {
89547                         name: 'Detroit Neighborhoods/Parks',
89548                         src: 'neighborhoods-parks',
89549                         tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
89550                         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'
89551                     }, {
89552                         name: 'Detroit Composite POIs',
89553                         src: 'composite-poi',
89554                         tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
89555                         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'
89556                     }, {
89557                         name: 'Detroit All-The-Places POIs',
89558                         src: 'alltheplaces-poi',
89559                         tooltip: 'Public domain business location data created by web scrapers.',
89560                         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'
89561                     }
89562                 ];
89563
89564                 // Only show this if the map is around Detroit..
89565                 var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
89566                 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
89567
89568                 var container = selection.selectAll('.vectortile-container')
89569                     .data(showVectorItems ? [0] : []);
89570
89571                 container.exit()
89572                     .remove();
89573
89574                 var containerEnter = container.enter()
89575                     .append('div')
89576                     .attr('class', 'vectortile-container');
89577
89578                 containerEnter
89579                     .append('h4')
89580                     .attr('class', 'vectortile-header')
89581                     .text('Detroit Vector Tiles (Beta)');
89582
89583                 containerEnter
89584                     .append('ul')
89585                     .attr('class', 'layer-list layer-list-vectortile');
89586
89587                 containerEnter
89588                     .append('div')
89589                     .attr('class', 'vectortile-footer')
89590                     .append('a')
89591                     .attr('target', '_blank')
89592                     .attr('tabindex', -1)
89593                     .call(svgIcon('#iD-icon-out-link', 'inline'))
89594                     .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
89595                     .append('span')
89596                     .text('About these layers');
89597
89598                 container = container
89599                     .merge(containerEnter);
89600
89601
89602                 var ul = container.selectAll('.layer-list-vectortile');
89603
89604                 var li = ul.selectAll('.list-item')
89605                     .data(vtData);
89606
89607                 li.exit()
89608                     .remove();
89609
89610                 var liEnter = li.enter()
89611                     .append('li')
89612                     .attr('class', function(d) { return 'list-item list-item-' + d.src; });
89613
89614                 var labelEnter = liEnter
89615                     .append('label')
89616                     .each(function(d) {
89617                         d3_select(this).call(
89618                             tooltip().title(d.tooltip).placement('top')
89619                         );
89620                     });
89621
89622                 labelEnter
89623                     .append('input')
89624                     .attr('type', 'radio')
89625                     .attr('name', 'vectortile')
89626                     .on('change', selectVTLayer);
89627
89628                 labelEnter
89629                     .append('span')
89630                     .text(function(d) { return d.name; });
89631
89632                 // Update
89633                 li
89634                     .merge(liEnter)
89635                     .classed('active', isVTLayerSelected)
89636                     .selectAll('input')
89637                     .property('checked', isVTLayerSelected);
89638
89639
89640                 function isVTLayerSelected(d) {
89641                     return dataLayer && dataLayer.template() === d.template;
89642                 }
89643
89644                 function selectVTLayer(d) {
89645                     context.storage('settings-custom-data-url', d.template);
89646                     if (dataLayer) {
89647                         dataLayer.template(d.template, d.src);
89648                         dataLayer.enabled(true);
89649                     }
89650                 }
89651             }
89652
89653
89654             function drawCustomDataItems(selection) {
89655                 var dataLayer = layers.layer('data');
89656                 var hasData = dataLayer && dataLayer.hasData();
89657                 var showsData = hasData && dataLayer.enabled();
89658
89659                 var ul = selection
89660                     .selectAll('.layer-list-data')
89661                     .data(dataLayer ? [0] : []);
89662
89663                 // Exit
89664                 ul.exit()
89665                     .remove();
89666
89667                 // Enter
89668                 var ulEnter = ul.enter()
89669                     .append('ul')
89670                     .attr('class', 'layer-list layer-list-data');
89671
89672                 var liEnter = ulEnter
89673                     .append('li')
89674                     .attr('class', 'list-item-data');
89675
89676                 liEnter
89677                     .append('button')
89678                     .call(tooltip()
89679                         .title(t('settings.custom_data.tooltip'))
89680                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89681                     )
89682                     .on('click', editCustom)
89683                     .call(svgIcon('#iD-icon-more'));
89684
89685                 liEnter
89686                     .append('button')
89687                     .call(tooltip()
89688                         .title(t('map_data.layers.custom.zoom'))
89689                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89690                     )
89691                     .on('click', function() {
89692                         event.preventDefault();
89693                         event.stopPropagation();
89694                         dataLayer.fitZoom();
89695                     })
89696                     .call(svgIcon('#iD-icon-search'));
89697
89698                 var labelEnter = liEnter
89699                     .append('label')
89700                     .call(tooltip()
89701                         .title(t('map_data.layers.custom.tooltip'))
89702                         .placement('top')
89703                     );
89704
89705                 labelEnter
89706                     .append('input')
89707                     .attr('type', 'checkbox')
89708                     .on('change', function() { toggleLayer('data'); });
89709
89710                 labelEnter
89711                     .append('span')
89712                     .text(t('map_data.layers.custom.title'));
89713
89714                 // Update
89715                 ul = ul
89716                     .merge(ulEnter);
89717
89718                 ul.selectAll('.list-item-data')
89719                     .classed('active', showsData)
89720                     .selectAll('label')
89721                     .classed('deemphasize', !hasData)
89722                     .selectAll('input')
89723                     .property('disabled', !hasData)
89724                     .property('checked', showsData);
89725             }
89726
89727
89728             function editCustom() {
89729                 event.preventDefault();
89730                 context.container()
89731                     .call(settingsCustomData);
89732             }
89733
89734
89735             function customChanged(d) {
89736                 var dataLayer = layers.layer('data');
89737
89738                 if (d && d.url) {
89739                     dataLayer.url(d.url);
89740                 } else if (d && d.fileList) {
89741                     dataLayer.fileList(d.fileList);
89742                 }
89743             }
89744
89745
89746             function drawListItems(selection, data, type, name, change, active) {
89747                 var items = selection.selectAll('li')
89748                     .data(data);
89749
89750                 // Exit
89751                 items.exit()
89752                     .remove();
89753
89754                 // Enter
89755                 var enter = items.enter()
89756                     .append('li')
89757                     .call(tooltip()
89758                         .html(true)
89759                         .title(function(d) {
89760                             var tip = t(name + '.' + d + '.tooltip');
89761                             var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
89762                             if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
89763                                 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
89764                                 tip += '<div>' + msg + '</div>';
89765                             }
89766                             return uiTooltipHtml(tip, key);
89767                         })
89768                         .placement('top')
89769                     );
89770
89771                 var label = enter
89772                     .append('label');
89773
89774                 label
89775                     .append('input')
89776                     .attr('type', type)
89777                     .attr('name', name)
89778                     .on('change', change);
89779
89780                 label
89781                     .append('span')
89782                     .text(function(d) { return t(name + '.' + d + '.description'); });
89783
89784                 // Update
89785                 items = items
89786                     .merge(enter);
89787
89788                 items
89789                     .classed('active', active)
89790                     .selectAll('input')
89791                     .property('checked', active)
89792                     .property('indeterminate', function(d) {
89793                         return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
89794                     });
89795             }
89796
89797
89798             function renderDataLayers(selection) {
89799                 var container = selection.selectAll('.data-layer-container')
89800                     .data([0]);
89801
89802                 _dataLayerContainer = container.enter()
89803                     .append('div')
89804                     .attr('class', 'data-layer-container')
89805                     .merge(container);
89806
89807                 updateDataLayers();
89808             }
89809
89810             function renderPhotoOverlays(selection) {
89811                 var container = selection.selectAll('.photo-overlay-container')
89812                     .data([0]);
89813
89814                 _photoOverlayContainer = container.enter()
89815                     .append('div')
89816                     .attr('class', 'photo-overlay-container')
89817                     .merge(container);
89818
89819                 updatePhotoOverlays();
89820             }
89821
89822
89823             function renderFillList(selection) {
89824                 var container = selection.selectAll('.layer-fill-list')
89825                     .data([0]);
89826
89827                 _fillList = container.enter()
89828                     .append('ul')
89829                     .attr('class', 'layer-list layer-fill-list')
89830                     .merge(container);
89831
89832                 updateFillList();
89833             }
89834
89835
89836             function renderFeatureList(selection) {
89837                 var container = selection.selectAll('.layer-feature-list-container')
89838                     .data([0]);
89839
89840                 var containerEnter = container.enter()
89841                     .append('div')
89842                     .attr('class', 'layer-feature-list-container');
89843
89844                 containerEnter
89845                     .append('ul')
89846                     .attr('class', 'layer-list layer-feature-list');
89847
89848                 var footer = containerEnter
89849                     .append('div')
89850                     .attr('class', 'feature-list-links section-footer');
89851
89852                 footer
89853                     .append('a')
89854                     .attr('class', 'feature-list-link')
89855                     .attr('href', '#')
89856                     .text(t('issues.enable_all'))
89857                     .on('click', function() {
89858                         context.features().enableAll();
89859                     });
89860
89861                 footer
89862                     .append('a')
89863                     .attr('class', 'feature-list-link')
89864                     .attr('href', '#')
89865                     .text(t('issues.disable_all'))
89866                     .on('click', function() {
89867                         context.features().disableAll();
89868                     });
89869
89870                 // Update
89871                 container = container
89872                     .merge(containerEnter);
89873
89874                 _featureList = container.selectAll('.layer-feature-list');
89875
89876                 updateFeatureList();
89877             }
89878
89879             function updatePhotoOverlays() {
89880                 _photoOverlayContainer
89881                     .call(drawPhotoItems)
89882                     .call(drawPhotoTypeItems);
89883             }
89884
89885             function updateDataLayers() {
89886                 _dataLayerContainer
89887                     .call(drawOsmItems)
89888                     .call(drawQAItems)
89889                     .call(drawCustomDataItems)
89890                     .call(drawVectorItems);      // Beta - Detroit mapping challenge
89891             }
89892
89893             function updateFillList() {
89894                 _fillList
89895                     .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
89896             }
89897
89898             function updateFeatureList() {
89899                 _featureList
89900                     .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
89901             }
89902
89903             function update() {
89904
89905                 if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
89906                     updateDataLayers();
89907                 }
89908                 if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) {
89909                     updatePhotoOverlays();
89910                 }
89911                 if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
89912                     updateFillList();
89913                 }
89914                 if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
89915                     updateFeatureList();
89916                 }
89917
89918                 _QAList
89919                     .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
89920             }
89921
89922
89923             function toggleWireframe() {
89924                 if (event) {
89925                     event.preventDefault();
89926                     event.stopPropagation();
89927                 }
89928
89929                 if (_fillSelected === 'wireframe') {
89930                     _fillSelected = context.storage('area-fill-toggle') || 'partial';
89931                 } else {
89932                     _fillSelected = 'wireframe';
89933                 }
89934
89935                 setFill(_fillSelected);
89936                 context.map().pan([0,0]);  // trigger a redraw
89937             }
89938
89939             var paneTooltip = tooltip()
89940                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89941                 .html(true)
89942                 .title(uiTooltipHtml(t('map_data.description'), key));
89943
89944             function hidePane() {
89945                 context.ui().togglePanes();
89946             }
89947
89948             uiMapData.togglePane = function() {
89949                 if (event) event.preventDefault();
89950                 paneTooltip.hide(_toggleButton);
89951                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89952             };
89953
89954             uiMapData.renderToggleButton = function(selection) {
89955
89956                 _toggleButton = selection
89957                     .append('button')
89958                     .attr('tabindex', -1)
89959                     .on('click', uiMapData.togglePane)
89960                     .call(svgIcon('#iD-icon-data', 'light'))
89961                     .call(paneTooltip);
89962             };
89963
89964
89965             uiMapData.renderPane = function(selection) {
89966
89967                 _pane = selection
89968                     .append('div')
89969                     .attr('class', 'fillL map-pane map-data-pane hide')
89970                     .attr('pane', 'map-data');
89971
89972                 var heading = _pane
89973                     .append('div')
89974                     .attr('class', 'pane-heading');
89975
89976                 heading
89977                     .append('h2')
89978                     .text(t('map_data.title'));
89979
89980                 heading
89981                     .append('button')
89982                     .on('click', hidePane)
89983                     .call(svgIcon('#iD-icon-close'));
89984
89985
89986                 var content = _pane
89987                     .append('div')
89988                     .attr('class', 'pane-content');
89989
89990
89991                 // data layers
89992                 content
89993                     .append('div')
89994                     .attr('class', 'map-data-data-layers')
89995                     .call(uiDisclosure(context, 'data_layers', true)
89996                         .title(t('map_data.data_layers'))
89997                         .content(renderDataLayers)
89998                     );
89999
90000                 // photo overlays
90001                 content
90002                     .append('div')
90003                     .attr('class', 'map-data-photo-overlays')
90004                     .call(uiDisclosure(context, 'photo_overlays', false)
90005                         .title(t('photo_overlays.title'))
90006                         .content(renderPhotoOverlays)
90007                     );
90008
90009                 // area fills
90010                 content
90011                     .append('div')
90012                     .attr('class', 'map-data-area-fills')
90013                     .call(uiDisclosure(context, 'fill_area', false)
90014                         .title(t('map_data.fill_area'))
90015                         .content(renderFillList)
90016                     );
90017
90018                 // feature filters
90019                 content
90020                     .append('div')
90021                     .attr('class', 'map-data-feature-filters')
90022                     .call(uiDisclosure(context, 'map_features', false)
90023                         .title(t('map_data.map_features'))
90024                         .content(renderFeatureList)
90025                     );
90026
90027
90028                 // add listeners
90029                 context.features()
90030                     .on('change.map_data-update', update);
90031
90032                 update();
90033                 setFill(_fillSelected);
90034
90035                 context.keybinding()
90036                     .on(key, uiMapData.togglePane)
90037                     .on(t('area_fill.wireframe.key'), toggleWireframe)
90038                     .on(osmDataToggleKey, function() {
90039                         event.preventDefault();
90040                         event.stopPropagation();
90041                         toggleLayer('osm');
90042                     });
90043             };
90044
90045             return uiMapData;
90046         }
90047
90048         function uiNotice(context) {
90049
90050             return function(selection) {
90051                 var div = selection
90052                     .append('div')
90053                     .attr('class', 'notice');
90054
90055                 var button = div
90056                     .append('button')
90057                     .attr('class', 'zoom-to notice fillD')
90058                     .on('click', function() {
90059                         context.map().zoomEase(context.minEditableZoom());
90060                     })
90061                     .on('wheel', function() {   // let wheel events pass through #4482
90062                         var e2 = new WheelEvent(event.type, event);
90063                         context.surface().node().dispatchEvent(e2);
90064                     });
90065
90066                 button
90067                     .call(svgIcon('#iD-icon-plus', 'pre-text'))
90068                     .append('span')
90069                     .attr('class', 'label')
90070                     .text(t('zoom_in_edit'));
90071
90072
90073                 function disableTooHigh() {
90074                     var canEdit = context.map().zoom() >= context.minEditableZoom();
90075                     div.style('display', canEdit ? 'none' : 'block');
90076                 }
90077
90078                 context.map()
90079                     .on('move.notice', debounce(disableTooHigh, 500));
90080
90081                 disableTooHigh();
90082             };
90083         }
90084
90085         function uiPhotoviewer(context) {
90086
90087             var dispatch$1 = dispatch('resize');
90088
90089             function photoviewer(selection) {
90090                 selection
90091                     .append('button')
90092                     .attr('class', 'thumb-hide')
90093                     .on('click', function () {
90094                         if (services$1.streetside) { services$1.streetside.hideViewer(); }
90095                         if (services$1.mapillary) { services$1.mapillary.hideViewer(); }
90096                         if (services$1.openstreetcam) { services$1.openstreetcam.hideViewer(); }
90097                     })
90098                     .append('div')
90099                     .call(svgIcon('#iD-icon-close'));
90100
90101                 selection
90102                     .append('button')
90103                     .attr('class', 'resize-handle-xy')
90104                     .on(
90105                         'mousedown',
90106                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
90107                     );
90108
90109                 selection
90110                     .append('button')
90111                     .attr('class', 'resize-handle-x')
90112                     .on(
90113                         'mousedown',
90114                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
90115                     );
90116
90117                 selection
90118                     .append('button')
90119                     .attr('class', 'resize-handle-y')
90120                     .on(
90121                         'mousedown',
90122                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
90123                     );
90124
90125                 services$1.streetside.loadViewer(context);
90126                 services$1.mapillary.loadViewer(context);
90127                 services$1.openstreetcam.loadViewer(context);
90128
90129                 function buildResizeListener(target, eventName, dispatch, options) {
90130                     var resizeOnX = !!options.resizeOnX;
90131                     var resizeOnY = !!options.resizeOnY;
90132                     var minHeight = options.minHeight || 240;
90133                     var minWidth = options.minWidth || 320;
90134                     var startX;
90135                     var startY;
90136                     var startWidth;
90137                     var startHeight;
90138
90139                     function startResize() {
90140                         var mapSize = context.map().dimensions();
90141
90142                         if (resizeOnX) {
90143                             var maxWidth = mapSize[0];
90144                             var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
90145                             target.style('width', newWidth + 'px');
90146                         }
90147
90148                         if (resizeOnY) {
90149                             var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
90150                             var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
90151                             target.style('height', newHeight + 'px');
90152                         }
90153
90154                         dispatch.call(eventName, target, utilGetDimensions(target, true));
90155                     }
90156
90157                     function clamp(num, min, max) {
90158                         return Math.max(min, Math.min(num, max));
90159                     }
90160
90161                     function stopResize() {
90162                         d3_select(window)
90163                             .on('.' + eventName, null);
90164                     }
90165
90166                     return function initResize() {
90167                         startX = event.clientX;
90168                         startY = event.clientY;
90169                         startWidth = target.node().getBoundingClientRect().width;
90170                         startHeight = target.node().getBoundingClientRect().height;
90171
90172                         d3_select(window)
90173                             .on('mousemove.' + eventName, startResize, false)
90174                             .on('mouseup.' + eventName, stopResize, false);
90175                     };
90176                 }
90177             }
90178
90179             photoviewer.onMapResize = function() {
90180                 var photoviewer = d3_select('#photoviewer');
90181                 var content = d3_select('#content');
90182                 var mapDimensions = utilGetDimensions(content, true);
90183                 // shrink photo viewer if it is too big
90184                 // (-90 preserves space at top and bottom of map used by menus)
90185                 var photoDimensions = utilGetDimensions(photoviewer, true);
90186                 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
90187                     var setPhotoDimensions = [
90188                         Math.min(photoDimensions[0], mapDimensions[0]),
90189                         Math.min(photoDimensions[1], mapDimensions[1] - 90),
90190                     ];
90191
90192                     photoviewer
90193                         .style('width', setPhotoDimensions[0] + 'px')
90194                         .style('height', setPhotoDimensions[1] + 'px');
90195
90196                     dispatch$1.call('resize', photoviewer, setPhotoDimensions);
90197                 }
90198             };
90199
90200             return utilRebind(photoviewer, dispatch$1, 'on');
90201         }
90202
90203         function uiRestore(context) {
90204
90205             return function(selection) {
90206                 if (!context.history().lock() || !context.history().restorableChanges())
90207                     return;
90208
90209                 var modalSelection = uiModal(selection, true);
90210
90211                 modalSelection.select('.modal')
90212                     .attr('class', 'modal fillL');
90213
90214                 var introModal = modalSelection.select('.content');
90215
90216                 introModal
90217                     .append('div')
90218                     .attr('class', 'modal-section')
90219                     .append('h3')
90220                     .text(t('restore.heading'));
90221
90222                 introModal
90223                     .append('div')
90224                     .attr('class','modal-section')
90225                     .append('p')
90226                     .text(t('restore.description'));
90227
90228                 var buttonWrap = introModal
90229                     .append('div')
90230                     .attr('class', 'modal-actions');
90231
90232                 var restore = buttonWrap
90233                     .append('button')
90234                     .attr('class', 'restore')
90235                     .on('click', function() {
90236                         context.history().restore();
90237                         modalSelection.remove();
90238                     });
90239
90240                 restore
90241                     .append('svg')
90242                     .attr('class', 'logo logo-restore')
90243                     .append('use')
90244                     .attr('xlink:href', '#iD-logo-restore');
90245
90246                 restore
90247                     .append('div')
90248                     .text(t('restore.restore'));
90249
90250                 var reset = buttonWrap
90251                     .append('button')
90252                     .attr('class', 'reset')
90253                     .on('click', function() {
90254                         context.history().clearSaved();
90255                         modalSelection.remove();
90256                     });
90257
90258                 reset
90259                     .append('svg')
90260                     .attr('class', 'logo logo-reset')
90261                     .append('use')
90262                     .attr('xlink:href', '#iD-logo-reset');
90263
90264                 reset
90265                     .append('div')
90266                     .text(t('restore.reset'));
90267
90268                 restore.node().focus();
90269             };
90270         }
90271
90272         function uiScale(context) {
90273             var projection = context.projection,
90274                 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
90275                 maxLength = 180,
90276                 tickHeight = 8;
90277
90278
90279             function scaleDefs(loc1, loc2) {
90280                 var lat = (loc2[1] + loc1[1]) / 2,
90281                     conversion = (isImperial ? 3.28084 : 1),
90282                     dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
90283                     scale = { dist: 0, px: 0, text: '' },
90284                     buckets, i, val, dLon;
90285
90286                 if (isImperial) {
90287                     buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
90288                 } else {
90289                     buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
90290                 }
90291
90292                 // determine a user-friendly endpoint for the scale
90293                 for (i = 0; i < buckets.length; i++) {
90294                     val = buckets[i];
90295                     if (dist >= val) {
90296                         scale.dist = Math.floor(dist / val) * val;
90297                         break;
90298                     } else {
90299                         scale.dist = +dist.toFixed(2);
90300                     }
90301                 }
90302
90303                 dLon = geoMetersToLon(scale.dist / conversion, lat);
90304                 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
90305
90306                 scale.text = displayLength(scale.dist / conversion, isImperial);
90307
90308                 return scale;
90309             }
90310
90311
90312             function update(selection) {
90313                 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
90314                 var dims = context.map().dimensions(),
90315                     loc1 = projection.invert([0, dims[1]]),
90316                     loc2 = projection.invert([maxLength, dims[1]]),
90317                     scale = scaleDefs(loc1, loc2);
90318
90319                 selection.select('#scale-path')
90320                     .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
90321
90322                 selection.select('#scale-textgroup')
90323                     .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
90324
90325                 selection.select('#scale-text')
90326                     .text(scale.text);
90327             }
90328
90329
90330             return function(selection) {
90331                 function switchUnits() {
90332                     isImperial = !isImperial;
90333                     selection.call(update);
90334                 }
90335
90336                 var scalegroup = selection.append('svg')
90337                     .attr('id', 'scale')
90338                     .on('click', switchUnits)
90339                     .append('g')
90340                     .attr('transform', 'translate(10,11)');
90341
90342                 scalegroup
90343                     .append('path')
90344                     .attr('id', 'scale-path');
90345
90346                 scalegroup
90347                     .append('g')
90348                     .attr('id', 'scale-textgroup')
90349                     .append('text')
90350                     .attr('id', 'scale-text');
90351
90352                 selection.call(update);
90353
90354                 context.map().on('move.scale', function() {
90355                     update(selection);
90356                 });
90357             };
90358         }
90359
90360         var pair_1 = pair$1;
90361
90362         function search(x, dims, r) {
90363           if (!dims) dims = 'NSEW';
90364           if (typeof x !== 'string') return { val: null, regex: r };
90365
90366           r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
90367
90368           var m = r.exec(x);
90369           if (!m) return { val: null, regex: r };
90370
90371           var dim = m[1] || m[5];
90372           if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
90373
90374           return {
90375             val: (((m[2]) ? parseFloat(m[2]) : 0) +
90376                   ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
90377                   ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
90378                   ((dim === 'S' || dim === 'W') ? -1 : 1),
90379             regex: r,
90380             raw: m[0],
90381             dim: dim
90382           };
90383         }
90384
90385         function pair$1(x, dims) {
90386           x = x.trim();
90387           var one = search(x, dims);
90388           if (one.val === null) return null;
90389           var two = search(x, dims, one.regex);
90390           if (two.val === null) return null;
90391           // null if one/two are not contiguous.
90392           if (one.raw + two.raw !== x) return null;
90393           if (one.dim) {
90394             return swapdim(one.val, two.val, one.dim);
90395           } else {
90396             return [one.val, two.val];
90397           }
90398         }
90399
90400         function swapdim(a, b, dim) {
90401           if (dim === 'N' || dim === 'S') return [a, b];
90402           if (dim === 'W' || dim === 'E') return [b, a];
90403         }
90404
90405         function uiFeatureList(context) {
90406             var _geocodeResults;
90407
90408
90409             function featureList(selection) {
90410                 var header = selection
90411                     .append('div')
90412                     .attr('class', 'header fillL cf');
90413
90414                 header
90415                     .append('h3')
90416                     .text(t('inspector.feature_list'));
90417
90418                 var searchWrap = selection
90419                     .append('div')
90420                     .attr('class', 'search-header');
90421
90422                 var search = searchWrap
90423                     .append('input')
90424                     .attr('placeholder', t('inspector.search'))
90425                     .attr('type', 'search')
90426                     .call(utilNoAuto)
90427                     .on('keypress', keypress)
90428                     .on('keydown', keydown)
90429                     .on('input', inputevent);
90430
90431                 searchWrap
90432                     .call(svgIcon('#iD-icon-search', 'pre-text'));
90433
90434                 var listWrap = selection
90435                     .append('div')
90436                     .attr('class', 'inspector-body');
90437
90438                 var list = listWrap
90439                     .append('div')
90440                     .attr('class', 'feature-list cf');
90441
90442                 context
90443                     .on('exit.feature-list', clearSearch);
90444                 context.map()
90445                     .on('drawn.feature-list', mapDrawn);
90446
90447                 context.keybinding()
90448                     .on(uiCmd('⌘F'), focusSearch);
90449
90450
90451                 function focusSearch() {
90452                     var mode = context.mode() && context.mode().id;
90453                     if (mode !== 'browse') return;
90454
90455                     event.preventDefault();
90456                     search.node().focus();
90457                 }
90458
90459
90460                 function keydown() {
90461                     if (event.keyCode === 27) {  // escape
90462                         search.node().blur();
90463                     }
90464                 }
90465
90466
90467                 function keypress() {
90468                     var q = search.property('value'),
90469                         items = list.selectAll('.feature-list-item');
90470                     if (event.keyCode === 13 && q.length && items.size()) {  // return
90471                         click(items.datum());
90472                     }
90473                 }
90474
90475
90476                 function inputevent() {
90477                     _geocodeResults = undefined;
90478                     drawList();
90479                 }
90480
90481
90482                 function clearSearch() {
90483                     search.property('value', '');
90484                     drawList();
90485                 }
90486
90487
90488                 function mapDrawn(e) {
90489                     if (e.full) {
90490                         drawList();
90491                     }
90492                 }
90493
90494
90495                 function features() {
90496                     var entities = {};
90497                     var result = [];
90498                     var graph = context.graph();
90499                     var q = search.property('value').toLowerCase();
90500
90501                     if (!q) return result;
90502
90503                     var idMatch = q.match(/^([nwr])([0-9]+)$/);
90504
90505                     if (idMatch) {
90506                         result.push({
90507                             id: idMatch[0],
90508                             geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
90509                             type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
90510                             name: idMatch[2]
90511                         });
90512                     }
90513
90514                     var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
90515
90516                     if (locationMatch) {
90517                         var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
90518                         result.push({
90519                             id: -1,
90520                             geometry: 'point',
90521                             type: t('inspector.location'),
90522                             name: dmsCoordinatePair([loc[1], loc[0]]),
90523                             location: loc
90524                         });
90525                     }
90526
90527                     function addEntity(entity) {
90528                         if (entity.id in entities || result.length > 200)
90529                             return;
90530
90531                         entities[entity.id] = true;
90532
90533                         var name = utilDisplayName(entity) || '';
90534                         if (name.toLowerCase().indexOf(q) >= 0) {
90535                             var matched = context.presets().match(entity, graph);
90536                             var type = (matched && matched.name()) || utilDisplayType(entity.id);
90537
90538                             result.push({
90539                                 id: entity.id,
90540                                 entity: entity,
90541                                 geometry: context.geometry(entity.id),
90542                                 type: type,
90543                                 name: name
90544                             });
90545                         }
90546
90547                         graph.parentRelations(entity).forEach(function(parent) {
90548                             addEntity(parent);
90549                         });
90550                     }
90551
90552                     var visible = context.surface().selectAll('.point, .line, .area').nodes();
90553                     for (var i = 0; i < visible.length && result.length <= 200; i++) {
90554                         var datum = visible[i].__data__;
90555                         var entity = datum && datum.properties && datum.properties.entity;
90556                         if (entity) { addEntity(entity); }
90557                     }
90558
90559                     (_geocodeResults || []).forEach(function(d) {
90560                         if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
90561
90562                             // Make a temporary osmEntity so we can preset match
90563                             // and better localize the search result - #4725
90564                             var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
90565                             var tags = {};
90566                             tags[d.class] = d.type;
90567
90568                             var attrs = { id: id, type: d.osm_type, tags: tags };
90569                             if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
90570                                 attrs.nodes = ['a','a'];  // so that geometry area is possible
90571                             }
90572
90573                             var tempEntity = osmEntity(attrs);
90574                             var tempGraph = coreGraph([tempEntity]);
90575                             var matched = context.presets().match(tempEntity, tempGraph);
90576                             var type = (matched && matched.name()) || utilDisplayType(id);
90577
90578                             result.push({
90579                                 id: tempEntity.id,
90580                                 geometry: tempEntity.geometry(tempGraph),
90581                                 type: type,
90582                                 name: d.display_name,
90583                                 extent: new geoExtent(
90584                                     [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
90585                                     [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
90586                             });
90587                         }
90588                     });
90589
90590                     return result;
90591                 }
90592
90593
90594                 function drawList() {
90595                     var value = search.property('value');
90596                     var results = features();
90597
90598                     list.classed('filtered', value.length);
90599
90600                     var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
90601
90602                     var resultsIndicator = list.selectAll('.no-results-item')
90603                         .data([0])
90604                         .enter()
90605                         .append('button')
90606                         .property('disabled', true)
90607                         .attr('class', 'no-results-item')
90608                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
90609
90610                     resultsIndicator.append('span')
90611                         .attr('class', 'entity-name');
90612
90613                     list.selectAll('.no-results-item .entity-name')
90614                         .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
90615
90616                     if (services$1.geocoder) {
90617                       list.selectAll('.geocode-item')
90618                           .data([0])
90619                           .enter()
90620                           .append('button')
90621                           .attr('class', 'geocode-item')
90622                           .on('click', geocoderSearch)
90623                           .append('div')
90624                           .attr('class', 'label')
90625                           .append('span')
90626                           .attr('class', 'entity-name')
90627                           .text(t('geocoder.search'));
90628                     }
90629
90630                     list.selectAll('.no-results-item')
90631                         .style('display', (value.length && !results.length) ? 'block' : 'none');
90632
90633                     list.selectAll('.geocode-item')
90634                         .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
90635
90636                     list.selectAll('.feature-list-item')
90637                         .data([-1])
90638                         .remove();
90639
90640                     var items = list.selectAll('.feature-list-item')
90641                         .data(results, function(d) { return d.id; });
90642
90643                     var enter = items.enter()
90644                         .insert('button', '.geocode-item')
90645                         .attr('class', 'feature-list-item')
90646                         .on('mouseover', mouseover)
90647                         .on('mouseout', mouseout)
90648                         .on('click', click);
90649
90650                     var label = enter
90651                         .append('div')
90652                         .attr('class', 'label');
90653
90654                     label
90655                         .each(function(d) {
90656                             d3_select(this)
90657                                 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
90658                         });
90659
90660                     label
90661                         .append('span')
90662                         .attr('class', 'entity-type')
90663                         .text(function(d) { return d.type; });
90664
90665                     label
90666                         .append('span')
90667                         .attr('class', 'entity-name')
90668                         .text(function(d) { return d.name; });
90669
90670                     enter
90671                         .style('opacity', 0)
90672                         .transition()
90673                         .style('opacity', 1);
90674
90675                     items.order();
90676
90677                     items.exit()
90678                         .remove();
90679                 }
90680
90681
90682                 function mouseover(d) {
90683                     if (d.id === -1) return;
90684
90685                     context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
90686                         .classed('hover', true);
90687                 }
90688
90689
90690                 function mouseout() {
90691                     context.surface().selectAll('.hover')
90692                         .classed('hover', false);
90693                 }
90694
90695
90696                 function click(d) {
90697                     event.preventDefault();
90698                     if (d.location) {
90699                         context.map().centerZoomEase([d.location[1], d.location[0]], 19);
90700                     }
90701                     else if (d.entity) {
90702                         if (d.entity.type === 'node') {
90703                             context.map().center(d.entity.loc);
90704                         } else if (d.entity.type === 'way') {
90705                             var center = context.projection(context.map().center());
90706                             var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
90707                             context.map().center(edge.loc);
90708                         }
90709                         context.enter(modeSelect(context, [d.entity.id]));
90710                     } else {
90711                         context.zoomToEntity(d.id);
90712                     }
90713                 }
90714
90715
90716                 function geocoderSearch() {
90717                     services$1.geocoder.search(search.property('value'), function (err, resp) {
90718                         _geocodeResults = resp || [];
90719                         drawList();
90720                     });
90721                 }
90722             }
90723
90724
90725             return featureList;
90726         }
90727
90728         function uiPresetFavoriteButton(preset, geom, context, klass) {
90729
90730             geom = context.presets().fallback(geom).id;
90731
90732             var presetFavorite = {};
90733
90734             var _button = d3_select(null);
90735
90736
90737             presetFavorite.button = function(selection) {
90738
90739                 _button = selection.selectAll('.preset-favorite-button')
90740                     .data([]);
90741
90742                 _button.exit().remove();
90743
90744                 _button = _button.enter()
90745                     .insert('button', '.tag-reference-button')
90746                     .attr('class', 'preset-favorite-button ' + klass)
90747                     .attr('title', t('icons.favorite'))
90748                     .attr('tabindex', -1)
90749                     .call(svgIcon('#iD-icon-favorite'))
90750                     .merge(_button);
90751
90752                 _button
90753                     .on('click', function () {
90754                         event.stopPropagation();
90755                         event.preventDefault();
90756
90757                         context.presets().toggleFavorite(preset, geom);
90758
90759                         update();
90760                     });
90761
90762                 update();
90763             };
90764
90765             function update() {
90766                 _button
90767                     .classed('active', context.presets().favoriteMatching(preset, geom));
90768             }
90769
90770             context.presets().on('favoritePreset.button-' + preset.id.replace(/[^a-zA-Z\d:]/g, '-') + '-' + geom, update);
90771
90772             return presetFavorite;
90773         }
90774
90775         function uiPresetIcon(context) {
90776             var preset, geometry, sizeClass = 'medium';
90777
90778             function isSmall() {
90779                 return sizeClass === 'small';
90780             }
90781
90782
90783             function presetIcon(selection) {
90784                 selection.each(render);
90785             }
90786
90787
90788             function getIcon(p, geom) {
90789                 if (isSmall() && p.isFallback && p.isFallback())
90790                     return 'iD-icon-' + p.id;
90791                 else if (p.icon)
90792                     return p.icon;
90793                 else if (geom === 'line')
90794                     return 'iD-other-line';
90795                 else if (geom === 'vertex')
90796                     return p.isFallback() ? '' : 'temaki-vertex';
90797                 else if (isSmall() && geom === 'point')
90798                     return '';
90799                 else
90800                     return 'maki-marker-stroked';
90801             }
90802
90803             function renderPointBorder(enter) {
90804                 var w = 40, h = 40;
90805                 enter = enter
90806                     .append('svg')
90807                     .attr('class', 'preset-icon-fill preset-icon-point-border')
90808                     .attr('width', w)
90809                     .attr('height', h)
90810                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90811
90812                 enter.append('path')
90813                     .attr('transform', 'translate(11.5, 8)')
90814                     .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');
90815             }
90816
90817             function renderCircleFill(fillEnter) {
90818                 var w = 60, h = 60, d = 40;
90819                 fillEnter = fillEnter
90820                     .append('svg')
90821                     .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
90822                     .attr('width', w)
90823                     .attr('height', h)
90824                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90825
90826                 fillEnter.append('circle')
90827                     .attr('cx', w/2)
90828                     .attr('cy', h/2)
90829                     .attr('r', d/2);
90830             }
90831
90832             function renderSquareFill(fillEnter) {
90833                 var d = isSmall() ? 40 : 60;
90834                 var w = d, h = d, l = d*2/3, c1 = (w-l)/2, c2 = c1 + l;
90835                 fillEnter = fillEnter
90836                     .append('svg')
90837                     .attr('class', 'preset-icon-fill preset-icon-fill-area')
90838                     .attr('width', w)
90839                     .attr('height', h)
90840                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90841
90842                 var data = 'M' + c1 + ' ' + c1 + ' L' + c1 + ' ' + c2 + ' L' + c2 + ' ' + c2 + ' L' + c2 + ' ' + c1 + ' Z';
90843
90844                 fillEnter.append('path')
90845                     .attr('d', data)
90846                     .attr('class', 'line area fill');
90847
90848                 fillEnter.append('path')
90849                     .attr('d', data)
90850                     .attr('class', 'line area stroke');
90851
90852                 var r = 2.5;
90853                 var coordinates = [c1, c2];
90854                 for (var xIndex in coordinates) {
90855                     for (var yIndex in coordinates) {
90856                         fillEnter.append('circle')
90857                             .attr('class', 'vertex')
90858                             .attr('cx', coordinates[xIndex])
90859                             .attr('cy', coordinates[yIndex])
90860                             .attr('r', r);
90861                     }
90862                 }
90863
90864                 if (!isSmall()) {
90865                     var midCoordinates = [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]];
90866                     for (var index in midCoordinates) {
90867                         var loc = midCoordinates[index];
90868                         fillEnter.append('circle')
90869                             .attr('class', 'midpoint')
90870                             .attr('cx', loc[0])
90871                             .attr('cy', loc[1])
90872                             .attr('r', 1.25);
90873                     }
90874                 }
90875
90876             }
90877
90878             function renderLine(lineEnter) {
90879                 var d = isSmall() ? 40 : 60;
90880                 // draw the line parametrically
90881                 var w = d, h = d, y = Math.round(d*0.72), l = Math.round(d*0.6), r = 2.5;
90882                 var x1 = (w - l)/2, x2 = x1 + l;
90883
90884                 lineEnter = lineEnter
90885                     .append('svg')
90886                     .attr('class', 'preset-icon-line')
90887                     .attr('width', w)
90888                     .attr('height', h)
90889                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90890
90891                 ['casing', 'stroke'].forEach(function(klass) {
90892                     lineEnter.append('path')
90893                         .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
90894                         .attr('class', 'line ' + klass);
90895                 });
90896
90897                 [[x1 - 1, y], [x2 + 1, y]].forEach(function(loc) {
90898                     lineEnter.append('circle')
90899                         .attr('class', 'vertex')
90900                         .attr('cx', loc[0])
90901                         .attr('cy', loc[1])
90902                         .attr('r', r);
90903                 });
90904             }
90905
90906             function renderRoute(routeEnter) {
90907                 var d = isSmall() ? 40 : 60;
90908                 // draw the route parametrically
90909                 var w = d,
90910                     h = d,
90911                     y1 = Math.round(d*0.80),
90912                     y2 = Math.round(d*0.68),
90913                     l = Math.round(d*0.6),
90914                     r = 2;
90915                 var x1 = (w - l)/2, x2 = x1 + l/3, x3 = x2 + l/3, x4 = x3 + l/3;
90916
90917                 routeEnter = routeEnter
90918                     .append('svg')
90919                     .attr('class', 'preset-icon-route')
90920                     .attr('width', w)
90921                     .attr('height', h)
90922                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90923
90924                 ['casing', 'stroke'].forEach(function(klass) {
90925                     routeEnter.append('path')
90926                         .attr('d', 'M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2)
90927                         .attr('class', 'segment0 line ' + klass);
90928                     routeEnter.append('path')
90929                         .attr('d', 'M' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y1)
90930                         .attr('class', 'segment1 line ' + klass);
90931                     routeEnter.append('path')
90932                         .attr('d', 'M' + x3 + ' ' + y1 + ' L' + x4 + ' ' + y2)
90933                         .attr('class', 'segment2 line ' + klass);
90934                 });
90935
90936                 [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function(loc) {
90937                     routeEnter.append('circle')
90938                         .attr('class', 'vertex')
90939                         .attr('cx', loc[0])
90940                         .attr('cy', loc[1])
90941                         .attr('r', r);
90942                 });
90943             }
90944
90945             var routeSegements = {
90946                 bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
90947                 bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
90948                 detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
90949                 ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
90950                 foot: ['highway/footway', 'highway/footway', 'highway/footway'],
90951                 hiking: ['highway/path', 'highway/path', 'highway/path'],
90952                 horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
90953                 light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
90954                 monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
90955                 pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
90956                 piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
90957                 power: ['power/line', 'power/line', 'power/line'],
90958                 road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
90959                 subway: ['railway/subway', 'railway/subway', 'railway/subway'],
90960                 train: ['railway/rail', 'railway/rail', 'railway/rail'],
90961                 tram: ['railway/tram', 'railway/tram', 'railway/tram'],
90962                 waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
90963             };
90964
90965             function render() {
90966
90967                 var p = preset.apply(this, arguments);
90968                 var isFallback = isSmall() && p.isFallback && p.isFallback();
90969                 var geom = geometry ? geometry.apply(this, arguments) : null;
90970                 if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegements[p.tags.route]) || p.tags.type === 'waterway')) {
90971                     geom = 'route';
90972                 }
90973                 var imageURL = p.imageURL;
90974                 var picon = imageURL ? null : getIcon(p, geom);
90975                 var isMaki = picon && /^maki-/.test(picon);
90976                 var isTemaki = picon && /^temaki-/.test(picon);
90977                 var isFa = picon && /^fa[srb]-/.test(picon);
90978                 var isTnp = picon && /^tnp-/.test(picon);
90979                 var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
90980                 var isCategory = !p.setTags;
90981                 var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
90982                 var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
90983                 var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
90984                 var drawArea = picon && geom === 'area' && !isFallback;
90985                 var drawRoute = picon && geom === 'route';
90986                 var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
90987
90988                 var tags = !isCategory ? p.setTags({}, geom) : {};
90989                 for (var k in tags) {
90990                     if (tags[k] === '*') {
90991                         tags[k] = 'yes';
90992                     }
90993                 }
90994                 var tagClasses = svgTagClasses().getClassesString(tags, '');
90995
90996                 var selection = d3_select(this);
90997
90998                 var container = selection.selectAll('.preset-icon-container')
90999                     .data([0]);
91000
91001                 container = container.enter()
91002                     .append('div')
91003                     .attr('class', 'preset-icon-container ' + sizeClass)
91004                     .merge(container);
91005
91006                 container.classed('fallback', isFallback);
91007
91008                 var imageIcon = container.selectAll('img.image-icon')
91009                     .data(imageURL ? [0] : []);
91010
91011                 imageIcon.exit()
91012                     .remove();
91013
91014                 imageIcon = imageIcon.enter()
91015                     .append('img')
91016                     .attr('class', 'image-icon')
91017                     .merge(imageIcon);
91018
91019                 imageIcon
91020                     .attr('src', imageURL);
91021
91022                 var pointBorder = container.selectAll('.preset-icon-point-border')
91023                     .data(drawPoint ? [0] : []);
91024
91025                 pointBorder.exit()
91026                     .remove();
91027
91028                 var pointBorderEnter = pointBorder.enter();
91029                 renderPointBorder(pointBorderEnter);
91030                 pointBorder = pointBorderEnter.merge(pointBorder);
91031
91032
91033                 var vertexFill = container.selectAll('.preset-icon-fill-vertex')
91034                     .data(drawVertex ? [0] : []);
91035
91036                 vertexFill.exit()
91037                     .remove();
91038
91039                 var vertexFillEnter = vertexFill.enter();
91040                 renderCircleFill(vertexFillEnter);
91041                 vertexFill = vertexFillEnter.merge(vertexFill);
91042
91043
91044                 var fill = container.selectAll('.preset-icon-fill-area')
91045                     .data(drawArea ? [0] : []);
91046
91047                 fill.exit()
91048                     .remove();
91049
91050                 var fillEnter = fill.enter();
91051                 renderSquareFill(fillEnter);
91052                 fill = fillEnter.merge(fill);
91053
91054                 fill.selectAll('path.stroke')
91055                     .attr('class', 'area stroke ' + tagClasses);
91056                 fill.selectAll('path.fill')
91057                     .attr('class', 'area fill ' + tagClasses);
91058
91059
91060                 var line = container.selectAll('.preset-icon-line')
91061                     .data(drawLine ? [0] : []);
91062
91063                 line.exit()
91064                     .remove();
91065
91066                 var lineEnter = line.enter();
91067                 renderLine(lineEnter);
91068
91069                 line = lineEnter.merge(line);
91070
91071                 line.selectAll('path.stroke')
91072                     .attr('class', 'line stroke ' + tagClasses);
91073                 line.selectAll('path.casing')
91074                     .attr('class', 'line casing ' + tagClasses);
91075
91076                 var route = container.selectAll('.preset-icon-route')
91077                     .data(drawRoute ? [0] : []);
91078
91079                 route.exit()
91080                     .remove();
91081
91082                 var routeEnter = route.enter();
91083                 renderRoute(routeEnter);
91084
91085                 route = routeEnter.merge(route);
91086
91087                 if (drawRoute) {
91088                     var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
91089                     var segmentPresetIDs = routeSegements[routeType];
91090                     for (var segmentIndex in segmentPresetIDs) {
91091                         var segmentPreset = context.presets().item(segmentPresetIDs[segmentIndex]);
91092                         var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
91093                         route.selectAll('path.stroke.segment' + segmentIndex)
91094                             .attr('class', 'segment' + segmentIndex + ' line stroke ' + segmentTagClasses);
91095                         route.selectAll('path.casing.segment' + segmentIndex)
91096                             .attr('class', 'segment' + segmentIndex + ' line casing ' + segmentTagClasses);
91097                     }
91098
91099                 }
91100
91101
91102                 var icon = container.selectAll('.preset-icon')
91103                     .data(picon ? [0] : []);
91104
91105                 icon.exit()
91106                     .remove();
91107
91108                 icon = icon.enter()
91109                     .append('div')
91110                     .attr('class', 'preset-icon')
91111                     .call(svgIcon(''))
91112                     .merge(icon);
91113
91114                 icon
91115                     .attr('class', 'preset-icon ' + (geom ? geom + '-geom' : ''))
91116                     .classed('framed', isFramed)
91117                     .classed('preset-icon-iD', isiDIcon);
91118
91119                 icon.selectAll('svg')
91120                     .attr('class', function() {
91121                         return 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line'  ? '' : tagClasses);
91122                     });
91123
91124                 icon.selectAll('use')
91125                     .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
91126
91127             }
91128
91129
91130             presetIcon.preset = function(val) {
91131                 if (!arguments.length) return preset;
91132                 preset = utilFunctor(val);
91133                 return presetIcon;
91134             };
91135
91136
91137             presetIcon.geometry = function(val) {
91138                 if (!arguments.length) return geometry;
91139                 geometry = utilFunctor(val);
91140                 return presetIcon;
91141             };
91142
91143
91144             presetIcon.sizeClass = function(val) {
91145                 if (!arguments.length) return sizeClass;
91146                 sizeClass = val;
91147                 return presetIcon;
91148             };
91149
91150             return presetIcon;
91151         }
91152
91153         function uiRawMemberEditor(context) {
91154             var taginfo = services$1.taginfo;
91155             var _entityID;
91156             var _contentSelection = d3_select(null);
91157             var _maxMembers = 1000;
91158
91159             function downloadMember(d) {
91160                 event.preventDefault();
91161
91162                 // display the loading indicator
91163                 d3_select(this.parentNode).classed('tag-reference-loading', true);
91164                 context.loadEntity(d.id, function() {
91165                     updateDisclosureContent(_contentSelection);
91166                 });
91167             }
91168
91169             function zoomToMember(d) {
91170                 event.preventDefault();
91171
91172                 var entity = context.entity(d.id);
91173                 context.map().zoomTo(entity);
91174
91175                 // highlight the feature in case it wasn't previously on-screen
91176                 utilHighlightEntities([d.id], true, context);
91177             }
91178
91179
91180             function selectMember(d) {
91181                 event.preventDefault();
91182
91183                 // remove the hover-highlight styling
91184                 utilHighlightEntities([d.id], false, context);
91185
91186                 var entity = context.entity(d.id);
91187                 var mapExtent = context.map().extent();
91188                 if (!entity.intersects(mapExtent, context.graph())) {
91189                     // zoom to the entity if its extent is not visible now
91190                     context.map().zoomToEase(entity);
91191                 }
91192
91193                 context.enter(modeSelect(context, [d.id]));
91194             }
91195
91196
91197             function changeRole(d) {
91198                 var oldRole = d.role;
91199                 var newRole = d3_select(this).property('value');
91200
91201                 if (oldRole !== newRole) {
91202                     var member = { id: d.id, type: d.type, role: newRole };
91203                     context.perform(
91204                         actionChangeMember(d.relation.id, member, d.index),
91205                         t('operations.change_role.annotation')
91206                     );
91207                 }
91208             }
91209
91210
91211             function deleteMember(d) {
91212
91213                 // remove the hover-highlight styling
91214                 utilHighlightEntities([d.id], false, context);
91215
91216                 context.perform(
91217                     actionDeleteMember(d.relation.id, d.index),
91218                     t('operations.delete_member.annotation')
91219                 );
91220
91221                 if (!context.hasEntity(d.relation.id)) {
91222                     context.enter(modeBrowse(context));
91223                 }
91224             }
91225
91226             function updateDisclosureContent(selection) {
91227                 _contentSelection = selection;
91228
91229                 var memberships = [];
91230                 var entity = context.entity(_entityID);
91231                 entity.members.slice(0, _maxMembers).forEach(function(member, index) {
91232                     memberships.push({
91233                         index: index,
91234                         id: member.id,
91235                         type: member.type,
91236                         role: member.role,
91237                         relation: entity,
91238                         member: context.hasEntity(member.id)
91239                     });
91240                 });
91241
91242                 var list = selection.selectAll('.member-list')
91243                     .data([0]);
91244
91245                 list = list.enter()
91246                     .append('ul')
91247                     .attr('class', 'member-list')
91248                     .merge(list);
91249
91250
91251                 var items = list.selectAll('li')
91252                     .data(memberships, function(d) {
91253                         return osmEntity.key(d.relation) + ',' + d.index + ',' +
91254                             (d.member ? osmEntity.key(d.member) : 'incomplete');
91255                     });
91256
91257                 items.exit()
91258                     .each(unbind)
91259                     .remove();
91260
91261                 var itemsEnter = items.enter()
91262                     .append('li')
91263                     .attr('class', 'member-row form-field')
91264                     .classed('member-incomplete', function(d) { return !d.member; });
91265
91266                 itemsEnter
91267                     .each(function(d) {
91268                         var item = d3_select(this);
91269
91270                         var label = item
91271                             .append('label')
91272                             .attr('class', 'field-label');
91273
91274                         if (d.member) {
91275                             // highlight the member feature in the map while hovering on the list item
91276                             item
91277                                 .on('mouseover', function() {
91278                                     utilHighlightEntities([d.id], true, context);
91279                                 })
91280                                 .on('mouseout', function() {
91281                                     utilHighlightEntities([d.id], false, context);
91282                                 });
91283
91284                             var labelLink = label
91285                                 .append('span')
91286                                 .attr('class', 'label-text')
91287                                 .append('a')
91288                                 .attr('href', '#')
91289                                 .on('click', selectMember);
91290
91291                             labelLink
91292                                 .append('span')
91293                                 .attr('class', 'member-entity-type')
91294                                 .text(function(d) {
91295                                     var matched = context.presets().match(d.member, context.graph());
91296                                     return (matched && matched.name()) || utilDisplayType(d.member.id);
91297                                 });
91298
91299                             labelLink
91300                                 .append('span')
91301                                 .attr('class', 'member-entity-name')
91302                                 .text(function(d) { return utilDisplayName(d.member); });
91303
91304                             label
91305                                 .append('button')
91306                                 .attr('class', 'member-zoom')
91307                                 .attr('title', t('icons.zoom_to'))
91308                                 .attr('tabindex', -1)
91309                                 .call(svgIcon('#iD-icon-geolocate'))
91310                                 .on('click', zoomToMember);
91311
91312                         } else {
91313                             var labelText = label
91314                                 .append('span')
91315                                 .attr('class', 'label-text');
91316
91317                             labelText
91318                                 .append('span')
91319                                 .attr('class', 'member-entity-type')
91320                                 .text(t('inspector.' + d.type, { id: d.id }));
91321
91322                             labelText
91323                                 .append('span')
91324                                 .attr('class', 'member-entity-name')
91325                                 .text(t('inspector.incomplete', { id: d.id }));
91326
91327                             label
91328                                 .append('button')
91329                                 .attr('class', 'member-download')
91330                                 .attr('title', t('icons.download'))
91331                                 .attr('tabindex', -1)
91332                                 .call(svgIcon('#iD-icon-load'))
91333                                 .on('click', downloadMember);
91334                         }
91335                     });
91336
91337                 var wrapEnter = itemsEnter
91338                     .append('div')
91339                     .attr('class', 'form-field-input-wrap form-field-input-member');
91340
91341                 wrapEnter
91342                     .append('input')
91343                     .attr('class', 'member-role')
91344                     .property('type', 'text')
91345                     .attr('maxlength', 255)
91346                     .attr('placeholder', t('inspector.role'))
91347                     .call(utilNoAuto);
91348
91349                 wrapEnter
91350                     .append('button')
91351                     .attr('tabindex', -1)
91352                     .attr('title', t('icons.remove'))
91353                     .attr('class', 'remove form-field-button member-delete')
91354                     .call(svgIcon('#iD-operation-delete'));
91355
91356                 if (taginfo) {
91357                     wrapEnter.each(bindTypeahead);
91358                 }
91359
91360                 var dragOrigin, targetIndex;
91361
91362                 itemsEnter.call(d3_drag()
91363                     .on('start', function() {
91364                         dragOrigin = {
91365                             x: event.x,
91366                             y: event.y
91367                         };
91368                         targetIndex = null;
91369                     })
91370                     .on('drag', function(d, index) {
91371                         var x = event.x - dragOrigin.x,
91372                             y = event.y - dragOrigin.y;
91373
91374                         if (!d3_select(this).classed('dragging') &&
91375                             // don't display drag until dragging beyond a distance threshold
91376                             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
91377
91378                         d3_select(this)
91379                             .classed('dragging', true);
91380
91381                         targetIndex = null;
91382
91383                         selection.selectAll('li.member-row')
91384                             .style('transform', function(d2, index2) {
91385                                 var node = d3_select(this).node();
91386                                 if (index === index2) {
91387                                     return 'translate(' + x + 'px, ' + y + 'px)';
91388                                 } else if (index2 > index && event.y > node.offsetTop - node.offsetHeight) {
91389                                     if (targetIndex === null || index2 > targetIndex) {
91390                                         targetIndex = index2;
91391                                     }
91392                                     return 'translateY(-100%)';
91393                                 } else if (index2 < index && event.y < node.offsetTop) {
91394                                     if (targetIndex === null || index2 < targetIndex) {
91395                                         targetIndex = index2;
91396                                     }
91397                                     return 'translateY(100%)';
91398                                 }
91399                                 return null;
91400                             });
91401                     })
91402                     .on('end', function(d, index) {
91403
91404                         if (!d3_select(this).classed('dragging')) {
91405                             return;
91406                         }
91407
91408                         d3_select(this)
91409                             .classed('dragging', false);
91410
91411                         selection.selectAll('li.member-row')
91412                             .style('transform', null);
91413
91414                         if (targetIndex !== null) {
91415                             // dragged to a new position, reorder
91416                             context.perform(
91417                                 actionMoveMember(d.relation.id, index, targetIndex),
91418                                 t('operations.reorder_members.annotation')
91419                             );
91420                         }
91421                     })
91422                 );
91423
91424
91425                 // update
91426                 items = items
91427                     .merge(itemsEnter);
91428
91429                 items.select('input.member-role')
91430                     .property('value', function(d) { return d.role; })
91431                     .on('blur', changeRole)
91432                     .on('change', changeRole);
91433
91434                 items.select('button.member-delete')
91435                     .on('click', deleteMember);
91436
91437
91438
91439                 function bindTypeahead(d) {
91440                     var row = d3_select(this);
91441                     var role = row.selectAll('input.member-role');
91442                     var origValue = role.property('value');
91443
91444                     function sort(value, data) {
91445                         var sameletter = [];
91446                         var other = [];
91447                         for (var i = 0; i < data.length; i++) {
91448                             if (data[i].value.substring(0, value.length) === value) {
91449                                 sameletter.push(data[i]);
91450                             } else {
91451                                 other.push(data[i]);
91452                             }
91453                         }
91454                         return sameletter.concat(other);
91455                     }
91456
91457                     role.call(uiCombobox(context, 'member-role')
91458                         .fetcher(function(role, callback) {
91459                             // The `geometry` param is used in the `taginfo.js` interface for
91460                             // filtering results, as a key into the `tag_members_fractions`
91461                             // object.  If we don't know the geometry because the member is
91462                             // not yet downloaded, it's ok to guess based on type.
91463                             var geometry;
91464                             if (d.member) {
91465                                 geometry = context.geometry(d.member.id);
91466                             } else if (d.type === 'relation') {
91467                                 geometry = 'relation';
91468                             } else if (d.type === 'way') {
91469                                 geometry = 'line';
91470                             } else {
91471                                 geometry = 'point';
91472                             }
91473
91474                             var rtype = entity.tags.type;
91475                             taginfo.roles({
91476                                 debounce: true,
91477                                 rtype: rtype || '',
91478                                 geometry: geometry,
91479                                 query: role
91480                             }, function(err, data) {
91481                                 if (!err) callback(sort(role, data));
91482                             });
91483                         })
91484                         .on('cancel', function() {
91485                             role.property('value', origValue);
91486                         })
91487                     );
91488                 }
91489
91490
91491                 function unbind() {
91492                     var row = d3_select(this);
91493
91494                     row.selectAll('input.member-role')
91495                         .call(uiCombobox.off);
91496                 }
91497             }
91498
91499             function rawMemberEditor(selection) {
91500                 var entity = context.entity(_entityID);
91501
91502                 var gt = entity.members.length > _maxMembers ? '>' : '';
91503                 selection.call(uiDisclosure(context, 'raw_member_editor', true)
91504                     .title(t('inspector.all_members') + ' (' + gt + entity.members.slice(0, _maxMembers).length + ')')
91505                     .expanded(true)
91506                     .updatePreference(false)
91507                     .on('toggled', function(expanded) {
91508                         if (expanded) {
91509                             selection.node().parentNode.scrollTop += 200;
91510                         }
91511                     })
91512                     .content(updateDisclosureContent)
91513                 );
91514             }
91515
91516             rawMemberEditor.entityID = function(val) {
91517                 if (!arguments.length) return _entityID;
91518                 _entityID = val;
91519                 return rawMemberEditor;
91520             };
91521
91522
91523             return rawMemberEditor;
91524         }
91525
91526         function uiRawMembershipEditor(context) {
91527             var taginfo = services$1.taginfo;
91528             var nearbyCombo = uiCombobox(context, 'parent-relation')
91529                 .minItems(1)
91530                 .fetcher(fetchNearbyRelations);
91531             var _inChange = false;
91532             var _entityID;
91533             var _showBlank;
91534
91535
91536             function selectRelation(d) {
91537                 event.preventDefault();
91538
91539                 // remove the hover-highlight styling
91540                 utilHighlightEntities([d.relation.id], false, context);
91541
91542                 context.enter(modeSelect(context, [d.relation.id]));
91543             }
91544
91545
91546             function changeRole(d) {
91547                 if (d === 0) return;    // called on newrow (shoudn't happen)
91548                 if (_inChange) return;  // avoid accidental recursive call #5731
91549
91550                 var oldRole = d.member.role;
91551                 var newRole = d3_select(this).property('value');
91552
91553                 if (oldRole !== newRole) {
91554                     _inChange = true;
91555                     context.perform(
91556                         actionChangeMember(d.relation.id, Object.assign({}, d.member, { role: newRole }), d.index),
91557                         t('operations.change_role.annotation')
91558                     );
91559                 }
91560                 _inChange = false;
91561             }
91562
91563
91564             function addMembership(d, role) {
91565                 this.blur();           // avoid keeping focus on the button
91566                 _showBlank = false;
91567
91568                 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
91569
91570                 if (d.relation) {
91571                     context.perform(
91572                         actionAddMember(d.relation.id, member),
91573                         t('operations.add_member.annotation')
91574                     );
91575
91576                 } else {
91577                     var relation = osmRelation();
91578                     context.perform(
91579                         actionAddEntity(relation),
91580                         actionAddMember(relation.id, member),
91581                         t('operations.add.annotation.relation')
91582                     );
91583
91584                     context.enter(modeSelect(context, [relation.id]).newFeature(true));
91585                 }
91586             }
91587
91588
91589             function deleteMembership(d) {
91590                 this.blur();           // avoid keeping focus on the button
91591                 if (d === 0) return;   // called on newrow (shoudn't happen)
91592
91593                 // remove the hover-highlight styling
91594                 utilHighlightEntities([d.relation.id], false, context);
91595
91596                 context.perform(
91597                     actionDeleteMember(d.relation.id, d.index),
91598                     t('operations.delete_member.annotation')
91599                 );
91600             }
91601
91602
91603             function fetchNearbyRelations(q, callback) {
91604                 var newRelation = { relation: null, value: t('inspector.new_relation') };
91605                 var result = [];
91606                 var graph = context.graph();
91607
91608                 context.intersects(context.extent()).forEach(function(entity) {
91609                     if (entity.type !== 'relation' || entity.id === _entityID) return;
91610
91611                     var matched = context.presets().match(entity, graph);
91612                     var presetName = (matched && matched.name()) || t('inspector.relation');
91613                     var entityName = utilDisplayName(entity) || '';
91614
91615                     var value = presetName + ' ' + entityName;
91616                     if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
91617
91618                     result.push({ relation: entity, value: value });
91619                 });
91620
91621                 result.sort(function(a, b) {
91622                     return osmRelation.creationOrder(a.relation, b.relation);
91623                 });
91624
91625                 // Dedupe identical names by appending relation id - see #2891
91626                 var dupeGroups = Object.values(utilArrayGroupBy(result, 'value'))
91627                     .filter(function(v) { return v.length > 1; });
91628
91629                 dupeGroups.forEach(function(group) {
91630                     group.forEach(function(obj) {
91631                         obj.value += ' ' + obj.relation.id;
91632                     });
91633                 });
91634
91635                 result.forEach(function(obj) {
91636                     obj.title = obj.value;
91637                 });
91638
91639                 result.unshift(newRelation);
91640                 callback(result);
91641             }
91642
91643
91644             function rawMembershipEditor(selection) {
91645                 var entity = context.entity(_entityID);
91646                 var parents = context.graph().parentRelations(entity);
91647                 var memberships = [];
91648
91649                 parents.slice(0, 1000).forEach(function(relation) {
91650                     relation.members.forEach(function(member, index) {
91651                         if (member.id === entity.id) {
91652                             memberships.push({ relation: relation, member: member, index: index });
91653                         }
91654                     });
91655                 });
91656
91657                 var gt = parents.length > 1000 ? '>' : '';
91658                 selection.call(uiDisclosure(context, 'raw_membership_editor', true)
91659                     .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
91660                     .expanded(true)
91661                     .updatePreference(false)
91662                     .on('toggled', function(expanded) {
91663                         if (expanded) { selection.node().parentNode.scrollTop += 200; }
91664                     })
91665                     .content(content)
91666                 );
91667
91668
91669                 function content(selection) {
91670                     var list = selection.selectAll('.member-list')
91671                         .data([0]);
91672
91673                     list = list.enter()
91674                         .append('ul')
91675                         .attr('class', 'member-list')
91676                         .merge(list);
91677
91678
91679                     var items = list.selectAll('li.member-row-normal')
91680                         .data(memberships, function(d) {
91681                             return osmEntity.key(d.relation) + ',' + d.index;
91682                         });
91683
91684                     items.exit()
91685                         .each(unbind)
91686                         .remove();
91687
91688                     // Enter
91689                     var itemsEnter = items.enter()
91690                         .append('li')
91691                         .attr('class', 'member-row member-row-normal form-field');
91692
91693                     // highlight the relation in the map while hovering on the list item
91694                     itemsEnter.on('mouseover', function(d) {
91695                             utilHighlightEntities([d.relation.id], true, context);
91696                         })
91697                         .on('mouseout', function(d) {
91698                             utilHighlightEntities([d.relation.id], false, context);
91699                         });
91700
91701                     var labelEnter = itemsEnter
91702                         .append('label')
91703                         .attr('class', 'field-label')
91704                         .append('span')
91705                         .attr('class', 'label-text')
91706                         .append('a')
91707                         .attr('href', '#')
91708                         .on('click', selectRelation);
91709
91710                     labelEnter
91711                         .append('span')
91712                         .attr('class', 'member-entity-type')
91713                         .text(function(d) {
91714                             var matched = context.presets().match(d.relation, context.graph());
91715                             return (matched && matched.name()) || t('inspector.relation');
91716                         });
91717
91718                     labelEnter
91719                         .append('span')
91720                         .attr('class', 'member-entity-name')
91721                         .text(function(d) { return utilDisplayName(d.relation); });
91722
91723                     var wrapEnter = itemsEnter
91724                         .append('div')
91725                         .attr('class', 'form-field-input-wrap form-field-input-member');
91726
91727                     wrapEnter
91728                         .append('input')
91729                         .attr('class', 'member-role')
91730                         .property('type', 'text')
91731                         .attr('maxlength', 255)
91732                         .attr('placeholder', t('inspector.role'))
91733                         .call(utilNoAuto)
91734                         .property('value', function(d) { return d.member.role; })
91735                         .on('blur', changeRole)
91736                         .on('change', changeRole);
91737
91738                     wrapEnter
91739                         .append('button')
91740                         .attr('tabindex', -1)
91741                         .attr('class', 'remove form-field-button member-delete')
91742                         .call(svgIcon('#iD-operation-delete'))
91743                         .on('click', deleteMembership);
91744
91745                     if (taginfo) {
91746                         wrapEnter.each(bindTypeahead);
91747                     }
91748
91749
91750                     var newMembership = list.selectAll('.member-row-new')
91751                         .data(_showBlank ? [0] : []);
91752
91753                     // Exit
91754                     newMembership.exit()
91755                         .remove();
91756
91757                     // Enter
91758                     var newMembershipEnter = newMembership.enter()
91759                         .append('li')
91760                         .attr('class', 'member-row member-row-new form-field');
91761
91762                     newMembershipEnter
91763                         .append('label')
91764                         .attr('class', 'field-label')
91765                         .append('input')
91766                         .attr('placeholder', t('inspector.choose_relation'))
91767                         .attr('type', 'text')
91768                         .attr('class', 'member-entity-input')
91769                         .call(utilNoAuto);
91770
91771                     var newWrapEnter = newMembershipEnter
91772                         .append('div')
91773                         .attr('class', 'form-field-input-wrap form-field-input-member');
91774
91775                     newWrapEnter
91776                         .append('input')
91777                         .attr('class', 'member-role')
91778                         .property('type', 'text')
91779                         .attr('maxlength', 255)
91780                         .attr('placeholder', t('inspector.role'))
91781                         .call(utilNoAuto);
91782
91783                     newWrapEnter
91784                         .append('button')
91785                         .attr('tabindex', -1)
91786                         .attr('class', 'remove form-field-button member-delete')
91787                         .call(svgIcon('#iD-operation-delete'))
91788                         .on('click', function() {
91789                             list.selectAll('.member-row-new')
91790                                 .remove();
91791                         });
91792
91793                     // Update
91794                     newMembership = newMembership
91795                         .merge(newMembershipEnter);
91796
91797                     newMembership.selectAll('.member-entity-input')
91798                         .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
91799                         .call(nearbyCombo
91800                             .on('accept', acceptEntity)
91801                             .on('cancel', cancelEntity)
91802                         );
91803
91804
91805                     // Container for the Add button
91806                     var addRow = selection.selectAll('.add-row')
91807                         .data([0]);
91808
91809                     // enter
91810                     var addRowEnter = addRow.enter()
91811                         .append('div')
91812                         .attr('class', 'add-row');
91813
91814                     var addRelationButton = addRowEnter
91815                         .append('button')
91816                         .attr('class', 'add-relation');
91817
91818                     addRelationButton
91819                         .call(svgIcon('#iD-icon-plus', 'light'));
91820                     addRelationButton
91821                         .call(tooltip().title(t('inspector.add_to_relation')).placement(textDirection === 'ltr' ? 'right' : 'left'));
91822
91823                     addRowEnter
91824                         .append('div')
91825                         .attr('class', 'space-value');   // preserve space
91826
91827                     addRowEnter
91828                         .append('div')
91829                         .attr('class', 'space-buttons');  // preserve space
91830
91831                     // update
91832                     addRow = addRow
91833                         .merge(addRowEnter);
91834
91835                     addRow.select('.add-relation')
91836                         .on('click', function() {
91837                             _showBlank = true;
91838                             content(selection);
91839                             list.selectAll('.member-entity-input').node().focus();
91840                         });
91841
91842
91843                     function acceptEntity(d) {
91844                         if (!d) {
91845                             cancelEntity();
91846                             return;
91847                         }
91848                         var role = list.selectAll('.member-row-new .member-role').property('value');
91849                         addMembership(d, role);
91850                     }
91851
91852
91853                     function cancelEntity() {
91854                         var input = newMembership.selectAll('.member-entity-input');
91855                         input.property('value', '');
91856                     }
91857
91858
91859                     function bindTypeahead(d) {
91860                         var row = d3_select(this);
91861                         var role = row.selectAll('input.member-role');
91862                         var origValue = role.property('value');
91863
91864                         function sort(value, data) {
91865                             var sameletter = [];
91866                             var other = [];
91867                             for (var i = 0; i < data.length; i++) {
91868                                 if (data[i].value.substring(0, value.length) === value) {
91869                                     sameletter.push(data[i]);
91870                                 } else {
91871                                     other.push(data[i]);
91872                                 }
91873                             }
91874                             return sameletter.concat(other);
91875                         }
91876
91877                         role.call(uiCombobox(context, 'member-role')
91878                             .fetcher(function(role, callback) {
91879                                 var rtype = d.relation.tags.type;
91880                                 taginfo.roles({
91881                                     debounce: true,
91882                                     rtype: rtype || '',
91883                                     geometry: context.geometry(_entityID),
91884                                     query: role
91885                                 }, function(err, data) {
91886                                     if (!err) callback(sort(role, data));
91887                                 });
91888                             })
91889                             .on('cancel', function() {
91890                                 role.property('value', origValue);
91891                             })
91892                         );
91893                     }
91894
91895
91896                     function unbind() {
91897                         var row = d3_select(this);
91898
91899                         row.selectAll('input.member-role')
91900                             .call(uiCombobox.off);
91901                     }
91902                 }
91903             }
91904
91905
91906             rawMembershipEditor.entityID = function(val) {
91907                 if (!arguments.length) return _entityID;
91908                 _entityID = val;
91909                 _showBlank = false;
91910                 return rawMembershipEditor;
91911             };
91912
91913
91914             return rawMembershipEditor;
91915         }
91916
91917         // This currently only works with the 'restrictions' field
91918         // It borrows some code from uiHelp
91919
91920         function uiFieldHelp(context, fieldName) {
91921             var fieldHelp = {};
91922             var _inspector = d3_select(null);
91923             var _wrap = d3_select(null);
91924             var _body = d3_select(null);
91925
91926             var fieldHelpKeys = {
91927                 restrictions: [
91928                     ['about',[
91929                         'about',
91930                         'from_via_to',
91931                         'maxdist',
91932                         'maxvia'
91933                     ]],
91934                     ['inspecting',[
91935                         'about',
91936                         'from_shadow',
91937                         'allow_shadow',
91938                         'restrict_shadow',
91939                         'only_shadow',
91940                         'restricted',
91941                         'only'
91942                     ]],
91943                     ['modifying',[
91944                         'about',
91945                         'indicators',
91946                         'allow_turn',
91947                         'restrict_turn',
91948                         'only_turn'
91949                     ]],
91950                     ['tips',[
91951                         'simple',
91952                         'simple_example',
91953                         'indirect',
91954                         'indirect_example',
91955                         'indirect_noedit'
91956                     ]]
91957                 ]
91958             };
91959
91960             var fieldHelpHeadings = {};
91961
91962             var replacements = {
91963                 distField: t('restriction.controls.distance'),
91964                 viaField: t('restriction.controls.via'),
91965                 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
91966                 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
91967                 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
91968                 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
91969                 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
91970                 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
91971                 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
91972             };
91973
91974
91975             // For each section, squash all the texts into a single markdown document
91976             var docs = fieldHelpKeys[fieldName].map(function(key) {
91977                 var helpkey = 'help.field.' + fieldName + '.' + key[0];
91978                 var text = key[1].reduce(function(all, part) {
91979                     var subkey = helpkey + '.' + part;
91980                     var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
91981                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
91982                     return all + hhh + t(subkey, replacements) + '\n\n';
91983                 }, '');
91984
91985                 return {
91986                     key: helpkey,
91987                     title: t(helpkey + '.title'),
91988                     html: marked(text.trim())
91989                 };
91990             });
91991
91992
91993             function show() {
91994                 updatePosition();
91995
91996                 _body
91997                     .classed('hide', false)
91998                     .style('opacity', '0')
91999                     .transition()
92000                     .duration(200)
92001                     .style('opacity', '1');
92002             }
92003
92004
92005             function hide() {
92006                 _body
92007                     .classed('hide', true)
92008                     .transition()
92009                     .duration(200)
92010                     .style('opacity', '0')
92011                     .on('end', function () {
92012                         _body.classed('hide', true);
92013                     });
92014             }
92015
92016
92017             function clickHelp(index) {
92018                 var d = docs[index];
92019                 var tkeys = fieldHelpKeys[fieldName][index][1];
92020
92021                 _body.selectAll('.field-help-nav-item')
92022                     .classed('active', function(d, i) { return i === index; });
92023
92024                 var content = _body.selectAll('.field-help-content')
92025                     .html(d.html);
92026
92027                 // class the paragraphs so we can find and style them
92028                 content.selectAll('p')
92029                     .attr('class', function(d, i) { return tkeys[i]; });
92030
92031                 // insert special content for certain help sections
92032                 if (d.key === 'help.field.restrictions.inspecting') {
92033                     content
92034                         .insert('img', 'p.from_shadow')
92035                         .attr('class', 'field-help-image cf')
92036                         .attr('src', context.imagePath('tr_inspect.gif'));
92037
92038                 } else if (d.key === 'help.field.restrictions.modifying') {
92039                     content
92040                         .insert('img', 'p.allow_turn')
92041                         .attr('class', 'field-help-image cf')
92042                         .attr('src', context.imagePath('tr_modify.gif'));
92043                 }
92044             }
92045
92046
92047             fieldHelp.button = function(selection) {
92048                 if (_body.empty()) return;
92049
92050                 var button = selection.selectAll('.field-help-button')
92051                     .data([0]);
92052
92053                 // enter/update
92054                 button.enter()
92055                     .append('button')
92056                     .attr('class', 'field-help-button')
92057                     .attr('tabindex', -1)
92058                     .call(svgIcon('#iD-icon-help'))
92059                     .merge(button)
92060                     .on('click', function () {
92061                         event.stopPropagation();
92062                         event.preventDefault();
92063                         if (_body.classed('hide')) {
92064                             show();
92065                         } else {
92066                             hide();
92067                         }
92068                     });
92069             };
92070
92071
92072             function updatePosition() {
92073                 var wrap = _wrap.node();
92074                 var inspector = _inspector.node();
92075                 var wRect = wrap.getBoundingClientRect();
92076                 var iRect = inspector.getBoundingClientRect();
92077
92078                 _body
92079                     .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
92080             }
92081
92082
92083             fieldHelp.body = function(selection) {
92084                 // This control expects the field to have a form-field-input-wrap div
92085                 _wrap = selection.selectAll('.form-field-input-wrap');
92086                 if (_wrap.empty()) return;
92087
92088                 // absolute position relative to the inspector, so it "floats" above the fields
92089                 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
92090                 if (_inspector.empty()) return;
92091
92092                 _body = _inspector.selectAll('.field-help-body')
92093                     .data([0]);
92094
92095                 var enter = _body.enter()
92096                     .append('div')
92097                     .attr('class', 'field-help-body hide');   // initially hidden
92098
92099                 var titleEnter = enter
92100                     .append('div')
92101                     .attr('class', 'field-help-title cf');
92102
92103                 titleEnter
92104                     .append('h2')
92105                     .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
92106                     .text(t('help.field.' + fieldName + '.title'));
92107
92108                 titleEnter
92109                     .append('button')
92110                     .attr('class', 'fr close')
92111                     .on('click', function() {
92112                         event.stopPropagation();
92113                         event.preventDefault();
92114                         hide();
92115                     })
92116                     .call(svgIcon('#iD-icon-close'));
92117
92118                 var navEnter = enter
92119                     .append('div')
92120                     .attr('class', 'field-help-nav cf');
92121
92122                 var titles = docs.map(function(d) { return d.title; });
92123                 navEnter.selectAll('.field-help-nav-item')
92124                     .data(titles)
92125                     .enter()
92126                     .append('div')
92127                     .attr('class', 'field-help-nav-item')
92128                     .text(function(d) { return d; })
92129                     .on('click', function(d, i) {
92130                         event.stopPropagation();
92131                         event.preventDefault();
92132                         clickHelp(i);
92133                     });
92134
92135                 enter
92136                     .append('div')
92137                     .attr('class', 'field-help-content');
92138
92139                 _body = _body
92140                     .merge(enter);
92141
92142                 clickHelp(0);
92143             };
92144
92145
92146             return fieldHelp;
92147         }
92148
92149         function uiFieldCheck(field, context) {
92150             var dispatch$1 = dispatch('change');
92151             var options = field.strings && field.strings.options;
92152             var values = [];
92153             var texts = [];
92154
92155             var input = d3_select(null);
92156             var text = d3_select(null);
92157             var label = d3_select(null);
92158             var reverser = d3_select(null);
92159
92160             var _impliedYes;
92161             var _entityID;
92162             var _value;
92163
92164
92165             if (options) {
92166                 for (var k in options) {
92167                     values.push(k === 'undefined' ? undefined : k);
92168                     texts.push(field.t('options.' + k, { 'default': options[k] }));
92169                 }
92170             } else {
92171                 values = [undefined, 'yes'];
92172                 texts = [t('inspector.unknown'), t('inspector.check.yes')];
92173                 if (field.type !== 'defaultCheck') {
92174                     values.push('no');
92175                     texts.push(t('inspector.check.no'));
92176                 }
92177             }
92178
92179
92180             // Checks tags to see whether an undefined value is "Assumed to be Yes"
92181             function checkImpliedYes() {
92182                 _impliedYes = (field.id === 'oneway_yes');
92183
92184                 // hack: pretend `oneway` field is a `oneway_yes` field
92185                 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
92186                 if (field.id === 'oneway') {
92187                     var entity = context.entity(_entityID);
92188                     for (var key in entity.tags) {
92189                         if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
92190                             _impliedYes = true;
92191                             texts[0] = t('presets.fields.oneway_yes.options.undefined');
92192                             break;
92193                         }
92194                     }
92195                 }
92196             }
92197
92198
92199             function reverserHidden() {
92200                 if (!d3_select('div.inspector-hover').empty()) return true;
92201                 return !(_value === 'yes' || (_impliedYes && !_value));
92202             }
92203
92204
92205             function reverserSetText(selection) {
92206                 var entity = context.hasEntity(_entityID);
92207                 if (reverserHidden() || !entity) return selection;
92208
92209                 var first = entity.first();
92210                 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
92211                 var pseudoDirection = first < last;
92212                 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
92213
92214                 selection.selectAll('.reverser-span')
92215                     .text(t('inspector.check.reverser'))
92216                     .call(svgIcon(icon, 'inline'));
92217
92218                 return selection;
92219             }
92220
92221
92222             var check = function(selection) {
92223                 checkImpliedYes();
92224
92225                 label = selection.selectAll('.form-field-input-wrap')
92226                     .data([0]);
92227
92228                 var enter = label.enter()
92229                     .append('label')
92230                     .attr('class', 'form-field-input-wrap form-field-input-check');
92231
92232                 enter
92233                     .append('input')
92234                     .property('indeterminate', field.type !== 'defaultCheck')
92235                     .attr('type', 'checkbox')
92236                     .attr('id', 'preset-input-' + field.safeid);
92237
92238                 enter
92239                     .append('span')
92240                     .text(texts[0])
92241                     .attr('class', 'value');
92242
92243                 if (field.type === 'onewayCheck') {
92244                     enter
92245                         .append('a')
92246                         .attr('id', 'preset-input-' + field.safeid + '-reverser')
92247                         .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
92248                         .attr('href', '#')
92249                         .append('span')
92250                         .attr('class', 'reverser-span');
92251                 }
92252
92253                 label = label.merge(enter);
92254                 input = label.selectAll('input');
92255                 text = label.selectAll('span.value');
92256
92257                 input
92258                     .on('click', function() {
92259                         event.stopPropagation();
92260                         var t = {};
92261                         t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
92262
92263                         // Don't cycle through `alternating` or `reversible` states - #4970
92264                         // (They are supported as translated strings, but should not toggle with clicks)
92265                         if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
92266                             t[field.key] = values[0];
92267                         }
92268
92269                         dispatch$1.call('change', this, t);
92270                     });
92271
92272                 if (field.type === 'onewayCheck') {
92273                     reverser = label.selectAll('.reverser');
92274
92275                     reverser
92276                         .call(reverserSetText)
92277                         .on('click', function() {
92278                             event.preventDefault();
92279                             event.stopPropagation();
92280                             context.perform(
92281                                 actionReverse(_entityID),
92282                                 t('operations.reverse.annotation')
92283                             );
92284                             d3_select(this)
92285                                 .call(reverserSetText);
92286                         });
92287                 }
92288             };
92289
92290
92291             check.entity = function(_) {
92292                 if (!arguments.length) return context.hasEntity(_entityID);
92293                 _entityID = _.id;
92294                 return check;
92295             };
92296
92297
92298             check.tags = function(tags) {
92299
92300                 function isChecked(val) {
92301                     return val !== 'no' && val !== '' && val !== undefined && val !== null;
92302                 }
92303
92304                 function textFor(val) {
92305                     if (val === '') val = undefined;
92306                     var index = values.indexOf(val);
92307                     return (index !== -1 ? texts[index] : ('"' + val + '"'));
92308                 }
92309
92310                 checkImpliedYes();
92311                 _value = tags[field.key] && tags[field.key].toLowerCase();
92312
92313                 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
92314                     _value = 'yes';
92315                 }
92316
92317                 input
92318                     .property('indeterminate', field.type !== 'defaultCheck' && !_value)
92319                     .property('checked', isChecked(_value));
92320
92321                 text
92322                     .text(textFor(_value));
92323
92324                 label
92325                     .classed('set', !!_value);
92326
92327                 if (field.type === 'onewayCheck') {
92328                     reverser
92329                         .classed('hide', reverserHidden())
92330                         .call(reverserSetText);
92331                 }
92332             };
92333
92334
92335             check.focus = function() {
92336                 input.node().focus();
92337             };
92338
92339             return utilRebind(check, dispatch$1, 'on');
92340         }
92341
92342         function uiFieldCombo(field, context) {
92343             var dispatch$1 = dispatch('change');
92344             var nominatim = services$1.geocoder;
92345             var taginfo = services$1.taginfo;
92346             var isMulti = (field.type === 'multiCombo');
92347             var isNetwork = (field.type === 'networkCombo');
92348             var isSemi = (field.type === 'semiCombo');
92349             var optstrings = field.strings && field.strings.options;
92350             var optarray = field.options;
92351             var snake_case = (field.snake_case || (field.snake_case === undefined));
92352             var caseSensitive = field.caseSensitive;
92353             var combobox = uiCombobox(context, 'combo-' + field.safeid)
92354                 .caseSensitive(caseSensitive)
92355                 .minItems(isMulti || isSemi ? 1 : 2);
92356             var container = d3_select(null);
92357             var inputWrap = d3_select(null);
92358             var input = d3_select(null);
92359             var _comboData = [];
92360             var _multiData = [];
92361             var _entity;
92362             var _country;
92363
92364             // ensure multiCombo field.key ends with a ':'
92365             if (isMulti && /[^:]$/.test(field.key)) {
92366                 field.key += ':';
92367             }
92368
92369
92370             function snake(s) {
92371                 return s.replace(/\s+/g, '_');
92372             }
92373
92374             function unsnake(s) {
92375                 return s.replace(/_+/g, ' ');
92376             }
92377
92378             function clean(s) {
92379                 return s.split(';')
92380                     .map(function(s) { return s.trim(); })
92381                     .join(';');
92382             }
92383
92384
92385             // returns the tag value for a display value
92386             // (for multiCombo, dval should be the key suffix, not the entire key)
92387             function tagValue(dval) {
92388                 dval = clean(dval || '');
92389
92390                 if (optstrings) {
92391                     var found = _comboData.find(function(o) {
92392                         return o.key && clean(o.value) === dval;
92393                     });
92394                     if (found) {
92395                         return found.key;
92396                     }
92397                 }
92398
92399                 if (field.type === 'typeCombo' && !dval) {
92400                     return 'yes';
92401                 }
92402
92403                 return (snake_case ? snake(dval) : dval) || undefined;
92404             }
92405
92406
92407             // returns the display value for a tag value
92408             // (for multiCombo, tval should be the key suffix, not the entire key)
92409             function displayValue(tval) {
92410                 tval = tval || '';
92411
92412                 if (optstrings) {
92413                     var found = _comboData.find(function(o) {
92414                         return o.key === tval && o.value;
92415                     });
92416                     if (found) {
92417                         return found.value;
92418                     }
92419                 }
92420
92421                 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
92422                     return '';
92423                 }
92424
92425                 return snake_case ? unsnake(tval) : tval;
92426             }
92427
92428
92429             // Compute the difference between arrays of objects by `value` property
92430             //
92431             // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
92432             // > [{value:1}, {value:3}]
92433             //
92434             function objectDifference(a, b) {
92435                 return a.filter(function(d1) {
92436                     return !b.some(function(d2) { return d1.value === d2.value; });
92437                 });
92438             }
92439
92440
92441             function initCombo(selection, attachTo) {
92442                 if (optstrings) {
92443                     selection.attr('readonly', 'readonly');
92444                     selection.call(combobox, attachTo);
92445                     setStaticValues(setPlaceholder);
92446
92447                 } else if (optarray) {
92448                     selection.call(combobox, attachTo);
92449                     setStaticValues(setPlaceholder);
92450
92451                 } else if (taginfo) {
92452                     selection.call(combobox.fetcher(setTaginfoValues), attachTo);
92453                     setTaginfoValues('', setPlaceholder);
92454                 }
92455             }
92456
92457
92458             function setStaticValues(callback) {
92459                 if (!(optstrings || optarray)) return;
92460
92461                 if (optstrings) {
92462                     _comboData = Object.keys(optstrings).map(function(k) {
92463                         var v = field.t('options.' + k, { 'default': optstrings[k] });
92464                         return {
92465                             key: k,
92466                             value: v,
92467                             title: v
92468                         };
92469                     });
92470
92471                 } else if (optarray) {
92472                     _comboData = optarray.map(function(k) {
92473                         var v = snake_case ? unsnake(k) : k;
92474                         return {
92475                             key: k,
92476                             value: v,
92477                             title: v
92478                         };
92479                     });
92480                 }
92481
92482                 combobox.data(objectDifference(_comboData, _multiData));
92483                 if (callback) callback(_comboData);
92484             }
92485
92486
92487             function setTaginfoValues(q, callback) {
92488                 var fn = isMulti ? 'multikeys' : 'values';
92489                 var query = (isMulti ? field.key : '') + q;
92490                 var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
92491                 if (hasCountryPrefix) {
92492                     query = _country + ':';
92493                 }
92494
92495                 var params = {
92496                     debounce: (q !== ''),
92497                     key: field.key,
92498                     query: query
92499                 };
92500
92501                 if (_entity) {
92502                     params.geometry = context.geometry(_entity.id);
92503                 }
92504
92505                 taginfo[fn](params, function(err, data) {
92506                     if (err) return;
92507
92508                     var deprecatedValues = osmEntity.deprecatedTagValuesByKey()[field.key];
92509                     if (deprecatedValues) {
92510                         // don't suggest deprecated tag values
92511                         data = data.filter(function(d) {
92512                             return deprecatedValues.indexOf(d.value) === -1;
92513                         });
92514                     }
92515
92516                     if (hasCountryPrefix) {
92517                         data = data.filter(function(d) {
92518                             return d.value.toLowerCase().indexOf(_country + ':') === 0;
92519                         });
92520                     }
92521
92522                     // hide the caret if there are no suggestions
92523                     container.classed('empty-combobox', data.length === 0);
92524
92525                     _comboData = data.map(function(d) {
92526                         var k = d.value;
92527                         if (isMulti) k = k.replace(field.key, '');
92528                         var v = snake_case ? unsnake(k) : k;
92529                         return {
92530                             key: k,
92531                             value: v,
92532                             title: isMulti ? v : d.title
92533                         };
92534                     });
92535
92536                     _comboData = objectDifference(_comboData, _multiData);
92537                     if (callback) callback(_comboData);
92538                 });
92539             }
92540
92541
92542             function setPlaceholder(values) {
92543                 var ph;
92544
92545                 if (isMulti || isSemi) {
92546                     ph = field.placeholder() || t('inspector.add');
92547                 } else {
92548                     var vals = values
92549                         .map(function(d) { return d.value; })
92550                         .filter(function(s) { return s.length < 20; });
92551
92552                     var placeholders = vals.length > 1 ? vals : values.map(function(d) { return d.key; });
92553                     ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
92554                 }
92555
92556                 if (!/(…|\.\.\.)$/.test(ph)) {
92557                     ph += '…';
92558                 }
92559
92560                 container.selectAll('input')
92561                     .attr('placeholder', ph);
92562             }
92563
92564
92565             function change() {
92566                 var t = {};
92567                 var val;
92568
92569                 if (isMulti || isSemi) {
92570                     val = tagValue(utilGetSetValue(input).replace(/,/g, ';')) || '';
92571                     container.classed('active', false);
92572                     utilGetSetValue(input, '');
92573
92574                     var vals = val.split(';').filter(Boolean);
92575                     if (!vals.length) return;
92576
92577                     if (isMulti) {
92578                         utilArrayUniq(vals).forEach(function(v) {
92579                             var key = field.key + v;
92580                             if (_entity) {
92581                                 // don't set a multicombo value to 'yes' if it already has a non-'no' value
92582                                 // e.g. `language:de=main`
92583                                 var old = _entity.tags[key] || '';
92584                                 if (old && old.toLowerCase() !== 'no') return;
92585                             }
92586                             field.keys.push(key);
92587                             t[key] = 'yes';
92588                         });
92589
92590                     } else if (isSemi) {
92591                         var arr = _multiData.map(function(d) { return d.key; });
92592                         arr = arr.concat(vals);
92593                         t[field.key] = utilArrayUniq(arr).filter(Boolean).join(';');
92594                     }
92595
92596                     window.setTimeout(function() { input.node().focus(); }, 10);
92597
92598                 } else {
92599                     val = tagValue(utilGetSetValue(input));
92600                     t[field.key] = val;
92601                 }
92602
92603                 dispatch$1.call('change', this, t);
92604             }
92605
92606
92607             function removeMultikey(d) {
92608                 event.stopPropagation();
92609                 var t = {};
92610                 if (isMulti) {
92611                     t[d.key] = undefined;
92612                 } else if (isSemi) {
92613                     var arr = _multiData.map(function(md) {
92614                         return md.key === d.key ? null : md.key;
92615                     }).filter(Boolean);
92616
92617                     arr = utilArrayUniq(arr);
92618                     t[field.key] = arr.length ? arr.join(';') : undefined;
92619                 }
92620                 dispatch$1.call('change', this, t);
92621             }
92622
92623
92624             function combo(selection) {
92625                 container = selection.selectAll('.form-field-input-wrap')
92626                     .data([0]);
92627
92628                 var type = (isMulti || isSemi) ? 'multicombo': 'combo';
92629                 container = container.enter()
92630                     .append('div')
92631                     .attr('class', 'form-field-input-wrap form-field-input-' + type)
92632                     .merge(container);
92633
92634                 if (isMulti || isSemi) {
92635                     container = container.selectAll('.chiplist')
92636                         .data([0]);
92637
92638                     var listClass = 'chiplist';
92639
92640                     // Use a separate line for each value in the Destinations field
92641                     // to mimic highway exit signs
92642                     if (field.id === 'destination_oneway') {
92643                         listClass += ' full-line-chips';
92644                     }
92645
92646                     container = container.enter()
92647                         .append('ul')
92648                         .attr('class', listClass)
92649                         .on('click', function() {
92650                             window.setTimeout(function() { input.node().focus(); }, 10);
92651                         })
92652                         .merge(container);
92653
92654
92655                     inputWrap = container.selectAll('.input-wrap')
92656                         .data([0]);
92657
92658                     inputWrap = inputWrap.enter()
92659                         .append('li')
92660                         .attr('class', 'input-wrap')
92661                         .merge(inputWrap);
92662
92663                     input = inputWrap.selectAll('input')
92664                         .data([0]);
92665                 } else {
92666                     input = container.selectAll('input')
92667                         .data([0]);
92668                 }
92669
92670                 input = input.enter()
92671                     .append('input')
92672                     .attr('type', 'text')
92673                     .attr('id', 'preset-input-' + field.safeid)
92674                     .call(utilNoAuto)
92675                     .call(initCombo, selection)
92676                     .merge(input);
92677
92678                 if (isNetwork && nominatim && _entity) {
92679                     var center = _entity.extent(context.graph()).center();
92680                     nominatim.countryCode(center, function (err, code) {
92681                         _country = code;
92682                     });
92683                 }
92684
92685                 input
92686                     .on('change', change)
92687                     .on('blur', change);
92688
92689                 input
92690                     .on('keydown.field', function() {
92691                         switch (event.keyCode) {
92692                             case 13: // ↩ Return
92693                                 input.node().blur(); // blurring also enters the value
92694                                 event.stopPropagation();
92695                                 break;
92696                         }
92697                     });
92698
92699                 if (isMulti || isSemi) {
92700                     combobox
92701                         .on('accept', function() {
92702                             input.node().blur();
92703                             input.node().focus();
92704                         });
92705
92706                     input
92707                         .on('focus', function() { container.classed('active', true); });
92708                 }
92709             }
92710
92711
92712             combo.tags = function(tags) {
92713                 if (isMulti || isSemi) {
92714                     _multiData = [];
92715
92716                     if (isMulti) {
92717                         // Build _multiData array containing keys already set..
92718                         for (var k in tags) {
92719                             if (k.indexOf(field.key) !== 0) continue;
92720                             var v = (tags[k] || '').toLowerCase();
92721                             if (v === '' || v === 'no') continue;
92722
92723                             var suffix = k.substring(field.key.length);
92724                             _multiData.push({
92725                                 key: k,
92726                                 value: displayValue(suffix)
92727                             });
92728                         }
92729
92730                         // Set keys for form-field modified (needed for undo and reset buttons)..
92731                         field.keys = _multiData.map(function(d) { return d.key; });
92732
92733                     } else if (isSemi) {
92734                         var arr = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
92735                         _multiData = arr.map(function(k) {
92736                             return {
92737                                 key: k,
92738                                 value: displayValue(k)
92739                             };
92740                         });
92741                     }
92742
92743                     // Exclude existing multikeys from combo options..
92744                     var available = objectDifference(_comboData, _multiData);
92745                     combobox.data(available);
92746
92747                     // Hide 'Add' button if this field uses fixed set of
92748                     // translateable optstrings and they're all currently used..
92749                     container.selectAll('.combobox-input, .combobox-caret')
92750                         .classed('hide', optstrings && !available.length);
92751
92752
92753                     // Render chips
92754                     var chips = container.selectAll('.chips')
92755                         .data(_multiData);
92756
92757                     chips.exit()
92758                         .remove();
92759
92760                     var enter = chips.enter()
92761                         .insert('li', '.input-wrap')
92762                         .attr('class', 'chips');
92763
92764                     enter.append('span');
92765                     enter.append('a');
92766
92767                     chips = chips.merge(enter);
92768
92769                     chips.select('span')
92770                         .text(function(d) { return d.value; });
92771
92772                     chips.select('a')
92773                         .on('click', removeMultikey)
92774                         .attr('class', 'remove')
92775                         .text('×');
92776
92777                 } else {
92778                     utilGetSetValue(input, displayValue(tags[field.key]));
92779                 }
92780             };
92781
92782
92783             combo.focus = function() {
92784                 input.node().focus();
92785             };
92786
92787
92788             combo.entity = function(val) {
92789                 if (!arguments.length) return _entity;
92790                 _entity = val;
92791                 return combo;
92792             };
92793
92794
92795             return utilRebind(combo, dispatch$1, 'on');
92796         }
92797
92798         function uiFieldText(field, context) {
92799             var dispatch$1 = dispatch('change');
92800             var nominatim = services$1.geocoder;
92801             var input = d3_select(null);
92802             var _entity;
92803
92804             function i(selection) {
92805                 var preset = _entity && context.presets().match(_entity, context.graph());
92806                 var isLocked = preset && preset.suggestion && field.id === 'brand';
92807                 field.locked(isLocked);
92808
92809                 var wrap = selection.selectAll('.form-field-input-wrap')
92810                     .data([0]);
92811
92812                 wrap = wrap.enter()
92813                     .append('div')
92814                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92815                     .merge(wrap);
92816
92817                 var fieldID = 'preset-input-' + field.safeid;
92818
92819                 input = wrap.selectAll('input')
92820                     .data([0]);
92821
92822                 input = input.enter()
92823                     .append('input')
92824                     .attr('type', field.type)
92825                     .attr('id', fieldID)
92826                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
92827                     .classed(field.type, true)
92828                     .call(utilNoAuto)
92829                     .merge(input);
92830
92831                 input
92832                     .classed('disabled', !!isLocked)
92833                     .attr('readonly', isLocked || null)
92834                     .on('input', change(true))
92835                     .on('blur', change())
92836                     .on('change', change());
92837
92838
92839                 if (field.type === 'tel' && nominatim && _entity) {
92840                     var center = _entity.extent(context.graph()).center();
92841                     nominatim.countryCode(center, function (err, countryCode) {
92842                         if (err || !dataPhoneFormats[countryCode]) return;
92843                         wrap.selectAll('#' + fieldID)
92844                             .attr('placeholder', dataPhoneFormats[countryCode]);
92845                     });
92846
92847                 } else if (field.type === 'number') {
92848                     var rtl = (textDirection === 'rtl');
92849
92850                     input.attr('type', 'text');
92851
92852                     var buttons = wrap.selectAll('.increment, .decrement')
92853                         .data(rtl ? [1, -1] : [-1, 1]);
92854
92855                     buttons.enter()
92856                         .append('button')
92857                         .attr('tabindex', -1)
92858                         .attr('class', function(d) {
92859                             var which = (d === 1 ? 'increment' : 'decrement');
92860                             return 'form-field-button ' + which;
92861                         })
92862                         .merge(buttons)
92863                         .on('click', function(d) {
92864                             event.preventDefault();
92865                             var raw_vals = input.node().value || '0';
92866                             var vals = raw_vals.split(';');
92867                             vals = vals.map(function(v) {
92868                                 var num = parseFloat(v.trim(), 10);
92869                                 return isFinite(num) ? clamped(num + d) : v.trim();
92870                             });
92871                             input.node().value = vals.join(';');
92872                             change()();
92873                         });
92874                 }
92875             }
92876
92877
92878             // clamp number to min/max
92879             function clamped(num) {
92880                 if (field.minValue !== undefined) {
92881                     num = Math.max(num, field.minValue);
92882                 }
92883                 if (field.maxValue !== undefined) {
92884                     num = Math.min(num, field.maxValue);
92885                 }
92886                 return num;
92887             }
92888
92889
92890             function change(onInput) {
92891                 return function() {
92892                     var t = {};
92893                     var val = utilGetSetValue(input).trim() || undefined;
92894
92895                     if (!onInput) {
92896                         if (field.type === 'number' && val !== undefined) {
92897                             var vals = val.split(';');
92898                             vals = vals.map(function(v) {
92899                                 var num = parseFloat(v.trim(), 10);
92900                                 return isFinite(num) ? clamped(num) : v.trim();
92901                             });
92902                             val = vals.join(';');
92903                         }
92904                         utilGetSetValue(input, val || '');
92905                     }
92906                     t[field.key] = val;
92907                     dispatch$1.call('change', this, t, onInput);
92908                 };
92909             }
92910
92911
92912             i.entity = function(val) {
92913                 if (!arguments.length) return _entity;
92914                 _entity = val;
92915                 return i;
92916             };
92917
92918
92919             i.tags = function(tags) {
92920                 utilGetSetValue(input, tags[field.key] || '');
92921             };
92922
92923
92924             i.focus = function() {
92925                 var node = input.node();
92926                 if (node) node.focus();
92927             };
92928
92929             return utilRebind(i, dispatch$1, 'on');
92930         }
92931
92932         function uiFieldAccess(field, context) {
92933             var dispatch$1 = dispatch('change');
92934             var items = d3_select(null);
92935
92936             function access(selection) {
92937                 var wrap = selection.selectAll('.form-field-input-wrap')
92938                     .data([0]);
92939
92940                 wrap = wrap.enter()
92941                     .append('div')
92942                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92943                     .merge(wrap);
92944
92945                 var list = wrap.selectAll('ul')
92946                     .data([0]);
92947
92948                 list = list.enter()
92949                     .append('ul')
92950                     .attr('class', 'rows')
92951                     .merge(list);
92952
92953
92954                 items = list.selectAll('li')
92955                     .data(field.keys);
92956
92957                 // Enter
92958                 var enter = items.enter()
92959                     .append('li')
92960                     .attr('class', function(d) { return 'labeled-input preset-access-' + d; });
92961
92962                 enter
92963                     .append('span')
92964                     .attr('class', 'label preset-label-access')
92965                     .attr('for', function(d) { return 'preset-input-access-' + d; })
92966                     .text(function(d) { return field.t('types.' + d); });
92967
92968                 enter
92969                     .append('div')
92970                     .attr('class', 'preset-input-access-wrap')
92971                     .append('input')
92972                     .attr('type', 'text')
92973                     .attr('class', function(d) { return 'preset-input-access preset-input-access-' + d; })
92974                     .call(utilNoAuto)
92975                     .each(function(d) {
92976                         d3_select(this)
92977                             .call(uiCombobox(context, 'access-' + d)
92978                                 .data(access.options(d))
92979                             );
92980                     });
92981
92982
92983                 // Update
92984                 items = items.merge(enter);
92985
92986                 wrap.selectAll('.preset-input-access')
92987                     .on('change', change)
92988                     .on('blur', change);
92989             }
92990
92991
92992             function change(d) {
92993                 var tag = {};
92994                 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
92995                 dispatch$1.call('change', this, tag);
92996             }
92997
92998
92999             access.options = function(type) {
93000                 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
93001
93002                 if (type !== 'access') {
93003                     options.unshift('yes');
93004                     options.push('designated');
93005
93006                     if (type === 'bicycle') {
93007                         options.push('dismount');
93008                     }
93009                 }
93010
93011                 return options.map(function(option) {
93012                     return {
93013                         title: field.t('options.' + option + '.description'),
93014                         value: option
93015                     };
93016                 });
93017             };
93018
93019
93020             var placeholders = {
93021                 footway: {
93022                     foot: 'designated',
93023                     motor_vehicle: 'no'
93024                 },
93025                 steps: {
93026                     foot: 'yes',
93027                     motor_vehicle: 'no',
93028                     bicycle: 'no',
93029                     horse: 'no'
93030                 },
93031                 pedestrian: {
93032                     foot: 'yes',
93033                     motor_vehicle: 'no'
93034                 },
93035                 cycleway: {
93036                     motor_vehicle: 'no',
93037                     bicycle: 'designated'
93038                 },
93039                 bridleway: {
93040                     motor_vehicle: 'no',
93041                     horse: 'designated'
93042                 },
93043                 path: {
93044                     foot: 'yes',
93045                     motor_vehicle: 'no',
93046                     bicycle: 'yes',
93047                     horse: 'yes'
93048                 },
93049                 motorway: {
93050                     foot: 'no',
93051                     motor_vehicle: 'yes',
93052                     bicycle: 'no',
93053                     horse: 'no'
93054                 },
93055                 trunk: {
93056                     motor_vehicle: 'yes'
93057                 },
93058                 primary: {
93059                     foot: 'yes',
93060                     motor_vehicle: 'yes',
93061                     bicycle: 'yes',
93062                     horse: 'yes'
93063                 },
93064                 secondary: {
93065                     foot: 'yes',
93066                     motor_vehicle: 'yes',
93067                     bicycle: 'yes',
93068                     horse: 'yes'
93069                 },
93070                 tertiary: {
93071                     foot: 'yes',
93072                     motor_vehicle: 'yes',
93073                     bicycle: 'yes',
93074                     horse: 'yes'
93075                 },
93076                 residential: {
93077                     foot: 'yes',
93078                     motor_vehicle: 'yes',
93079                     bicycle: 'yes',
93080                     horse: 'yes'
93081                 },
93082                 unclassified: {
93083                     foot: 'yes',
93084                     motor_vehicle: 'yes',
93085                     bicycle: 'yes',
93086                     horse: 'yes'
93087                 },
93088                 service: {
93089                     foot: 'yes',
93090                     motor_vehicle: 'yes',
93091                     bicycle: 'yes',
93092                     horse: 'yes'
93093                 },
93094                 motorway_link: {
93095                     foot: 'no',
93096                     motor_vehicle: 'yes',
93097                     bicycle: 'no',
93098                     horse: 'no'
93099                 },
93100                 trunk_link: {
93101                     motor_vehicle: 'yes'
93102                 },
93103                 primary_link: {
93104                     foot: 'yes',
93105                     motor_vehicle: 'yes',
93106                     bicycle: 'yes',
93107                     horse: 'yes'
93108                 },
93109                 secondary_link: {
93110                     foot: 'yes',
93111                     motor_vehicle: 'yes',
93112                     bicycle: 'yes',
93113                     horse: 'yes'
93114                 },
93115                 tertiary_link: {
93116                     foot: 'yes',
93117                     motor_vehicle: 'yes',
93118                     bicycle: 'yes',
93119                     horse: 'yes'
93120                 }
93121             };
93122
93123
93124             access.tags = function(tags) {
93125                 utilGetSetValue(items.selectAll('.preset-input-access'),
93126                     function(d) { return tags[d] || ''; })
93127                     .attr('placeholder', function() {
93128                         return tags.access ? tags.access : field.placeholder();
93129                     });
93130
93131                 items.selectAll('.preset-input-access-access')
93132                     .attr('placeholder', 'yes');
93133
93134                 var which = tags.highway;
93135                 if (!placeholders[which]) return;
93136
93137                 var keys = Object.keys(placeholders[which]);
93138                 keys.forEach(function(k) {
93139                     var v = placeholders[which][k];
93140                     items.selectAll('.preset-input-access-' + k)
93141                         .attr('placeholder', tags.access || v);
93142                 });
93143             };
93144
93145
93146             access.focus = function() {
93147                 items.selectAll('.preset-input-access')
93148                     .node().focus();
93149             };
93150
93151
93152             return utilRebind(access, dispatch$1, 'on');
93153         }
93154
93155         function uiFieldAddress(field, context) {
93156             var dispatch$1 = dispatch('init', 'change');
93157             var nominatim = services$1.geocoder;
93158             var wrap = d3_select(null);
93159             var _isInitialized = false;
93160             var _entity;
93161
93162             function getNearStreets() {
93163                 var extent = _entity.extent(context.graph());
93164                 var l = extent.center();
93165                 var box = geoExtent(l).padByMeters(200);
93166
93167                 var streets = context.intersects(box)
93168                     .filter(isAddressable)
93169                     .map(function(d) {
93170                         var loc = context.projection([
93171                             (extent[0][0] + extent[1][0]) / 2,
93172                             (extent[0][1] + extent[1][1]) / 2
93173                         ]);
93174                         var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
93175
93176                         return {
93177                             title: d.tags.name,
93178                             value: d.tags.name,
93179                             dist: choice.distance
93180                         };
93181                     })
93182                     .sort(function(a, b) {
93183                         return a.dist - b.dist;
93184                     });
93185
93186                 return utilArrayUniqBy(streets, 'value');
93187
93188                 function isAddressable(d) {
93189                     return d.tags.highway && d.tags.name && d.type === 'way';
93190                 }
93191             }
93192
93193
93194             function getNearCities() {
93195                 var extent = _entity.extent(context.graph());
93196                 var l = extent.center();
93197                 var box = geoExtent(l).padByMeters(200);
93198
93199                 var cities = context.intersects(box)
93200                     .filter(isAddressable)
93201                     .map(function(d) {
93202                         return {
93203                             title: d.tags['addr:city'] || d.tags.name,
93204                             value: d.tags['addr:city'] || d.tags.name,
93205                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93206                         };
93207                     })
93208                     .sort(function(a, b) {
93209                         return a.dist - b.dist;
93210                     });
93211
93212                 return utilArrayUniqBy(cities, 'value');
93213
93214
93215                 function isAddressable(d) {
93216                     if (d.tags.name) {
93217                         if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
93218                             return true;
93219                         if (d.tags.border_type === 'city')
93220                             return true;
93221                         if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
93222                             return true;
93223                     }
93224
93225                     if (d.tags['addr:city'])
93226                         return true;
93227
93228                     return false;
93229                 }
93230             }
93231
93232             function getNearValues(key) {
93233                 var extent = _entity.extent(context.graph());
93234                 var l = extent.center();
93235                 var box = geoExtent(l).padByMeters(200);
93236
93237                 var results = context.intersects(box)
93238                     .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
93239                     .map(function(d) {
93240                         return {
93241                             title: d.tags[key],
93242                             value: d.tags[key],
93243                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93244                         };
93245                     })
93246                     .sort(function(a, b) {
93247                         return a.dist - b.dist;
93248                     });
93249
93250                 return utilArrayUniqBy(results, 'value');
93251             }
93252
93253
93254             function countryCallback(err, countryCode) {
93255                 if (err) return;
93256                 countryCode = countryCode.toLowerCase();
93257
93258                 var addressFormat;
93259                 for (var i = 0; i < dataAddressFormats.length; i++) {
93260                     var format = dataAddressFormats[i];
93261                     if (!format.countryCodes) {
93262                         addressFormat = format;   // choose the default format, keep going
93263                     } else if (format.countryCodes.indexOf(countryCode) !== -1) {
93264                         addressFormat = format;   // choose the country format, stop here
93265                         break;
93266                     }
93267                 }
93268
93269                 var dropdowns = addressFormat.dropdowns || [
93270                     'city', 'county', 'country', 'district', 'hamlet',
93271                     'neighbourhood', 'place', 'postcode', 'province',
93272                     'quarter', 'state', 'street', 'subdistrict', 'suburb'
93273                 ];
93274
93275                 var widths = addressFormat.widths || {
93276                     housenumber: 1/3, street: 2/3,
93277                     city: 2/3, state: 1/4, postcode: 1/3
93278                 };
93279
93280                 function row(r) {
93281                     // Normalize widths.
93282                     var total = r.reduce(function(sum, key) {
93283                         return sum + (widths[key] || 0.5);
93284                     }, 0);
93285
93286                     return r.map(function(key) {
93287                         return {
93288                             id: key,
93289                             width: (widths[key] || 0.5) / total
93290                         };
93291                     });
93292                 }
93293
93294                 wrap.selectAll('.addr-row')
93295                     .data(addressFormat.format)
93296                     .enter()
93297                     .append('div')
93298                     .attr('class', 'addr-row')
93299                     .selectAll('input')
93300                     .data(row)
93301                     .enter()
93302                     .append('input')
93303                     .property('type', 'text')
93304                     .attr('placeholder', function (d) {
93305                         var localkey = d.id + '!' + countryCode;
93306                         var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
93307                         return field.t('placeholders.' + tkey);
93308                     })
93309                     .attr('class', function (d) { return 'addr-' + d.id; })
93310                     .call(utilNoAuto)
93311                     .each(addDropdown)
93312                     .style('width', function (d) { return d.width * 100 + '%'; });
93313
93314
93315                 function addDropdown(d) {
93316                     if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
93317
93318                     var nearValues = (d.id === 'street') ? getNearStreets
93319                         : (d.id === 'city') ? getNearCities
93320                         : getNearValues;
93321
93322                     d3_select(this)
93323                         .call(uiCombobox(context, 'address-' + d.id)
93324                             .minItems(1)
93325                             .caseSensitive(true)
93326                             .fetcher(function(value, callback) {
93327                                 callback(nearValues('addr:' + d.id));
93328                             })
93329                         );
93330                 }
93331
93332                 wrap.selectAll('input')
93333                     .on('blur', change())
93334                     .on('change', change());
93335
93336                 wrap.selectAll('input:not(.combobox-input)')
93337                     .on('input', change(true));
93338
93339                 dispatch$1.call('init');
93340                 _isInitialized = true;
93341             }
93342
93343
93344             function address(selection) {
93345                 _isInitialized = false;
93346
93347                 wrap = selection.selectAll('.form-field-input-wrap')
93348                     .data([0]);
93349
93350                 wrap = wrap.enter()
93351                     .append('div')
93352                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93353                     .merge(wrap);
93354
93355                 if (nominatim && _entity) {
93356                     var center = _entity.extent(context.graph()).center();
93357                     nominatim.countryCode(center, countryCallback);
93358                 }
93359             }
93360
93361
93362             function change(onInput) {
93363                 return function() {
93364                     var tags = {};
93365
93366                     wrap.selectAll('input')
93367                         .each(function (field) {
93368                             tags['addr:' + field.id] = this.value || undefined;
93369                         });
93370
93371                     dispatch$1.call('change', this, tags, onInput);
93372                 };
93373             }
93374
93375
93376             function updateTags(tags) {
93377                 utilGetSetValue(wrap.selectAll('input'), function (field) {
93378                     return tags['addr:' + field.id] || '';
93379                 });
93380             }
93381
93382
93383             address.entity = function(val) {
93384                 if (!arguments.length) return _entity;
93385                 _entity = val;
93386                 return address;
93387             };
93388
93389
93390             address.tags = function(tags) {
93391                 if (_isInitialized) {
93392                     updateTags(tags);
93393                 } else {
93394                     dispatch$1.on('init', function () {
93395                         dispatch$1.on('init', null);
93396                         updateTags(tags);
93397                     });
93398                 }
93399             };
93400
93401
93402             address.focus = function() {
93403                 var node = wrap.selectAll('input').node();
93404                 if (node) node.focus();
93405             };
93406
93407
93408             return utilRebind(address, dispatch$1, 'on');
93409         }
93410
93411         function uiFieldCycleway(field, context) {
93412             var dispatch$1 = dispatch('change');
93413             var items = d3_select(null);
93414             var wrap = d3_select(null);
93415
93416             function cycleway(selection) {
93417
93418                 function stripcolon(s) {
93419                     return s.replace(':', '');
93420                 }
93421
93422
93423                 wrap = selection.selectAll('.form-field-input-wrap')
93424                     .data([0]);
93425
93426                 wrap = wrap.enter()
93427                     .append('div')
93428                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93429                     .merge(wrap);
93430
93431
93432                 var div = wrap.selectAll('ul')
93433                     .data([0]);
93434
93435                 div = div.enter()
93436                     .append('ul')
93437                     .attr('class', 'rows')
93438                     .merge(div);
93439
93440                 var keys = ['cycleway:left', 'cycleway:right'];
93441
93442                 items = div.selectAll('li')
93443                     .data(keys);
93444
93445                 var enter = items.enter()
93446                     .append('li')
93447                     .attr('class', function(d) { return 'labeled-input preset-cycleway-' + stripcolon(d); });
93448
93449                 enter
93450                     .append('span')
93451                     .attr('class', 'label preset-label-cycleway')
93452                     .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
93453                     .text(function(d) { return field.t('types.' + d); });
93454
93455                 enter
93456                     .append('div')
93457                     .attr('class', 'preset-input-cycleway-wrap')
93458                     .append('input')
93459                     .attr('type', 'text')
93460                     .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
93461                     .call(utilNoAuto)
93462                     .each(function(d) {
93463                         d3_select(this)
93464                             .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
93465                                 .data(cycleway.options(d))
93466                             );
93467                     });
93468
93469
93470                 // Update
93471                 wrap.selectAll('.preset-input-cycleway')
93472                     .on('change', change)
93473                     .on('blur', change);
93474             }
93475
93476
93477             function change() {
93478                 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft'));
93479                 var right = utilGetSetValue(d3_select('.preset-input-cyclewayright'));
93480                 var tag = {};
93481
93482                 if (left === 'none' || left === '') { left = undefined; }
93483                 if (right === 'none' || right === '') { right = undefined; }
93484
93485                 // Always set both left and right as changing one can affect the other
93486                 tag = {
93487                     cycleway: undefined,
93488                     'cycleway:left': left,
93489                     'cycleway:right': right
93490                 };
93491
93492                 // If the left and right tags match, use the cycleway tag to tag both
93493                 // sides the same way
93494                 if (left === right) {
93495                     tag = {
93496                         cycleway: left,
93497                         'cycleway:left': undefined,
93498                         'cycleway:right': undefined
93499                     };
93500                 }
93501
93502                 dispatch$1.call('change', this, tag);
93503             }
93504
93505
93506             cycleway.options = function() {
93507                 return Object.keys(field.strings.options).map(function(option) {
93508                     return {
93509                         title: field.t('options.' + option + '.description'),
93510                         value: option
93511                     };
93512                 });
93513             };
93514
93515
93516             cycleway.tags = function(tags) {
93517                 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
93518                         // If cycleway is set, always return that
93519                         if (tags.cycleway) {
93520                             return tags.cycleway;
93521                         }
93522                         return tags[d] || '';
93523                     })
93524                     .attr('placeholder', field.placeholder());
93525             };
93526
93527
93528             cycleway.focus = function() {
93529                 var node = wrap.selectAll('input').node();
93530                 if (node) node.focus();
93531             };
93532
93533
93534             return utilRebind(cycleway, dispatch$1, 'on');
93535         }
93536
93537         function uiFieldLanes(field, context) {
93538             var dispatch$1 = dispatch('change');
93539             var LANE_WIDTH = 40;
93540             var LANE_HEIGHT = 200;
93541             var _entityID;
93542
93543             function lanes(selection) {
93544                 var lanesData = context.entity(_entityID).lanes();
93545
93546                 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
93547                     selection.call(lanes.off);
93548                     return;
93549                 }
93550
93551                 var wrap = selection.selectAll('.form-field-input-wrap')
93552                     .data([0]);
93553
93554                 wrap = wrap.enter()
93555                     .append('div')
93556                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93557                     .merge(wrap);
93558
93559                 var surface =  wrap.selectAll('.surface')
93560                     .data([0]);
93561
93562                 var d = utilGetDimensions(wrap);
93563                 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
93564
93565                 surface = surface.enter()
93566                     .append('svg')
93567                     .attr('width', d[0])
93568                     .attr('height', 300)
93569                     .attr('class', 'surface')
93570                     .merge(surface);
93571
93572
93573                 var lanesSelection = surface.selectAll('.lanes')
93574                     .data([0]);
93575
93576                 lanesSelection = lanesSelection.enter()
93577                     .append('g')
93578                     .attr('class', 'lanes')
93579                     .merge(lanesSelection);
93580
93581                 lanesSelection
93582                     .attr('transform', function () {
93583                         return 'translate(' + (freeSpace / 2) + ', 0)';
93584                     });
93585
93586
93587                 var lane = lanesSelection.selectAll('.lane')
93588                    .data(lanesData.lanes);
93589
93590                 lane.exit()
93591                     .remove();
93592
93593                 var enter = lane.enter()
93594                     .append('g')
93595                     .attr('class', 'lane');
93596
93597                 enter
93598                     .append('g')
93599                     .append('rect')
93600                     .attr('y', 50)
93601                     .attr('width', LANE_WIDTH)
93602                     .attr('height', LANE_HEIGHT);
93603
93604                 enter
93605                     .append('g')
93606                     .attr('class', 'forward')
93607                     .append('text')
93608                     .attr('y', 40)
93609                     .attr('x', 14)
93610                     .text('▲');
93611
93612                 enter
93613                     .append('g')
93614                     .attr('class', 'bothways')
93615                     .append('text')
93616                     .attr('y', 40)
93617                     .attr('x', 14)
93618                     .text('▲▼');
93619
93620                 enter
93621                     .append('g')
93622                     .attr('class', 'backward')
93623                     .append('text')
93624                     .attr('y', 40)
93625                     .attr('x', 14)
93626                     .text('▼');
93627
93628
93629                 lane = lane
93630                     .merge(enter);
93631
93632                 lane
93633                     .attr('transform', function(d) {
93634                         return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
93635                     });
93636
93637                 lane.select('.forward')
93638                     .style('visibility', function(d) {
93639                         return d.direction === 'forward' ? 'visible' : 'hidden';
93640                     });
93641
93642                 lane.select('.bothways')
93643                     .style('visibility', function(d) {
93644                         return d.direction === 'bothways' ? 'visible' : 'hidden';
93645                     });
93646
93647                 lane.select('.backward')
93648                     .style('visibility', function(d) {
93649                         return d.direction === 'backward' ? 'visible' : 'hidden';
93650                     });
93651             }
93652
93653
93654             lanes.entity = function(val) {
93655                 if (!_entityID || _entityID !== val.id) {
93656                     _entityID = val.id;
93657                 }
93658             };
93659
93660             lanes.tags = function() {};
93661             lanes.focus = function() {};
93662             lanes.off = function() {};
93663
93664             return utilRebind(lanes, dispatch$1, 'on');
93665         }
93666
93667         function uiFieldLocalized(field, context) {
93668             var dispatch$1 = dispatch('change', 'input');
93669             var wikipedia = services$1.wikipedia;
93670             var input = d3_select(null);
93671             var localizedInputs = d3_select(null);
93672
93673             var allSuggestions = context.presets().collection.filter(function(p) {
93674                 return p.suggestion === true;
93675             });
93676
93677             // reuse these combos
93678             var langCombo = uiCombobox(context, 'localized-lang')
93679                 .fetcher(fetchLanguages)
93680                 .minItems(0);
93681
93682             var brandCombo = uiCombobox(context, 'localized-brand')
93683                 .canAutocomplete(false)
93684                 .minItems(1);
93685
93686             var _selection = d3_select(null);
93687             var _multilingual = [];
93688             var _buttonTip = tooltip()
93689                 .title(t('translate.translate'))
93690                 .placement('left');
93691             var _wikiTitles;
93692             var _entity;
93693
93694
93695             function calcLocked() {
93696                 if (!_entity) {    // the original entity
93697                     field.locked(false);
93698                     return;
93699                 }
93700
93701                 var latest = context.hasEntity(_entity.id);
93702                 if (!latest) {    // get current entity, possibly edited
93703                     field.locked(false);
93704                     return;
93705                 }
93706
93707                 var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
93708                 var hasWikidata = latest.tags.wikidata;
93709                 var preset = context.presets().match(latest, context.graph());
93710                 var isSuggestion = preset && preset.suggestion;
93711                 var showsBrand = preset && preset.fields
93712                     .filter(function(d) { return d.id === 'brand'; }).length;
93713
93714                 var isLocked = !!(field.id === 'name' && hasOriginalName &&
93715                     (hasWikidata || (isSuggestion && !showsBrand)));
93716
93717                 field.locked(isLocked);
93718             }
93719
93720
93721             function calcMultilingual(tags) {
93722                 _multilingual = [];
93723                 for (var k in tags) {
93724                     var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
93725                     if (m && m[1] === field.key && m[2]) {
93726                         _multilingual.push({ lang: m[2], value: tags[k] });
93727                     }
93728                 }
93729                 _multilingual.reverse();
93730             }
93731
93732
93733             function localized(selection) {
93734                 _selection = selection;
93735                 calcLocked();
93736                 var isLocked = field.locked();
93737                 var entity = _entity && context.hasEntity(_entity.id);  // get latest
93738                 var preset = entity && context.presets().match(entity, context.graph());
93739
93740                 var wrap = selection.selectAll('.form-field-input-wrap')
93741                     .data([0]);
93742
93743                 // enter/update
93744                 wrap = wrap.enter()
93745                     .append('div')
93746                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93747                     .merge(wrap);
93748
93749                 input = wrap.selectAll('.localized-main')
93750                     .data([0]);
93751
93752                 // enter/update
93753                 input = input.enter()
93754                     .append('input')
93755                     .attr('type', 'text')
93756                     .attr('id', 'preset-input-' + field.safeid)
93757                     .attr('class', 'localized-main')
93758                     .attr('placeholder', field.placeholder())
93759                     .call(utilNoAuto)
93760                     .merge(input);
93761
93762                 if (preset && field.id === 'name') {
93763                     var pTag = preset.id.split('/', 2);
93764                     var pKey = pTag[0];
93765                     var pValue = pTag[1];
93766
93767                     if (!preset.suggestion) {
93768                         // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
93769                         // This code attempts to determine if the matched preset is the
93770                         // kind of preset that even can benefit from name suggestions..
93771                         // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
93772                         // - false = churches, parks, hospitals, etc. (things not in the index)
93773                         var isFallback = preset.isFallback();
93774                         var goodSuggestions = allSuggestions.filter(function(s) {
93775                             if (isFallback) return true;
93776                             var sTag = s.id.split('/', 2);
93777                             var sKey = sTag[0];
93778                             var sValue = sTag[1];
93779                             return pKey === sKey && (!pValue || pValue === sValue);
93780                         });
93781
93782                         // Show the suggestions.. If the user picks one, change the tags..
93783                         if (allSuggestions.length && goodSuggestions.length) {
93784                             input
93785                                 .on('blur.localized', checkBrandOnBlur)
93786                                 .call(brandCombo
93787                                     .fetcher(fetchBrandNames(preset, allSuggestions))
93788                                     .on('accept', acceptBrand)
93789                                     .on('cancel', cancelBrand)
93790                                 );
93791                         }
93792                     }
93793                 }
93794
93795                 input
93796                     .classed('disabled', !!isLocked)
93797                     .attr('readonly', isLocked || null)
93798                     .on('input', change(true))
93799                     .on('blur', change())
93800                     .on('change', change());
93801
93802
93803                 var translateButton = wrap.selectAll('.localized-add')
93804                     .data([0]);
93805
93806                 translateButton = translateButton.enter()
93807                     .append('button')
93808                     .attr('class', 'localized-add form-field-button')
93809                     .attr('tabindex', -1)
93810                     .call(svgIcon('#iD-icon-plus'))
93811                     .merge(translateButton);
93812
93813                 translateButton
93814                     .classed('disabled', !!isLocked)
93815                     .call(isLocked ? _buttonTip.destroy : _buttonTip)
93816                     .on('click', addNew);
93817
93818
93819                 if (entity && !_multilingual.length) {
93820                     calcMultilingual(entity.tags);
93821                 }
93822
93823                 localizedInputs = selection.selectAll('.localized-multilingual')
93824                     .data([0]);
93825
93826                 localizedInputs = localizedInputs.enter()
93827                     .append('div')
93828                     .attr('class', 'localized-multilingual')
93829                     .merge(localizedInputs);
93830
93831                 localizedInputs
93832                     .call(renderMultilingual);
93833
93834                 localizedInputs.selectAll('button, input')
93835                     .classed('disabled', !!isLocked)
93836                     .attr('readonly', isLocked || null);
93837
93838
93839
93840                 // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
93841                 // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
93842                 // So compare the current field value against the suggestions one last time.
93843                 function checkBrandOnBlur() {
93844                     var latest = context.hasEntity(_entity.id);
93845                     if (!latest) return;   // deleting the entity blurred the field?
93846
93847                     var preset = context.presets().match(latest, context.graph());
93848                     if (preset && preset.suggestion) return;   // already accepted
93849
93850                     // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
93851                     var name = utilGetSetValue(input).trim();
93852                     var matched = allSuggestions.filter(function(s) { return name === s.name(); });
93853
93854                     if (matched.length === 1) {
93855                         acceptBrand({ suggestion: matched[0] });
93856                     } else {
93857                         cancelBrand();
93858                     }
93859                 }
93860
93861
93862                 function acceptBrand(d) {
93863                     if (!d) {
93864                         cancelBrand();
93865                         return;
93866                     }
93867
93868                     var entity = context.entity(_entity.id);  // get latest
93869                     var tags = entity.tags;
93870                     var geometry = entity.geometry(context.graph());
93871                     var removed = preset.unsetTags(tags, geometry);
93872                     for (var k in tags) {
93873                         tags[k] = removed[k];  // set removed tags to `undefined`
93874                     }
93875                     tags = d.suggestion.setTags(tags, geometry);
93876                     utilGetSetValue(input, tags.name);
93877                     dispatch$1.call('change', this, tags);
93878                 }
93879
93880
93881                 // user hit escape, clean whatever preset name appears after the last ' – '
93882                 function cancelBrand() {
93883                     var name = utilGetSetValue(input);
93884                     var clean = cleanName(name);
93885                     if (clean !== name) {
93886                         utilGetSetValue(input, clean);
93887                         dispatch$1.call('change', this, { name: clean });
93888                     }
93889                 }
93890
93891                 // Remove whatever is after the last ' – '
93892                 // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
93893                 function cleanName(name) {
93894                     var parts = name.split(' – ');
93895                     if (parts.length > 1) {
93896                         parts.pop();
93897                         name = parts.join(' – ');
93898                     }
93899                     return name;
93900                 }
93901
93902
93903                 function fetchBrandNames(preset, suggestions) {
93904                     var pTag = preset.id.split('/', 2);
93905                     var pKey = pTag[0];
93906                     var pValue = pTag[1];
93907
93908                     return function(value, callback) {
93909                         var results = [];
93910                         if (value && value.length > 2) {
93911                             for (var i = 0; i < suggestions.length; i++) {
93912                                 var s = suggestions[i];
93913                                 var sTag = s.id.split('/', 2);
93914                                 var sKey = sTag[0];
93915                                 var sValue = sTag[1];
93916                                 var name = s.name();
93917                                 var dist = utilEditDistance(value, name.substring(0, value.length));
93918                                 var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
93919
93920                                 if (dist < 1 || (matchesPreset && dist < 3)) {
93921                                     var obj = {
93922                                         title: name,
93923                                         value: name,
93924                                         suggestion: s,
93925                                         dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
93926                                     };
93927                                     results.push(obj);
93928                                 }
93929                             }
93930                             results.sort(function(a, b) { return a.dist - b.dist; });
93931                         }
93932                         results = results.slice(0, 10);
93933                         callback(results);
93934                     };
93935                 }
93936
93937
93938                 function addNew() {
93939                     event.preventDefault();
93940                     if (field.locked()) return;
93941
93942                     var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
93943                     var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
93944                     var isLangEn = defaultLang.indexOf('en') > -1;
93945                     if (isLangEn || langExists) {
93946                         defaultLang = '';
93947                     }
93948                     _multilingual.push({ lang: defaultLang, value: '' });
93949
93950                     localizedInputs
93951                         .call(renderMultilingual);
93952                 }
93953
93954
93955                 function change(onInput) {
93956                     return function() {
93957                         if (field.locked()) {
93958                             event.preventDefault();
93959                             return;
93960                         }
93961                         var t = {};
93962                         t[field.key] = utilGetSetValue(d3_select(this)) || undefined;
93963                         dispatch$1.call('change', this, t, onInput);
93964                     };
93965                 }
93966             }
93967
93968
93969             function key(lang) {
93970                 return field.key + ':' + lang;
93971             }
93972
93973
93974             function changeLang(d) {
93975                 var lang = utilGetSetValue(d3_select(this));
93976                 var t = {};
93977                 var language = wikipedia$2.find(function(d) {
93978                     return d[0].toLowerCase() === lang.toLowerCase() ||
93979                         d[1].toLowerCase() === lang.toLowerCase();
93980                 });
93981
93982                 if (language) lang = language[2];
93983
93984                 if (d.lang && d.lang !== lang) {
93985                     t[key(d.lang)] = undefined;
93986                 }
93987
93988                 var value = utilGetSetValue(d3_select(this.parentNode)
93989                     .selectAll('.localized-value'));
93990
93991                 if (lang && value) {
93992                     t[key(lang)] = value;
93993                 } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
93994                     t[key(lang)] = _wikiTitles[d.lang];
93995                 }
93996
93997                 d.lang = lang;
93998                 dispatch$1.call('change', this, t);
93999             }
94000
94001
94002             function changeValue(d) {
94003                 if (!d.lang) return;
94004                 var t = {};
94005                 t[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
94006                 dispatch$1.call('change', this, t);
94007             }
94008
94009
94010             function fetchLanguages(value, cb) {
94011                 var v = value.toLowerCase();
94012
94013                 cb(wikipedia$2.filter(function(d) {
94014                     return d[0].toLowerCase().indexOf(v) >= 0 ||
94015                     d[1].toLowerCase().indexOf(v) >= 0 ||
94016                     d[2].toLowerCase().indexOf(v) >= 0;
94017                 }).map(function(d) {
94018                     return { value: d[1] };
94019                 }));
94020             }
94021
94022
94023             function renderMultilingual(selection) {
94024                 var wraps = selection.selectAll('div.entry')
94025                     .data(_multilingual, function(d) { return d.lang; });
94026
94027                 wraps.exit()
94028                     .transition()
94029                     .duration(200)
94030                     .style('max-height', '0px')
94031                     .style('opacity', '0')
94032                     .style('top', '-10px')
94033                     .remove();
94034
94035                 var innerWrap = wraps.enter()
94036                     .insert('div', ':first-child');
94037
94038                 innerWrap
94039                     .attr('class', 'entry')
94040                     .each(function() {
94041                         var wrap = d3_select(this);
94042
94043                         var label = wrap
94044                             .append('label')
94045                             .attr('class', 'field-label');
94046
94047                         var text = label
94048                             .append('span')
94049                             .attr('class', 'label-text');
94050
94051                         text
94052                             .append('span')
94053                             .attr('class', 'label-textvalue')
94054                             .text(t('translate.localized_translation_label'));
94055
94056                         text
94057                             .append('span')
94058                             .attr('class', 'label-textannotation');
94059
94060                         label
94061                             .append('button')
94062                             .attr('class', 'remove-icon-multilingual')
94063                             .on('click', function(d){
94064                                 if (field.locked()) return;
94065                                 event.preventDefault();
94066                                 var t = {};
94067                                 t[key(d.lang)] = undefined;
94068                                 dispatch$1.call('change', this, t);
94069                                 d3_select(this.parentNode.parentNode.parentNode)
94070                                     .style('top', '0')
94071                                     .style('max-height', '240px')
94072                                     .transition()
94073                                     .style('opacity', '0')
94074                                     .style('max-height', '0px')
94075                                     .remove();
94076                             })
94077                             .call(svgIcon('#iD-operation-delete'));
94078
94079                         wrap
94080                             .append('input')
94081                             .attr('class', 'localized-lang')
94082                             .attr('type', 'text')
94083                             .attr('placeholder', t('translate.localized_translation_language'))
94084                             .on('blur', changeLang)
94085                             .on('change', changeLang)
94086                             .call(langCombo);
94087
94088                         wrap
94089                             .append('input')
94090                             .attr('type', 'text')
94091                             .attr('placeholder', t('translate.localized_translation_name'))
94092                             .attr('class', 'localized-value')
94093                             .on('blur', changeValue)
94094                             .on('change', changeValue);
94095                     });
94096
94097                 innerWrap
94098                     .style('margin-top', '0px')
94099                     .style('max-height', '0px')
94100                     .style('opacity', '0')
94101                     .transition()
94102                     .duration(200)
94103                     .style('margin-top', '10px')
94104                     .style('max-height', '240px')
94105                     .style('opacity', '1')
94106                     .on('end', function() {
94107                         d3_select(this)
94108                             .style('max-height', '')
94109                             .style('overflow', 'visible');
94110                     });
94111
94112
94113                 var entry = selection.selectAll('.entry');
94114
94115                 utilGetSetValue(entry.select('.localized-lang'), function(d) {
94116                     var lang = wikipedia$2.find(function(lang) { return lang[2] === d.lang; });
94117                     return lang ? lang[1] : d.lang;
94118                 });
94119
94120                 utilGetSetValue(entry.select('.localized-value'),
94121                     function(d) { return d.value; });
94122             }
94123
94124
94125             localized.tags = function(tags) {
94126                 // Fetch translations from wikipedia
94127                 if (tags.wikipedia && !_wikiTitles) {
94128                     _wikiTitles = {};
94129                     var wm = tags.wikipedia.match(/([^:]+):(.+)/);
94130                     if (wm && wm[0] && wm[1]) {
94131                         wikipedia.translations(wm[1], wm[2], function(err, d) {
94132                             if (err || !d) return;
94133                             _wikiTitles = d;
94134                         });
94135                     }
94136                 }
94137
94138                 utilGetSetValue(input, tags[field.key] || '');
94139
94140                 calcMultilingual(tags);
94141
94142                 _selection
94143                     .call(localized);
94144             };
94145
94146
94147             localized.focus = function() {
94148                 input.node().focus();
94149             };
94150
94151
94152             localized.entity = function(val) {
94153                 if (!arguments.length) return _entity;
94154                 _entity = val;
94155                 _multilingual = [];
94156                 return localized;
94157             };
94158
94159             return utilRebind(localized, dispatch$1, 'on');
94160         }
94161
94162         function uiFieldMaxspeed(field, context) {
94163             var dispatch$1 = dispatch('change');
94164             var unitInput = d3_select(null);
94165             var input = d3_select(null);
94166             var _entity;
94167             var _isImperial;
94168
94169             var speedCombo = uiCombobox(context, 'maxspeed');
94170             var unitCombo = uiCombobox(context, 'maxspeed-unit')
94171                     .data(['km/h', 'mph'].map(comboValues));
94172
94173             var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
94174             var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
94175
94176
94177             function maxspeed(selection) {
94178
94179                 var wrap = selection.selectAll('.form-field-input-wrap')
94180                     .data([0]);
94181
94182                 wrap = wrap.enter()
94183                     .append('div')
94184                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94185                     .merge(wrap);
94186
94187
94188                 input = wrap.selectAll('#preset-input-' + field.safeid)
94189                     .data([0]);
94190
94191                 input = input.enter()
94192                     .append('input')
94193                     .attr('type', 'text')
94194                     .attr('id', 'preset-input-' + field.safeid)
94195                     .attr('placeholder', field.placeholder())
94196                     .call(utilNoAuto)
94197                     .call(speedCombo)
94198                     .merge(input);
94199
94200                 input
94201                     .on('change', change)
94202                     .on('blur', change);
94203
94204                 var loc;
94205                 if (_entity.type === 'node') {
94206                     loc = _entity.loc;
94207                 } else {
94208                     var childNodes = context.graph().childNodes(context.entity(_entity.id));
94209                     loc = childNodes[~~(childNodes.length/2)].loc;
94210                 }
94211
94212                 _isImperial = dataImperial.features.some(function(f) {
94213                     return f.geometry.coordinates.some(function(d) {
94214                         return geoPointInPolygon(loc, d);
94215                     });
94216                 });
94217
94218                 unitInput = wrap.selectAll('input.maxspeed-unit')
94219                     .data([0]);
94220
94221                 unitInput = unitInput.enter()
94222                     .append('input')
94223                     .attr('type', 'text')
94224                     .attr('class', 'maxspeed-unit')
94225                     .call(unitCombo)
94226                     .merge(unitInput);
94227
94228                 unitInput
94229                     .on('blur', changeUnits)
94230                     .on('change', changeUnits);
94231
94232
94233                 function changeUnits() {
94234                     _isImperial = utilGetSetValue(unitInput) === 'mph';
94235                     utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94236                     setSuggestions();
94237                     change();
94238                 }
94239             }
94240
94241
94242             function setSuggestions() {
94243                 speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
94244                 utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94245             }
94246
94247
94248             function comboValues(d) {
94249                 return {
94250                     value: d.toString(),
94251                     title: d.toString()
94252                 };
94253             }
94254
94255
94256             function change() {
94257                 var tag = {};
94258                 var value = utilGetSetValue(input);
94259
94260                 if (!value) {
94261                     tag[field.key] = undefined;
94262                 } else if (isNaN(value) || !_isImperial) {
94263                     tag[field.key] = value;
94264                 } else {
94265                     tag[field.key] = value + ' mph';
94266                 }
94267
94268                 dispatch$1.call('change', this, tag);
94269             }
94270
94271
94272             maxspeed.tags = function(tags) {
94273                 var value = tags[field.key];
94274
94275                 if (value && value.indexOf('mph') >= 0) {
94276                     value = parseInt(value, 10);
94277                     _isImperial = true;
94278                 } else if (value) {
94279                     _isImperial = false;
94280                 }
94281
94282                 setSuggestions();
94283                 utilGetSetValue(input, value || '');
94284             };
94285
94286
94287             maxspeed.focus = function() {
94288                 input.node().focus();
94289             };
94290
94291
94292             maxspeed.entity = function(val) {
94293                 _entity = val;
94294             };
94295
94296
94297             return utilRebind(maxspeed, dispatch$1, 'on');
94298         }
94299
94300         function uiFieldRadio(field, context) {
94301             var dispatch$1 = dispatch('change');
94302             var placeholder = d3_select(null);
94303             var wrap = d3_select(null);
94304             var labels = d3_select(null);
94305             var radios = d3_select(null);
94306             var radioData = (field.options || field.keys).slice();  // shallow copy
94307             var typeField;
94308             var layerField;
94309             var _oldType = {};
94310             var _entity;
94311
94312
94313             function selectedKey() {
94314                 var node = wrap.selectAll('.form-field-input-radio label.active input');
94315                 return !node.empty() && node.datum();
94316             }
94317
94318
94319             function radio(selection) {
94320                 selection.classed('preset-radio', true);
94321
94322                 wrap = selection.selectAll('.form-field-input-wrap')
94323                     .data([0]);
94324
94325                 var enter = wrap.enter()
94326                     .append('div')
94327                     .attr('class', 'form-field-input-wrap form-field-input-radio');
94328
94329                 enter
94330                     .append('span')
94331                     .attr('class', 'placeholder');
94332
94333                 wrap = wrap
94334                     .merge(enter);
94335
94336
94337                 placeholder = wrap.selectAll('.placeholder');
94338
94339                 labels = wrap.selectAll('label')
94340                     .data(radioData);
94341
94342                 enter = labels.enter()
94343                     .append('label');
94344
94345                 enter
94346                     .append('input')
94347                     .attr('type', 'radio')
94348                     .attr('name', field.id)
94349                     .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
94350                     .attr('checked', false);
94351
94352                 enter
94353                     .append('span')
94354                     .text(function(d) { return field.t('options.' + d, { 'default': d }); });
94355
94356                 labels = labels
94357                     .merge(enter);
94358
94359                 radios = labels.selectAll('input')
94360                     .on('change', changeRadio);
94361
94362             }
94363
94364
94365             function structureExtras(selection, tags) {
94366                 var selected = selectedKey();
94367                 var type = context.presets().field(selected);
94368                 var layer = context.presets().field('layer');
94369                 var showLayer = (selected === 'bridge' || selected === 'tunnel');
94370
94371
94372                 var extrasWrap = selection.selectAll('.structure-extras-wrap')
94373                     .data(selected ? [0] : []);
94374
94375                 extrasWrap.exit()
94376                     .remove();
94377
94378                 extrasWrap = extrasWrap.enter()
94379                     .append('div')
94380                     .attr('class', 'structure-extras-wrap')
94381                     .merge(extrasWrap);
94382
94383                 var list = extrasWrap.selectAll('ul')
94384                     .data([0]);
94385
94386                 list = list.enter()
94387                     .append('ul')
94388                     .attr('class', 'rows')
94389                     .merge(list);
94390
94391
94392                 // Type
94393                 if (type) {
94394                     if (!typeField || typeField.id !== selected) {
94395                         typeField = uiField(context, type, _entity, { wrap: false })
94396                             .on('change', changeType);
94397                     }
94398                     typeField.tags(tags);
94399                 } else {
94400                     typeField = null;
94401                 }
94402
94403                 var typeItem = list.selectAll('.structure-type-item')
94404                     .data(typeField ? [typeField] : [], function(d) { return d.id; });
94405
94406                 // Exit
94407                 typeItem.exit()
94408                     .remove();
94409
94410                 // Enter
94411                 var typeEnter = typeItem.enter()
94412                     .insert('li', ':first-child')
94413                     .attr('class', 'labeled-input structure-type-item');
94414
94415                 typeEnter
94416                     .append('span')
94417                     .attr('class', 'label structure-label-type')
94418                     .attr('for', 'preset-input-' + selected)
94419                     .text(t('inspector.radio.structure.type'));
94420
94421                 typeEnter
94422                     .append('div')
94423                     .attr('class', 'structure-input-type-wrap');
94424
94425                 // Update
94426                 typeItem = typeItem
94427                     .merge(typeEnter);
94428
94429                 if (typeField) {
94430                     typeItem.selectAll('.structure-input-type-wrap')
94431                         .call(typeField.render);
94432                 }
94433
94434
94435                 // Layer
94436                 if (layer && showLayer) {
94437                     if (!layerField) {
94438                         layerField = uiField(context, layer, _entity, { wrap: false })
94439                             .on('change', changeLayer);
94440                     }
94441                     layerField.tags(tags);
94442                     field.keys = utilArrayUnion(field.keys, ['layer']);
94443                 } else {
94444                     layerField = null;
94445                     field.keys = field.keys.filter(function(k) { return k !== 'layer'; });
94446                 }
94447
94448                 var layerItem = list.selectAll('.structure-layer-item')
94449                     .data(layerField ? [layerField] : []);
94450
94451                 // Exit
94452                 layerItem.exit()
94453                     .remove();
94454
94455                 // Enter
94456                 var layerEnter = layerItem.enter()
94457                     .append('li')
94458                     .attr('class', 'labeled-input structure-layer-item');
94459
94460                 layerEnter
94461                     .append('span')
94462                     .attr('class', 'label structure-label-layer')
94463                     .attr('for', 'preset-input-layer')
94464                     .text(t('inspector.radio.structure.layer'));
94465
94466                 layerEnter
94467                     .append('div')
94468                     .attr('class', 'structure-input-layer-wrap');
94469
94470                 // Update
94471                 layerItem = layerItem
94472                     .merge(layerEnter);
94473
94474                 if (layerField) {
94475                     layerItem.selectAll('.structure-input-layer-wrap')
94476                         .call(layerField.render);
94477                 }
94478             }
94479
94480
94481             function changeType(t, onInput) {
94482                 var key = selectedKey();
94483                 if (!key) return;
94484
94485                 var val = t[key];
94486                 if (val !== 'no') {
94487                     _oldType[key] = val;
94488                 }
94489
94490                 if (field.type === 'structureRadio') {
94491                     // remove layer if it should not be set
94492                     if (val === 'no' ||
94493                         (key !== 'bridge' && key !== 'tunnel') ||
94494                         (key === 'tunnel' && val === 'building_passage')) {
94495                         t.layer = undefined;
94496                     }
94497                     // add layer if it should be set
94498                     if (t.layer === undefined) {
94499                         if (key === 'bridge' && val !== 'no') {
94500                             t.layer = '1';
94501                         }
94502                         if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
94503                             t.layer = '-1';
94504                         }
94505                     }
94506                  }
94507
94508                 dispatch$1.call('change', this, t, onInput);
94509             }
94510
94511
94512             function changeLayer(t, onInput) {
94513                 if (t.layer === '0') {
94514                     t.layer = undefined;
94515                 }
94516                 dispatch$1.call('change', this, t, onInput);
94517             }
94518
94519
94520             function changeRadio() {
94521                 var t = {};
94522                 var activeKey;
94523
94524                 if (field.key) {
94525                     t[field.key] = undefined;
94526                 }
94527
94528                 radios.each(function(d) {
94529                     var active = d3_select(this).property('checked');
94530                     if (active) activeKey = d;
94531
94532                     if (field.key) {
94533                         if (active) t[field.key] = d;
94534                     } else {
94535                         var val = _oldType[activeKey] || 'yes';
94536                         t[d] = active ? val : undefined;
94537                     }
94538                 });
94539
94540                 if (field.type === 'structureRadio') {
94541                     if (activeKey === 'bridge') {
94542                         t.layer = '1';
94543                     } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
94544                         t.layer = '-1';
94545                     } else {
94546                         t.layer = undefined;
94547                     }
94548                 }
94549
94550                 dispatch$1.call('change', this, t);
94551             }
94552
94553
94554             radio.tags = function(tags) {
94555                 function checked(d) {
94556                     if (field.key) {
94557                         return tags[field.key] === d;
94558                     } else {
94559                         return !!(tags[d] && tags[d].toLowerCase() !== 'no');
94560                     }
94561                 }
94562
94563                 labels.classed('active', checked);
94564                 radios.property('checked', checked);
94565
94566                 var selection = radios.filter(function() { return this.checked; });
94567
94568                 if (selection.empty()) {
94569                     placeholder.text(t('inspector.none'));
94570                 } else {
94571                     placeholder.text(selection.attr('value'));
94572                     _oldType[selection.datum()] = tags[selection.datum()];
94573                 }
94574
94575                 if (field.type === 'structureRadio') {
94576                     // For waterways without a tunnel tag, set 'culvert' as
94577                     // the _oldType to default to if the user picks 'tunnel'
94578                     if (!!tags.waterway && !_oldType.tunnel) {
94579                         _oldType.tunnel = 'culvert';
94580                     }
94581
94582                     wrap.call(structureExtras, tags);
94583                 }
94584             };
94585
94586
94587             radio.focus = function() {
94588                 radios.node().focus();
94589             };
94590
94591
94592             radio.entity = function(val) {
94593                 if (!arguments.length) return _entity;
94594                 _entity = val;
94595                 _oldType = {};
94596                 return radio;
94597             };
94598
94599
94600             return utilRebind(radio, dispatch$1, 'on');
94601         }
94602
94603         function uiFieldRestrictions(field, context) {
94604             var dispatch$1 = dispatch('change');
94605             var breathe = behaviorBreathe();
94606             var storedViaWay = context.storage('turn-restriction-via-way');
94607             var storedDistance = context.storage('turn-restriction-distance');
94608
94609             var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
94610             var _maxDistance = storedDistance ? (+storedDistance) : 30;
94611             var _initialized = false;
94612             var _parent = d3_select(null);       // the entire field
94613             var _container = d3_select(null);    // just the map
94614             var _oldTurns;
94615             var _graph;
94616             var _vertexID;
94617             var _intersection;
94618             var _fromWayID;
94619
94620             var _lastXPos;
94621
94622
94623             function restrictions(selection) {
94624                 _parent = selection;
94625
94626                 // try to reuse the intersection, but always rebuild it if the graph has changed
94627                 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
94628                     _graph = context.graph();
94629                     _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
94630                 }
94631
94632                 // It's possible for there to be no actual intersection here.
94633                 // for example, a vertex of two `highway=path`
94634                 // In this case, hide the field.
94635                 var isOK = (
94636                     _intersection &&
94637                     _intersection.vertices.length &&           // has vertices
94638                     _intersection.vertices                     // has the vertex that the user selected
94639                         .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
94640                     _intersection.ways.length > 2 &&           // has more than 2 ways
94641                     _intersection.ways                         // has more than 1 TO way
94642                         .filter(function(way) { return way.__to; }).length > 1
94643                 );
94644
94645                 // Also hide in the case where
94646                 d3_select(selection.node().parentNode).classed('hide', !isOK);
94647
94648                 // if form field is hidden or has detached from dom, clean up.
94649                 if (!isOK ||
94650                     !d3_select('.inspector-wrap.inspector-hidden').empty() ||
94651                     !selection.node().parentNode ||
94652                     !selection.node().parentNode.parentNode) {
94653                     selection.call(restrictions.off);
94654                     return;
94655                 }
94656
94657
94658                 var wrap = selection.selectAll('.form-field-input-wrap')
94659                     .data([0]);
94660
94661                 wrap = wrap.enter()
94662                     .append('div')
94663                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94664                     .merge(wrap);
94665
94666                 var container = wrap.selectAll('.restriction-container')
94667                     .data([0]);
94668
94669                 // enter
94670                 var containerEnter = container.enter()
94671                     .append('div')
94672                     .attr('class', 'restriction-container');
94673
94674                 containerEnter
94675                     .append('div')
94676                     .attr('class', 'restriction-help');
94677
94678                 // update
94679                 _container = containerEnter
94680                     .merge(container)
94681                     .call(renderViewer);
94682
94683                 var controls = wrap.selectAll('.restriction-controls')
94684                     .data([0]);
94685
94686                 // enter/update
94687                 controls.enter()
94688                     .append('div')
94689                     .attr('class', 'restriction-controls-container')
94690                     .append('div')
94691                     .attr('class', 'restriction-controls')
94692                     .merge(controls)
94693                     .call(renderControls);
94694             }
94695
94696
94697             function renderControls(selection) {
94698                 var distControl = selection.selectAll('.restriction-distance')
94699                     .data([0]);
94700
94701                 distControl.exit()
94702                     .remove();
94703
94704                 var distControlEnter = distControl.enter()
94705                     .append('div')
94706                     .attr('class', 'restriction-control restriction-distance');
94707
94708                 distControlEnter
94709                     .append('span')
94710                     .attr('class', 'restriction-control-label restriction-distance-label')
94711                     .text(t('restriction.controls.distance') + ':');
94712
94713                 distControlEnter
94714                     .append('input')
94715                     .attr('class', 'restriction-distance-input')
94716                     .attr('type', 'range')
94717                     .attr('min', '20')
94718                     .attr('max', '50')
94719                     .attr('step', '5');
94720
94721                 distControlEnter
94722                     .append('span')
94723                     .attr('class', 'restriction-distance-text');
94724
94725                 // update
94726                 selection.selectAll('.restriction-distance-input')
94727                     .property('value', _maxDistance)
94728                     .on('input', function() {
94729                         var val = d3_select(this).property('value');
94730                         _maxDistance = +val;
94731                         _intersection = null;
94732                         _container.selectAll('.layer-osm .layer-turns *').remove();
94733                         context.storage('turn-restriction-distance', _maxDistance);
94734                         _parent.call(restrictions);
94735                     });
94736
94737                 selection.selectAll('.restriction-distance-text')
94738                     .text(displayMaxDistance(_maxDistance));
94739
94740
94741                 var viaControl = selection.selectAll('.restriction-via-way')
94742                     .data([0]);
94743
94744                 viaControl.exit()
94745                     .remove();
94746
94747                 var viaControlEnter = viaControl.enter()
94748                     .append('div')
94749                     .attr('class', 'restriction-control restriction-via-way');
94750
94751                 viaControlEnter
94752                     .append('span')
94753                     .attr('class', 'restriction-control-label restriction-via-way-label')
94754                     .text(t('restriction.controls.via') + ':');
94755
94756                 viaControlEnter
94757                     .append('input')
94758                     .attr('class', 'restriction-via-way-input')
94759                     .attr('type', 'range')
94760                     .attr('min', '0')
94761                     .attr('max', '2')
94762                     .attr('step', '1');
94763
94764                 viaControlEnter
94765                     .append('span')
94766                     .attr('class', 'restriction-via-way-text');
94767
94768                 // update
94769                 selection.selectAll('.restriction-via-way-input')
94770                     .property('value', _maxViaWay)
94771                     .on('input', function() {
94772                         var val = d3_select(this).property('value');
94773                         _maxViaWay = +val;
94774                         _container.selectAll('.layer-osm .layer-turns *').remove();
94775                         context.storage('turn-restriction-via-way', _maxViaWay);
94776                         _parent.call(restrictions);
94777                     });
94778
94779                 selection.selectAll('.restriction-via-way-text')
94780                     .text(displayMaxVia(_maxViaWay));
94781             }
94782
94783
94784             function renderViewer(selection) {
94785                 if (!_intersection) return;
94786
94787                 var vgraph = _intersection.graph;
94788                 var filter = utilFunctor(true);
94789                 var projection = geoRawMercator();
94790
94791                 // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
94792                 // Instead of asking the restriction-container for its dimensions,
94793                 //  we can ask the #sidebar, which can have its dimensions cached.
94794                 // width: calc as sidebar - padding
94795                 // height: hardcoded (from `80_app.css`)
94796                 // var d = utilGetDimensions(selection);
94797                 var sdims = utilGetDimensions(d3_select('#sidebar'));
94798                 var d = [ sdims[0] - 50, 370 ];
94799                 var c = geoVecScale(d, 0.5);
94800                 var z = 22;
94801
94802                 projection.scale(geoZoomToScale(z));
94803
94804                 // Calculate extent of all key vertices
94805                 var extent = geoExtent();
94806                 for (var i = 0; i < _intersection.vertices.length; i++) {
94807                     extent._extend(_intersection.vertices[i].extent());
94808                 }
94809
94810                 // If this is a large intersection, adjust zoom to fit extent
94811                 if (_intersection.vertices.length > 1) {
94812                     var padding = 180;   // in z22 pixels
94813                     var tl = projection([extent[0][0], extent[1][1]]);
94814                     var br = projection([extent[1][0], extent[0][1]]);
94815                     var hFactor = (br[0] - tl[0]) / (d[0] - padding);
94816                     var vFactor = (br[1] - tl[1]) / (d[1] - padding);
94817                     var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
94818                     var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
94819                     z = z - Math.max(hZoomDiff, vZoomDiff);
94820                     projection.scale(geoZoomToScale(z));
94821                 }
94822
94823                 var padTop = 35;   // reserve top space for hint text
94824                 var extentCenter = projection(extent.center());
94825                 extentCenter[1] = extentCenter[1] - padTop;
94826
94827                 projection
94828                     .translate(geoVecSubtract(c, extentCenter))
94829                     .clipExtent([[0, 0], d]);
94830
94831                 var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
94832                 var drawVertices = svgVertices(projection, context);
94833                 var drawLines = svgLines(projection, context);
94834                 var drawTurns = svgTurns(projection, context);
94835
94836                 var firstTime = selection.selectAll('.surface').empty();
94837
94838                 selection
94839                     .call(drawLayers);
94840
94841                 var surface = selection.selectAll('.surface')
94842                     .classed('tr', true);
94843
94844                 if (firstTime) {
94845                     _initialized = true;
94846
94847                     surface
94848                         .call(breathe);
94849                 }
94850
94851                 // This can happen if we've lowered the detail while a FROM way
94852                 // is selected, and that way is no longer part of the intersection.
94853                 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
94854                     _fromWayID = null;
94855                     _oldTurns = null;
94856                 }
94857
94858                 surface
94859                     .call(utilSetDimensions, d)
94860                     .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
94861                     .call(drawLines, vgraph, _intersection.ways, filter)
94862                     .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
94863
94864                 surface
94865                     .on('click.restrictions', click)
94866                     .on('mouseover.restrictions', mouseover);
94867
94868                 surface
94869                     .selectAll('.selected')
94870                     .classed('selected', false);
94871
94872                 surface
94873                     .selectAll('.related')
94874                     .classed('related', false);
94875
94876                 if (_fromWayID) {
94877                     var way = vgraph.entity(_fromWayID);
94878                     surface
94879                         .selectAll('.' + _fromWayID)
94880                         .classed('selected', true)
94881                         .classed('related', true);
94882                 }
94883
94884                 document.addEventListener('resizeWindow', function () {
94885                     utilSetDimensions(_container, null);
94886                     redraw(1);
94887                 }, false);
94888
94889                 updateHints(null);
94890
94891
94892                 function click() {
94893                     surface
94894                         .call(breathe.off)
94895                         .call(breathe);
94896
94897                     var datum = event.target.__data__;
94898                     var entity = datum && datum.properties && datum.properties.entity;
94899                     if (entity) {
94900                         datum = entity;
94901                     }
94902
94903                     if (datum instanceof osmWay && (datum.__from || datum.__via)) {
94904                         _fromWayID = datum.id;
94905                         _oldTurns = null;
94906                         redraw();
94907
94908                     } else if (datum instanceof osmTurn) {
94909                         var actions, extraActions, turns, i;
94910                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94911
94912                         if (datum.restrictionID && !datum.direct) {
94913                             return;
94914
94915                         } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
94916                             var seen = {};
94917                             var datumOnly = JSON.parse(JSON.stringify(datum));   // deep clone the datum
94918                             datumOnly.only = true;                               // but change this property
94919                             restrictionType = restrictionType.replace(/^no/, 'only');
94920
94921                             // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
94922                             // We will remember them in _oldTurns, and restore them if the user clicks again.
94923                             turns = _intersection.turns(_fromWayID, 2);
94924                             extraActions = [];
94925                             _oldTurns = [];
94926                             for (i = 0; i < turns.length; i++) {
94927                                 var turn = turns[i];
94928                                 if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
94929
94930                                 if (turn.direct && turn.path[1] === datum.path[1]) {
94931                                     seen[turns[i].restrictionID] = true;
94932                                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
94933                                     _oldTurns.push(turn);
94934                                     extraActions.push(actionUnrestrictTurn(turn));
94935                                 }
94936                             }
94937
94938                             actions = _intersection.actions.concat(extraActions, [
94939                                 actionRestrictTurn(datumOnly, restrictionType),
94940                                 t('operations.restriction.annotation.create')
94941                             ]);
94942
94943                         } else if (datum.restrictionID) {   // ONLY -> Allowed
94944                             // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
94945                             // This relies on the assumption that the intersection was already split up when we
94946                             // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
94947                             turns = _oldTurns || [];
94948                             extraActions = [];
94949                             for (i = 0; i < turns.length; i++) {
94950                                 if (turns[i].key !== datum.key) {
94951                                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
94952                                 }
94953                             }
94954                             _oldTurns = null;
94955
94956                             actions = _intersection.actions.concat(extraActions, [
94957                                 actionUnrestrictTurn(datum),
94958                                 t('operations.restriction.annotation.delete')
94959                             ]);
94960
94961                         } else {    // Allowed -> NO
94962                             actions = _intersection.actions.concat([
94963                                 actionRestrictTurn(datum, restrictionType),
94964                                 t('operations.restriction.annotation.create')
94965                             ]);
94966                         }
94967
94968                         context.perform.apply(context, actions);
94969
94970                         // At this point the datum will be changed, but will have same key..
94971                         // Refresh it and update the help..
94972                         var s = surface.selectAll('.' + datum.key);
94973                         datum = s.empty() ? null : s.datum();
94974                         updateHints(datum);
94975
94976                     } else {
94977                         _fromWayID = null;
94978                         _oldTurns = null;
94979                         redraw();
94980                     }
94981                 }
94982
94983
94984                 function mouseover() {
94985                     var datum = event.target.__data__;
94986                     updateHints(datum);
94987                 }
94988
94989                 _lastXPos = _lastXPos || sdims[0];
94990
94991                 function redraw(minChange) {
94992                     var xPos = -1;
94993
94994                     if (minChange) {
94995                         xPos = utilGetDimensions(d3_select('#sidebar'))[0];
94996                     }
94997
94998                     if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
94999                         if (context.hasEntity(_vertexID)) {
95000                             _lastXPos = xPos;
95001                             _container.call(renderViewer);
95002                         }
95003                     }
95004                 }
95005
95006
95007                 function highlightPathsFrom(wayID) {
95008                     surface.selectAll('.related')
95009                         .classed('related', false)
95010                         .classed('allow', false)
95011                         .classed('restrict', false)
95012                         .classed('only', false);
95013
95014                     surface.selectAll('.' + wayID)
95015                         .classed('related', true);
95016
95017                     if (wayID) {
95018                         var turns = _intersection.turns(wayID, _maxViaWay);
95019                         for (var i = 0; i < turns.length; i++) {
95020                             var turn = turns[i];
95021                             var ids = [turn.to.way];
95022                             var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
95023
95024                             if (turn.only || turns.length === 1) {
95025                                 if (turn.via.ways) {
95026                                     ids = ids.concat(turn.via.ways);
95027                                 }
95028                             } else if (turn.to.way === wayID) {
95029                                 continue;
95030                             }
95031
95032                             surface.selectAll(utilEntitySelector(ids))
95033                                 .classed('related', true)
95034                                 .classed('allow', (klass === 'allow'))
95035                                 .classed('restrict', (klass === 'restrict'))
95036                                 .classed('only', (klass === 'only'));
95037                         }
95038                     }
95039                 }
95040
95041
95042                 function updateHints(datum) {
95043                     var help = _container.selectAll('.restriction-help').html('');
95044
95045                     var placeholders = {};
95046                     ['from', 'via', 'to'].forEach(function(k) {
95047                         placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
95048                     });
95049
95050                     var entity = datum && datum.properties && datum.properties.entity;
95051                     if (entity) {
95052                         datum = entity;
95053                     }
95054
95055                     if (_fromWayID) {
95056                         way = vgraph.entity(_fromWayID);
95057                         surface
95058                             .selectAll('.' + _fromWayID)
95059                             .classed('selected', true)
95060                             .classed('related', true);
95061                     }
95062
95063                     // Hovering a way
95064                     if (datum instanceof osmWay && datum.__from) {
95065                         way = datum;
95066
95067                         highlightPathsFrom(_fromWayID ? null : way.id);
95068                         surface.selectAll('.' + way.id)
95069                             .classed('related', true);
95070
95071                         var clickSelect = (!_fromWayID || _fromWayID !== way.id);
95072                         help
95073                             .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
95074                             .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
95075                                 from: placeholders.from,
95076                                 fromName: displayName(way.id, vgraph)
95077                             }));
95078
95079
95080                     // Hovering a turn arrow
95081                     } else if (datum instanceof osmTurn) {
95082                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
95083                         var turnType = restrictionType.replace(/^(only|no)\_/, '');
95084                         var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
95085                         var klass, turnText, nextText;
95086
95087                         if (datum.no) {
95088                             klass = 'restrict';
95089                             turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
95090                             nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
95091                         } else if (datum.only) {
95092                             klass = 'only';
95093                             turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
95094                             nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
95095                         } else {
95096                             klass = 'allow';
95097                             turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
95098                             nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
95099                         }
95100
95101                         help
95102                             .append('div')      // "NO Right Turn (indirect)"
95103                             .attr('class', 'qualifier ' + klass)
95104                             .text(turnText);
95105
95106                         help
95107                             .append('div')      // "FROM {fromName} TO {toName}"
95108                             .html(t('restriction.help.from_name_to_name', {
95109                                 from: placeholders.from,
95110                                 fromName: displayName(datum.from.way, vgraph),
95111                                 to: placeholders.to,
95112                                 toName: displayName(datum.to.way, vgraph)
95113                             }));
95114
95115                         if (datum.via.ways && datum.via.ways.length) {
95116                             var names = [];
95117                             for (var i = 0; i < datum.via.ways.length; i++) {
95118                                 var prev = names[names.length - 1];
95119                                 var curr = displayName(datum.via.ways[i], vgraph);
95120                                 if (!prev || curr !== prev)   // collapse identical names
95121                                     names.push(curr);
95122                             }
95123
95124                             help
95125                                 .append('div')      // "VIA {viaNames}"
95126                                 .html(t('restriction.help.via_names', {
95127                                     via: placeholders.via,
95128                                     viaNames: names.join(', ')
95129                                 }));
95130                         }
95131
95132                         if (!indirect) {
95133                             help
95134                                 .append('div')      // Click for "No Right Turn"
95135                                 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
95136                         }
95137
95138                         highlightPathsFrom(null);
95139                         var alongIDs = datum.path.slice();
95140                         surface.selectAll(utilEntitySelector(alongIDs))
95141                             .classed('related', true)
95142                             .classed('allow', (klass === 'allow'))
95143                             .classed('restrict', (klass === 'restrict'))
95144                             .classed('only', (klass === 'only'));
95145
95146
95147                     // Hovering empty surface
95148                     } else {
95149                         highlightPathsFrom(null);
95150                         if (_fromWayID) {
95151                             help
95152                                 .append('div')      // "FROM {fromName}"
95153                                 .html(t('restriction.help.from_name', {
95154                                     from: placeholders.from,
95155                                     fromName: displayName(_fromWayID, vgraph)
95156                                 }));
95157
95158                         } else {
95159                             help
95160                                 .append('div')      // "Click to select a FROM segment."
95161                                 .html(t('restriction.help.select_from', {
95162                                     from: placeholders.from
95163                                 }));
95164                         }
95165                     }
95166                 }
95167             }
95168
95169
95170             function displayMaxDistance(maxDist) {
95171                 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
95172                 var opts;
95173
95174                 if (isImperial) {
95175                     var distToFeet = {   // imprecise conversion for prettier display
95176                         20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
95177                     }[maxDist];
95178                     opts = { distance: t('units.feet', { quantity: distToFeet }) };
95179                 } else {
95180                     opts = { distance: t('units.meters', { quantity: maxDist }) };
95181                 }
95182
95183                 return t('restriction.controls.distance_up_to', opts);
95184             }
95185
95186
95187             function displayMaxVia(maxVia) {
95188                 return maxVia === 0 ? t('restriction.controls.via_node_only')
95189                     : maxVia === 1 ? t('restriction.controls.via_up_to_one')
95190                     : t('restriction.controls.via_up_to_two');
95191             }
95192
95193
95194             function displayName(entityID, graph) {
95195                 var entity = graph.entity(entityID);
95196                 var name = utilDisplayName(entity) || '';
95197                 var matched = context.presets().match(entity, graph);
95198                 var type = (matched && matched.name()) || utilDisplayType(entity.id);
95199                 return name || type;
95200             }
95201
95202
95203             restrictions.entity = function(val) {
95204                 _intersection = null;
95205                 _fromWayID = null;
95206                 _oldTurns = null;
95207                 _vertexID = val.id;
95208             };
95209
95210
95211             restrictions.tags = function() {};
95212             restrictions.focus = function() {};
95213
95214
95215             restrictions.off = function(selection) {
95216                 if (!_initialized) return;
95217
95218                 selection.selectAll('.surface')
95219                     .call(breathe.off)
95220                     .on('click.restrictions', null)
95221                     .on('mouseover.restrictions', null);
95222
95223                 d3_select(window)
95224                     .on('resize.restrictions', null);
95225             };
95226
95227
95228             return utilRebind(restrictions, dispatch$1, 'on');
95229         }
95230
95231         function uiFieldTextarea(field) {
95232             var dispatch$1 = dispatch('change');
95233             var input = d3_select(null);
95234
95235
95236             function textarea(selection) {
95237                 var wrap = selection.selectAll('.form-field-input-wrap')
95238                     .data([0]);
95239
95240                 wrap = wrap.enter()
95241                     .append('div')
95242                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95243                     .merge(wrap);
95244
95245                 input = wrap.selectAll('textarea')
95246                     .data([0]);
95247
95248                 input = input.enter()
95249                     .append('textarea')
95250                     .attr('id', 'preset-input-' + field.safeid)
95251                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
95252                     .attr('maxlength', 255)
95253                     .call(utilNoAuto)
95254                     .on('input', change(true))
95255                     .on('blur', change())
95256                     .on('change', change())
95257                     .merge(input);
95258             }
95259
95260
95261             function change(onInput) {
95262                 return function() {
95263                     var t = {};
95264                     t[field.key] = utilGetSetValue(input) || undefined;
95265                     dispatch$1.call('change', this, t, onInput);
95266                 };
95267             }
95268
95269
95270             textarea.tags = function(tags) {
95271                 utilGetSetValue(input, tags[field.key] || '');
95272             };
95273
95274
95275             textarea.focus = function() {
95276                 input.node().focus();
95277             };
95278
95279
95280             return utilRebind(textarea, dispatch$1, 'on');
95281         }
95282
95283         function uiFieldWikidata(field, context) {
95284             var wikidata = services$1.wikidata;
95285             var dispatch$1 = dispatch('change');
95286             var searchInput = d3_select(null);
95287             var _qid = null;
95288             var _wikidataEntity = null;
95289             var _wikiURL = '';
95290             var _entity;
95291
95292             var combobox = uiCombobox(context, 'combo-' + field.safeid)
95293                 .caseSensitive(true)
95294                 .minItems(1);
95295
95296             function wiki(selection) {
95297
95298                 var wrap = selection.selectAll('.form-field-input-wrap')
95299                     .data([0]);
95300
95301                 wrap = wrap.enter()
95302                     .append('div')
95303                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95304                     .merge(wrap);
95305
95306
95307                 var list = wrap.selectAll('ul')
95308                     .data([0]);
95309
95310                 list = list.enter()
95311                     .append('ul')
95312                     .attr('class', 'rows')
95313                     .merge(list);
95314
95315                 var searchRow = list.selectAll('li.wikidata-search')
95316                     .data([0]);
95317
95318                 var searchRowEnter = searchRow.enter()
95319                     .append('li')
95320                     .attr('class', 'wikidata-search');
95321
95322                 searchInput = searchRowEnter
95323                     .append('input')
95324                     .attr('type', 'text')
95325                     .style('flex', '1')
95326                     .call(utilNoAuto);
95327
95328                 searchInput
95329                     .on('focus', function() {
95330                         var node = d3_select(this).node();
95331                         node.setSelectionRange(0, node.value.length);
95332                     })
95333                     .on('blur', function() {
95334                         setLabelForEntity();
95335                     })
95336                     .call(combobox.fetcher(fetchWikidataItems));
95337
95338                 combobox.on('accept', function(d) {
95339                     _qid = d.id;
95340                     change();
95341                 }).on('cancel', function() {
95342                     setLabelForEntity();
95343                 });
95344
95345                 searchRowEnter
95346                     .append('button')
95347                     .attr('class', 'form-field-button wiki-link')
95348                     .attr('title', t('icons.open_wikidata'))
95349                     .attr('tabindex', -1)
95350                     .call(svgIcon('#iD-icon-out-link'))
95351                     .on('click', function() {
95352                         event.preventDefault();
95353                         if (_wikiURL) window.open(_wikiURL, '_blank');
95354                     });
95355
95356                 var wikidataProperties = ['description', 'identifier'];
95357
95358                 var items = list.selectAll('li.labeled-input')
95359                     .data(wikidataProperties);
95360
95361                 // Enter
95362                 var enter = items.enter()
95363                     .append('li')
95364                     .attr('class', function(d) { return 'labeled-input preset-wikidata-' + d; });
95365
95366                 enter
95367                     .append('span')
95368                     .attr('class', 'label')
95369                     .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
95370                     .text(function(d) { return t('wikidata.' + d); });
95371
95372                 enter
95373                     .append('input')
95374                     .attr('type', 'text')
95375                     .attr('id', function(d) { return 'preset-input-wikidata-' + d; })
95376                     .call(utilNoAuto)
95377                     .classed('disabled', 'true')
95378                     .attr('readonly', 'true');
95379
95380                 enter
95381                     .append('button')
95382                     .attr('class', 'form-field-button')
95383                     .attr('title', t('icons.copy'))
95384                     .attr('tabindex', -1)
95385                     .call(svgIcon('#iD-operation-copy'))
95386                     .on('click', function() {
95387                         event.preventDefault();
95388                         d3_select(this.parentNode)
95389                             .select('input')
95390                             .node()
95391                             .select();
95392                         document.execCommand('copy');
95393                     });
95394
95395             }
95396
95397             function fetchWikidataItems(q, callback) {
95398
95399                 if (!q && _entity) {
95400                     q = context.entity(_entity.id).tags.name || '';
95401                 }
95402
95403                 wikidata.itemsForSearchQuery(q, function(err, data) {
95404                     if (err) return;
95405
95406                     for (var i in data) {
95407                         data[i].value = data[i].label + ' (' +  data[i].id + ')';
95408                         data[i].title = data[i].description;
95409                     }
95410
95411                     if (callback) callback(data);
95412                 });
95413             }
95414
95415
95416             function change() {
95417                 var syncTags = {};
95418                 syncTags[field.key] = _qid;
95419                 dispatch$1.call('change', this, syncTags);
95420
95421                 // attempt asynchronous update of wikidata tag..
95422                 var initGraph = context.graph();
95423                 var initEntityID = _entity.id;
95424
95425                 wikidata.entityByQID(_qid, function(err, entity) {
95426                     if (err) return;
95427
95428                     // If graph has changed, we can't apply this update.
95429                     if (context.graph() !== initGraph) return;
95430
95431                     if (!entity.sitelinks) return;
95432
95433                     var langs = wikidata.languagesToQuery();
95434                     // use the label and description languages as fallbacks
95435                     ['labels', 'descriptions'].forEach(function(key) {
95436                         if (!entity[key]) return;
95437
95438                         var valueLangs = Object.keys(entity[key]);
95439                         if (valueLangs.length === 0) return;
95440                         var valueLang = valueLangs[0];
95441
95442                         if (langs.indexOf(valueLang) === -1) {
95443                             langs.push(valueLang);
95444                         }
95445                     });
95446
95447                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95448
95449                     var foundPreferred;
95450                     for (var i in langs) {
95451                         var lang = langs[i];
95452                         var siteID = lang.replace('-', '_') + 'wiki';
95453                         if (entity.sitelinks[siteID]) {
95454                             foundPreferred = true;
95455                             currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title;
95456                             // use the first match
95457                             break;
95458                         }
95459                     }
95460
95461                     if (!foundPreferred) {
95462                         // No wikipedia sites available in the user's language or the fallback languages,
95463                         // default to any wikipedia sitelink
95464
95465                         var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
95466                             return site.endsWith('wiki');
95467                         });
95468
95469                         if (wikiSiteKeys.length === 0) {
95470                             // if no wikipedia pages are linked to this wikidata entity, delete that tag
95471                             if (currTags.wikipedia) {
95472                                 delete currTags.wikipedia;
95473                             }
95474                         } else {
95475                             var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
95476                             var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
95477                             currTags.wikipedia = wikiLang + ':' + wikiTitle;
95478                         }
95479                     }
95480
95481                     // Coalesce the update of wikidata tag into the previous tag change
95482                     context.overwrite(
95483                         actionChangeTags(initEntityID, currTags),
95484                         context.history().undoAnnotation()
95485                     );
95486
95487                     // do not dispatch.call('change') here, because entity_editor
95488                     // changeTags() is not intended to be called asynchronously
95489
95490                 });
95491             }
95492
95493             function setLabelForEntity() {
95494                 var label = '';
95495                 if (_wikidataEntity) {
95496                     label = entityPropertyForDisplay(_wikidataEntity, 'labels');
95497                     if (label.length === 0) {
95498                         label = _wikidataEntity.id.toString();
95499                     }
95500                 }
95501                 utilGetSetValue(d3_select('li.wikidata-search input'), label);
95502             }
95503
95504
95505             wiki.tags = function(tags) {
95506                 _qid = tags[field.key] || '';
95507
95508                 if (!/^Q[0-9]*$/.test(_qid)) {   // not a proper QID
95509                     unrecognized();
95510                     return;
95511                 }
95512
95513                 // QID value in correct format
95514                 _wikiURL = 'https://wikidata.org/wiki/' + _qid;
95515                 wikidata.entityByQID(_qid, function(err, entity) {
95516                     if (err) {
95517                         unrecognized();
95518                         return;
95519                     }
95520                     _wikidataEntity = entity;
95521
95522                     setLabelForEntity();
95523
95524                     var description = entityPropertyForDisplay(entity, 'descriptions');
95525
95526                     d3_select('.form-field-wikidata button.wiki-link')
95527                         .classed('disabled', false);
95528
95529                     d3_select('.preset-wikidata-description')
95530                         .style('display', function(){
95531                             return description.length > 0 ? 'flex' : 'none';
95532                         })
95533                         .select('input')
95534                         .attr('value', description);
95535
95536                     d3_select('.preset-wikidata-identifier')
95537                         .style('display', function(){
95538                             return entity.id ? 'flex' : 'none';
95539                         })
95540                         .select('input')
95541                         .attr('value', entity.id);
95542                 });
95543
95544
95545                 // not a proper QID
95546                 function unrecognized() {
95547                     _wikidataEntity = null;
95548                     setLabelForEntity();
95549
95550                     d3_select('.preset-wikidata-description')
95551                         .style('display', 'none');
95552                     d3_select('.preset-wikidata-identifier')
95553                         .style('display', 'none');
95554
95555                     d3_select('.form-field-wikidata button.wiki-link')
95556                         .classed('disabled', true);
95557
95558                     if (_qid && _qid !== '') {
95559                         _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
95560                     } else {
95561                         _wikiURL = '';
95562                     }
95563                 }
95564             };
95565
95566             function entityPropertyForDisplay(wikidataEntity, propKey) {
95567                 if (!wikidataEntity[propKey]) return '';
95568                 var propObj = wikidataEntity[propKey];
95569                 var langKeys = Object.keys(propObj);
95570                 if (langKeys.length === 0) return '';
95571                 // sorted by priority, since we want to show the user's language first if possible
95572                 var langs = wikidata.languagesToQuery();
95573                 for (var i in langs) {
95574                     var lang = langs[i];
95575                     var valueObj = propObj[lang];
95576                     if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
95577                 }
95578                 // default to any available value
95579                 return propObj[langKeys[0]].value;
95580             }
95581
95582
95583             wiki.entity = function(val) {
95584                 if (!arguments.length) return _entity;
95585                 _entity = val;
95586                 return wiki;
95587             };
95588
95589
95590             wiki.focus = function() {
95591                 searchInput.node().focus();
95592             };
95593
95594
95595             return utilRebind(wiki, dispatch$1, 'on');
95596         }
95597
95598         function uiFieldWikipedia(field, context) {
95599             var dispatch$1 = dispatch('change');
95600             var wikipedia = services$1.wikipedia;
95601             var wikidata = services$1.wikidata;
95602             var lang = d3_select(null);
95603             var title = d3_select(null);
95604             var _wikiURL = '';
95605             var _entity;
95606
95607             var langCombo = uiCombobox(context, 'wikipedia-lang')
95608                 .fetcher(function(value, cb) {
95609                     var v = value.toLowerCase();
95610
95611                     cb(wikipedia$2.filter(function(d) {
95612                         return d[0].toLowerCase().indexOf(v) >= 0 ||
95613                             d[1].toLowerCase().indexOf(v) >= 0 ||
95614                             d[2].toLowerCase().indexOf(v) >= 0;
95615                     }).map(function(d) {
95616                         return { value: d[1] };
95617                     }));
95618                 });
95619
95620             var titleCombo = uiCombobox(context, 'wikipedia-title')
95621                 .fetcher(function(value, cb) {
95622                     if (!value && _entity) {
95623                         value = context.entity(_entity.id).tags.name || '';
95624                     }
95625
95626                     var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
95627                     searchfn(language()[2], value, function(query, data) {
95628                         cb(data.map(function(d) {
95629                             return { value: d };
95630                         }));
95631                     });
95632                 });
95633
95634
95635             function wiki(selection) {
95636                 var wrap = selection.selectAll('.form-field-input-wrap')
95637                     .data([0]);
95638
95639                 wrap = wrap.enter()
95640                     .append('div')
95641                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95642                     .merge(wrap);
95643
95644
95645                 var langRow = wrap.selectAll('.wiki-lang-container')
95646                     .data([0]);
95647
95648                 langRow = langRow.enter()
95649                     .append('div')
95650                     .attr('class', 'wiki-lang-container')
95651                     .merge(langRow);
95652
95653
95654                 lang = langRow.selectAll('input.wiki-lang')
95655                     .data([0]);
95656
95657                 lang = lang.enter()
95658                     .append('input')
95659                     .attr('type', 'text')
95660                     .attr('class', 'wiki-lang')
95661                     .attr('placeholder', t('translate.localized_translation_language'))
95662                     .call(utilNoAuto)
95663                     .call(langCombo)
95664                     .merge(lang);
95665
95666                 utilGetSetValue(lang, language()[1]);
95667
95668                 lang
95669                     .on('blur', changeLang)
95670                     .on('change', changeLang);
95671
95672
95673                 var titleRow = wrap.selectAll('.wiki-title-container')
95674                     .data([0]);
95675
95676                 titleRow = titleRow.enter()
95677                     .append('div')
95678                     .attr('class', 'wiki-title-container')
95679                     .merge(titleRow);
95680
95681                 title = titleRow.selectAll('input.wiki-title')
95682                     .data([0]);
95683
95684                 title = title.enter()
95685                     .append('input')
95686                     .attr('type', 'text')
95687                     .attr('class', 'wiki-title')
95688                     .attr('id', 'preset-input-' + field.safeid)
95689                     .call(utilNoAuto)
95690                     .call(titleCombo)
95691                     .merge(title);
95692
95693                 title
95694                     .on('blur', blur)
95695                     .on('change', change);
95696
95697
95698                 var link = titleRow.selectAll('.wiki-link')
95699                     .data([0]);
95700
95701                 link = link.enter()
95702                     .append('button')
95703                     .attr('class', 'form-field-button wiki-link')
95704                     .attr('tabindex', -1)
95705                     .call(svgIcon('#iD-icon-out-link'))
95706                     .merge(link);
95707
95708                 link
95709                     .on('click', function() {
95710                         event.preventDefault();
95711                         if (_wikiURL) window.open(_wikiURL, '_blank');
95712                     });
95713             }
95714
95715
95716             function language() {
95717                 var value = utilGetSetValue(lang).toLowerCase();
95718                 var locale = utilDetect().locale.toLowerCase();
95719                 var localeLanguage;
95720                 return wikipedia$2.find(function(d) {
95721                     if (d[2] === locale) localeLanguage = d;
95722                     return d[0].toLowerCase() === value ||
95723                         d[1].toLowerCase() === value ||
95724                         d[2] === value;
95725                 }) || localeLanguage || ['English', 'English', 'en'];
95726             }
95727
95728
95729             function changeLang() {
95730                 utilGetSetValue(lang, language()[1]);
95731                 change(true);
95732             }
95733
95734
95735             function blur() {
95736                 change(true);
95737             }
95738
95739
95740             function change(skipWikidata) {
95741                 var value = utilGetSetValue(title);
95742                 var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
95743                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95744                 var syncTags = {};
95745
95746                 if (l) {
95747                     // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
95748                     value = decodeURIComponent(m[2]).replace(/_/g, ' ');
95749                     if (m[3]) {
95750                         var anchor;
95751                         // try {
95752                         // leave this out for now - #6232
95753                             // Best-effort `anchordecode:` implementation
95754                             // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
95755                         // } catch (e) {
95756                             anchor = decodeURIComponent(m[3]);
95757                         // }
95758                         value += '#' + anchor.replace(/_/g, ' ');
95759                     }
95760                     value = value.slice(0, 1).toUpperCase() + value.slice(1);
95761                     utilGetSetValue(lang, l[1]);
95762                     utilGetSetValue(title, value);
95763                 }
95764
95765                 if (value) {
95766                     syncTags.wikipedia = language()[2] + ':' + value;
95767                 } else {
95768                     syncTags.wikipedia = undefined;
95769                 }
95770
95771                 dispatch$1.call('change', this, syncTags);
95772
95773
95774                 if (skipWikidata || !value || !language()[2]) return;
95775
95776                 // attempt asynchronous update of wikidata tag..
95777                 var initGraph = context.graph();
95778                 var initEntityID = _entity.id;
95779
95780                 wikidata.itemsByTitle(language()[2], value, function(err, data) {
95781                     if (err) return;
95782
95783                     // If graph has changed, we can't apply this update.
95784                     if (context.graph() !== initGraph) return;
95785
95786                     if (!data || !Object.keys(data).length) return;
95787
95788                     var qids = Object.keys(data);
95789                     var value = qids && qids.find(function(id) { return id.match(/^Q\d+$/); });
95790                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95791
95792                     currTags.wikidata = value;
95793
95794                     // Coalesce the update of wikidata tag into the previous tag change
95795                     context.overwrite(
95796                         actionChangeTags(initEntityID, currTags),
95797                         context.history().undoAnnotation()
95798                     );
95799
95800                     // do not dispatch.call('change') here, because entity_editor
95801                     // changeTags() is not intended to be called asynchronously
95802                 });
95803             }
95804
95805
95806             wiki.tags = function(tags) {
95807                 var value = tags[field.key] || '';
95808                 var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
95809                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95810                 var anchor = m && m[3];
95811
95812                 // value in correct format
95813                 if (l) {
95814                     utilGetSetValue(lang, l[1]);
95815                     utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
95816                     if (anchor) {
95817                         try {
95818                             // Best-effort `anchorencode:` implementation
95819                             anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
95820                         } catch (e) {
95821                             anchor = anchor.replace(/ /g, '_');
95822                         }
95823                     }
95824                     _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
95825                         m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
95826
95827                 // unrecognized value format
95828                 } else {
95829                     utilGetSetValue(title, value);
95830                     if (value && value !== '') {
95831                         utilGetSetValue(lang, '');
95832                         _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
95833                     } else {
95834                         _wikiURL = '';
95835                     }
95836                 }
95837             };
95838
95839
95840             wiki.entity = function(val) {
95841                 if (!arguments.length) return _entity;
95842                 _entity = val;
95843                 return wiki;
95844             };
95845
95846
95847             wiki.focus = function() {
95848                 title.node().focus();
95849             };
95850
95851
95852             return utilRebind(wiki, dispatch$1, 'on');
95853         }
95854
95855         var uiFields = {
95856             access: uiFieldAccess,
95857             address: uiFieldAddress,
95858             check: uiFieldCheck,
95859             combo: uiFieldCombo,
95860             cycleway: uiFieldCycleway,
95861             defaultCheck: uiFieldCheck,
95862             email: uiFieldText,
95863             lanes: uiFieldLanes,
95864             localized: uiFieldLocalized,
95865             maxspeed: uiFieldMaxspeed,
95866             multiCombo: uiFieldCombo,
95867             networkCombo: uiFieldCombo,
95868             number: uiFieldText,
95869             onewayCheck: uiFieldCheck,
95870             radio: uiFieldRadio,
95871             restrictions: uiFieldRestrictions,
95872             semiCombo: uiFieldCombo,
95873             structureRadio: uiFieldRadio,
95874             tel: uiFieldText,
95875             text: uiFieldText,
95876             textarea: uiFieldTextarea,
95877             typeCombo: uiFieldCombo,
95878             url: uiFieldText,
95879             wikidata: uiFieldWikidata,
95880             wikipedia: uiFieldWikipedia
95881         };
95882
95883         function uiField(context, presetField, entity, options) {
95884             options = Object.assign({
95885                 show: true,
95886                 wrap: true,
95887                 remove: true,
95888                 revert: true,
95889                 info: true
95890             }, options);
95891
95892             var dispatch$1 = dispatch('change');
95893             var field = Object.assign({}, presetField);   // shallow copy
95894             var _show = options.show;
95895             var _state = '';
95896             var _tags = {};
95897
95898             var _locked = false;
95899             var _lockedTip = tooltip()
95900                 .title(t('inspector.lock.suggestion', { label: field.label }))
95901                 .placement('bottom');
95902
95903
95904             field.keys = field.keys || [field.key];
95905
95906             // only create the fields that are actually being shown
95907             if (_show && !field.impl) {
95908                 createField();
95909             }
95910
95911             // Creates the field.. This is done lazily,
95912             // once we know that the field will be shown.
95913             function createField() {
95914                 field.impl = uiFields[field.type](field, context)
95915                     .on('change', function(t, onInput) {
95916                         dispatch$1.call('change', field, t, onInput);
95917                     });
95918
95919                 if (entity) {
95920                     field.entityID = entity.id;
95921                     // if this field cares about the entity, pass it along
95922                     if (field.impl.entity) {
95923                         field.impl.entity(entity);
95924                     }
95925                 }
95926             }
95927
95928
95929             function isModified() {
95930                 if (!entity) return false;
95931                 var original = context.graph().base().entities[entity.id];
95932                 return field.keys.some(function(key) {
95933                     return original ? _tags[key] !== original.tags[key] : _tags[key];
95934                 });
95935             }
95936
95937
95938             function isPresent() {
95939                 return field.keys.some(function(key) {
95940                     if (field.type === 'multiCombo') {
95941                         for (var tagKey in _tags) {
95942                             if (tagKey.indexOf(key) === 0) {
95943                                 return true;
95944                             }
95945                         }
95946                         return false;
95947                     }
95948                     return _tags[key] !== undefined;
95949                 });
95950             }
95951
95952
95953             function revert(d) {
95954                 event.stopPropagation();
95955                 event.preventDefault();
95956                 if (!entity || _locked) return;
95957
95958                 var original = context.graph().base().entities[entity.id];
95959                 var t = {};
95960                 d.keys.forEach(function(key) {
95961                     t[key] = original ? original.tags[key] : undefined;
95962                 });
95963
95964                 dispatch$1.call('change', d, t);
95965             }
95966
95967
95968             function remove(d) {
95969                 event.stopPropagation();
95970                 event.preventDefault();
95971                 if (_locked) return;
95972
95973                 var t = {};
95974                 d.keys.forEach(function(key) {
95975                     t[key] = undefined;
95976                 });
95977
95978                 dispatch$1.call('change', d, t);
95979             }
95980
95981
95982             field.render = function(selection) {
95983                 var container = selection.selectAll('.form-field')
95984                     .data([field]);
95985
95986                 // Enter
95987                 var enter = container.enter()
95988                     .append('div')
95989                     .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
95990                     .classed('nowrap', !options.wrap);
95991
95992                 if (options.wrap) {
95993                     var labelEnter = enter
95994                         .append('label')
95995                         .attr('class', 'field-label')
95996                         .attr('for', function(d) { return 'preset-input-' + d.safeid; });
95997
95998                     var textEnter = labelEnter
95999                         .append('span')
96000                         .attr('class', 'label-text');
96001
96002                     textEnter
96003                         .append('span')
96004                         .attr('class', 'label-textvalue')
96005                         .text(function(d) { return d.label(); });
96006
96007                     textEnter
96008                         .append('span')
96009                         .attr('class', 'label-textannotation');
96010
96011                     if (options.remove) {
96012                         labelEnter
96013                             .append('button')
96014                             .attr('class', 'remove-icon')
96015                             .attr('title', t('icons.remove'))
96016                             .attr('tabindex', -1)
96017                             .call(svgIcon('#iD-operation-delete'));
96018                     }
96019
96020                     if (options.revert) {
96021                         labelEnter
96022                             .append('button')
96023                             .attr('class', 'modified-icon')
96024                             .attr('title', t('icons.undo'))
96025                             .attr('tabindex', -1)
96026                             .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
96027                     }
96028                 }
96029
96030
96031                 // Update
96032                 container = container
96033                     .merge(enter);
96034
96035                 container.select('.field-label > .remove-icon')  // propagate bound data
96036                     .on('click', remove);
96037
96038                 container.select('.field-label > .modified-icon')  // propagate bound data
96039                     .on('click', revert);
96040
96041                 container
96042                     .each(function(d) {
96043                         var selection = d3_select(this);
96044
96045                         if (!d.impl) {
96046                             createField();
96047                         }
96048
96049                         var reference, help;
96050
96051                         // instantiate field help
96052                         if (options.wrap && field.type === 'restrictions') {
96053                             help = uiFieldHelp(context, 'restrictions');
96054                         }
96055
96056                         // instantiate tag reference
96057                         if (options.wrap && options.info) {
96058                             var referenceKey = d.key;
96059                             if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
96060                                 referenceKey = referenceKey.replace(/:$/, '');
96061                             }
96062
96063                             reference = uiTagReference(d.reference || { key: referenceKey });
96064                             if (_state === 'hover') {
96065                                 reference.showing(false);
96066                             }
96067                         }
96068
96069                         selection
96070                             .call(d.impl);
96071
96072                         // add field help components
96073                         if (help) {
96074                             selection
96075                                 .call(help.body)
96076                                 .select('.field-label')
96077                                 .call(help.button);
96078                         }
96079
96080                         // add tag reference components
96081                         if (reference) {
96082                             selection
96083                                 .call(reference.body)
96084                                 .select('.field-label')
96085                                 .call(reference.button);
96086                         }
96087
96088                         d.impl.tags(_tags);
96089                     });
96090
96091
96092                     container
96093                         .classed('locked', _locked)
96094                         .classed('modified', isModified())
96095                         .classed('present', isPresent());
96096
96097
96098                     // show a tip and lock icon if the field is locked
96099                     var annotation = container.selectAll('.field-label .label-textannotation');
96100                     var icon = annotation.selectAll('.icon')
96101                         .data(_locked ? [0]: []);
96102
96103                     icon.exit()
96104                         .remove();
96105
96106                     icon.enter()
96107                         .append('svg')
96108                         .attr('class', 'icon')
96109                         .append('use')
96110                         .attr('xlink:href', '#fas-lock');
96111
96112                     container.call(_locked ? _lockedTip : _lockedTip.destroy);
96113             };
96114
96115
96116             field.state = function(val) {
96117                 if (!arguments.length) return _state;
96118                 _state = val;
96119                 return field;
96120             };
96121
96122
96123             field.tags = function(val) {
96124                 if (!arguments.length) return _tags;
96125                 _tags = val;
96126                 return field;
96127             };
96128
96129
96130             field.locked = function(val) {
96131                 if (!arguments.length) return _locked;
96132                 _locked = val;
96133                 return field;
96134             };
96135
96136
96137             field.show = function() {
96138                 _show = true;
96139                 if (!field.impl) {
96140                     createField();
96141                 }
96142                 if (field.default && field.key && _tags[field.key] !== field.default) {
96143                     var t = {};
96144                     t[field.key] = field.default;
96145                     dispatch$1.call('change', this, t);
96146                 }
96147             };
96148
96149             // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
96150             field.isShown = function() {
96151                 return _show || isPresent();
96152             };
96153
96154
96155             // An allowed field can appear in the UI or in the 'Add field' dropdown.
96156             // A non-allowed field is hidden from the user altogether
96157             field.isAllowed = function() {
96158                 if (!entity || isPresent()) return true;   // a field with a value should always display
96159
96160                 var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
96161                 if (!latest) return true;
96162
96163                 var require = field.prerequisiteTag;
96164                 if (require && require.key) {
96165                     var value = latest.tags[require.key];
96166                     if (!value) return false;
96167
96168                     if (require.valueNot) {
96169                         return require.valueNot !== value;
96170                     }
96171                     if (require.value) {
96172                         return require.value === value;
96173                     }
96174                     return true;
96175                 }
96176                 return true;
96177             };
96178
96179
96180             field.focus = function() {
96181                 if (field.impl) {
96182                     field.impl.focus();
96183                 }
96184             };
96185
96186
96187             return utilRebind(field, dispatch$1, 'on');
96188         }
96189
96190         function uiFormFields(context) {
96191             var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
96192             var _fieldsArr = [];
96193             var _lastPlaceholder = '';
96194             var _state = '';
96195             var _klass = '';
96196
96197
96198             function formFields(selection) {
96199                 var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
96200                 var shown = allowedFields.filter(function(field) { return field.isShown(); });
96201                 var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
96202
96203                 var container = selection.selectAll('.form-fields-container')
96204                     .data([0]);
96205
96206                 container = container.enter()
96207                     .append('div')
96208                     .attr('class', 'form-fields-container ' + (_klass || ''))
96209                     .merge(container);
96210
96211
96212                 var fields = container.selectAll('.wrap-form-field')
96213                     .data(shown, function(d) { return d.id + (d.entityID || ''); });
96214
96215                 fields.exit()
96216                     .remove();
96217
96218                 // Enter
96219                 var enter = fields.enter()
96220                     .append('div')
96221                     .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
96222
96223                 // Update
96224                 fields = fields
96225                     .merge(enter);
96226
96227                 fields
96228                     .order()
96229                     .each(function(d) {
96230                         d3_select(this)
96231                             .call(d.render);
96232                     });
96233
96234
96235                 var titles = [];
96236                 var moreFields = notShown.map(function(field) {
96237                     var label = field.label();
96238                     titles.push(label);
96239                     return {
96240                         title: label,
96241                         value: label,
96242                         field: field
96243                     };
96244                 });
96245
96246                 var placeholder = titles.slice(0,3).join(', ') + ((titles.length > 3) ? '…' : '');
96247
96248
96249                 var more = selection.selectAll('.more-fields')
96250                     .data((_state === 'hover' || moreFields.length === 0) ? [] : [0]);
96251
96252                 more.exit()
96253                     .remove();
96254
96255                 more = more.enter()
96256                     .append('div')
96257                     .attr('class', 'more-fields')
96258                     .append('label')
96259                     .text(t('inspector.add_fields'))
96260                     .merge(more);
96261
96262
96263                 var input = more.selectAll('.value')
96264                     .data([0]);
96265
96266                 input.exit()
96267                     .remove();
96268
96269                 input = input.enter()
96270                     .append('input')
96271                     .attr('class', 'value')
96272                     .attr('type', 'text')
96273                     .attr('placeholder', placeholder)
96274                     .call(utilNoAuto)
96275                     .merge(input);
96276
96277                 input
96278                     .call(utilGetSetValue, '')
96279                     .call(moreCombo
96280                         .data(moreFields)
96281                         .on('accept', function (d) {
96282                             if (!d) return;  // user entered something that was not matched
96283                             var field = d.field;
96284                             field.show();
96285                             selection.call(formFields);  // rerender
96286                             if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
96287                                 field.focus();
96288                             }
96289                         })
96290                     );
96291
96292                 // avoid updating placeholder excessively (triggers style recalc)
96293                 if (_lastPlaceholder !== placeholder) {
96294                     input.attr('placeholder', placeholder);
96295                     _lastPlaceholder = placeholder;
96296                 }
96297             }
96298
96299
96300             formFields.fieldsArr = function(val) {
96301                 if (!arguments.length) return _fieldsArr;
96302                 _fieldsArr = val || [];
96303                 return formFields;
96304             };
96305
96306             formFields.state = function(val) {
96307                 if (!arguments.length) return _state;
96308                 _state = val;
96309                 return formFields;
96310             };
96311
96312             formFields.klass = function(val) {
96313                 if (!arguments.length) return _klass;
96314                 _klass = val;
96315                 return formFields;
96316             };
96317
96318
96319             return formFields;
96320         }
96321
96322         function uiPresetEditor(context) {
96323             var dispatch$1 = dispatch('change');
96324             var formFields = uiFormFields(context);
96325             var _state;
96326             var _fieldsArr;
96327             var _preset;
96328             var _tags;
96329             var _entityID;
96330
96331
96332             function presetEditor(selection) {
96333                 selection.call(uiDisclosure(context, 'preset_fields', true)
96334                     .title(t('inspector.all_fields'))
96335                     .content(render)
96336                 );
96337             }
96338
96339
96340             function render(selection) {
96341                 if (!_fieldsArr) {
96342                     var entity = context.entity(_entityID);
96343                     var geometry = context.geometry(_entityID);
96344                     var presets = context.presets();
96345
96346                     _fieldsArr = [];
96347
96348                     _preset.fields.forEach(function(field) {
96349                         if (field.matchGeometry(geometry)) {
96350                             _fieldsArr.push(
96351                                 uiField(context, field, entity)
96352                             );
96353                         }
96354                     });
96355
96356                     if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
96357                         _fieldsArr.push(
96358                             uiField(context, presets.field('restrictions'), entity)
96359                         );
96360                     }
96361
96362                     var additionalFields = utilArrayUnion(_preset.moreFields, presets.universal());
96363                     additionalFields.sort(function(field1, field2) {
96364                         return field1.label() > field2.label();
96365                     });
96366
96367                     additionalFields.forEach(function(field) {
96368                         if (_preset.fields.indexOf(field) === -1) {
96369                             _fieldsArr.push(
96370                                 uiField(context, field, entity, { show: false })
96371                             );
96372                         }
96373                     });
96374
96375                     _fieldsArr.forEach(function(field) {
96376                         field
96377                             .on('change', function(t, onInput) {
96378                                 dispatch$1.call('change', field, t, onInput);
96379                             });
96380                     });
96381                 }
96382
96383                 _fieldsArr.forEach(function(field) {
96384                     field
96385                         .state(_state)
96386                         .tags(_tags);
96387                 });
96388
96389
96390                 selection
96391                     .call(formFields
96392                         .fieldsArr(_fieldsArr)
96393                         .state(_state)
96394                         .klass('inspector-inner fillL3')
96395                     );
96396
96397
96398                 selection.selectAll('.wrap-form-field input')
96399                     .on('keydown', function() {
96400                         // if user presses enter, and combobox is not active, accept edits..
96401                         if (event.keyCode === 13 && d3_select('.combobox').empty()) {
96402                             context.enter(modeBrowse(context));
96403                         }
96404                     });
96405             }
96406
96407
96408             presetEditor.preset = function(val) {
96409                 if (!arguments.length) return _preset;
96410                 if (_preset && _preset.id === val.id) return presetEditor;
96411                 _preset = val;
96412                 _fieldsArr = null;
96413                 return presetEditor;
96414             };
96415
96416
96417             presetEditor.state = function(val) {
96418                 if (!arguments.length) return _state;
96419                 _state = val;
96420                 return presetEditor;
96421             };
96422
96423
96424             presetEditor.tags = function(val) {
96425                 if (!arguments.length) return _tags;
96426                 _tags = val;
96427                 // Don't reset _fieldsArr here.
96428                 return presetEditor;
96429             };
96430
96431
96432             presetEditor.entityID = function(val) {
96433                 if (!arguments.length) return _entityID;
96434                 if (_entityID === val) return presetEditor;
96435                 _entityID = val;
96436                 _fieldsArr = null;
96437                 return presetEditor;
96438             };
96439
96440
96441             return utilRebind(presetEditor, dispatch$1, 'on');
96442         }
96443
96444         function uiEntityIssues(context) {
96445             var _selection = d3_select(null);
96446             var _activeIssueID;
96447             var _entityID;
96448
96449             // Refresh on validated events
96450             context.validator()
96451                 .on('validated.entity_issues', function() {
96452                      _selection.selectAll('.disclosure-wrap-entity_issues')
96453                          .call(render);
96454
96455                     update();
96456                 })
96457                 .on('focusedIssue.entity_issues', function(issue) {
96458                      makeActiveIssue(issue.id);
96459                 });
96460
96461
96462             function entityIssues(selection) {
96463                 _selection = selection;
96464
96465                 selection
96466                     .call(uiDisclosure(context, 'entity_issues', true)
96467                         .content(render)
96468                     );
96469
96470                 update();
96471             }
96472
96473             function getIssues() {
96474                 return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true });
96475             }
96476
96477             function makeActiveIssue(issueID) {
96478                 _activeIssueID = issueID;
96479                 _selection.selectAll('.issue-container')
96480                     .classed('active', function(d) { return d.id === _activeIssueID; });
96481             }
96482
96483             function update() {
96484
96485                 var issues = getIssues();
96486
96487                 _selection
96488                     .classed('hide', issues.length === 0);
96489
96490                 _selection.selectAll('.hide-toggle-entity_issues span')
96491                     .text(t('issues.list_title', { count: issues.length }));
96492             }
96493
96494
96495             function render(selection) {
96496                 var issues = getIssues();
96497                 _activeIssueID = issues.length > 0 ? issues[0].id : null;
96498
96499
96500                 var containers = selection.selectAll('.issue-container')
96501                     .data(issues, function(d) { return d.id; });
96502
96503                 // Exit
96504                 containers.exit()
96505                     .remove();
96506
96507                 // Enter
96508                 var containersEnter = containers.enter()
96509                     .append('div')
96510                     .attr('class', 'issue-container');
96511
96512
96513                 var itemsEnter = containersEnter
96514                     .append('div')
96515                     .attr('class', function(d) { return 'issue severity-' + d.severity; })
96516                     .on('mouseover.highlight', function(d) {
96517                         // don't hover-highlight the selected entity
96518                         var ids = d.entityIds
96519                             .filter(function(e) { return e !== _entityID; });
96520
96521                         utilHighlightEntities(ids, true, context);
96522                     })
96523                     .on('mouseout.highlight', function(d) {
96524                         var ids = d.entityIds
96525                             .filter(function(e) { return e !== _entityID; });
96526
96527                         utilHighlightEntities(ids, false, context);
96528                     });
96529
96530                 var labelsEnter = itemsEnter
96531                     .append('div')
96532                     .attr('class', 'issue-label')
96533                     .on('click', function(d) {
96534
96535                         makeActiveIssue(d.id); // expand only the clicked item
96536
96537                         var extent = d.extent(context.graph());
96538                         if (extent) {
96539                             var setZoom = Math.max(context.map().zoom(), 19);
96540                             context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
96541                         }
96542                     });
96543
96544                 var textEnter = labelsEnter
96545                     .append('span')
96546                     .attr('class', 'issue-text');
96547
96548                 textEnter
96549                     .append('span')
96550                     .attr('class', 'issue-icon')
96551                     .each(function(d) {
96552                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
96553                         d3_select(this)
96554                             .call(svgIcon(iconName));
96555                     });
96556
96557                 textEnter
96558                     .append('span')
96559                     .attr('class', 'issue-message');
96560
96561
96562                 var infoButton = labelsEnter
96563                     .append('button')
96564                     .attr('class', 'issue-info-button')
96565                     .attr('title', t('icons.information'))
96566                     .attr('tabindex', -1)
96567                     .call(svgIcon('#iD-icon-inspect'));
96568
96569                 infoButton
96570                     .on('click', function () {
96571                         event.stopPropagation();
96572                         event.preventDefault();
96573                         this.blur();    // avoid keeping focus on the button - #4641
96574
96575                         var container = d3_select(this.parentNode.parentNode.parentNode);
96576                         var info = container.selectAll('.issue-info');
96577                         var isExpanded = info.classed('expanded');
96578
96579                         if (isExpanded) {
96580                             info
96581                                 .transition()
96582                                 .duration(200)
96583                                 .style('max-height', '0px')
96584                                 .style('opacity', '0')
96585                                 .on('end', function () {
96586                                     info.classed('expanded', false);
96587                                 });
96588                         } else {
96589                             info
96590                                 .classed('expanded', true)
96591                                 .transition()
96592                                 .duration(200)
96593                                 .style('max-height', '200px')
96594                                 .style('opacity', '1')
96595                                 .on('end', function () {
96596                                     info.style('max-height', null);
96597                                 });
96598                         }
96599                     });
96600
96601                 itemsEnter
96602                     .append('ul')
96603                     .attr('class', 'issue-fix-list');
96604
96605                 containersEnter
96606                     .append('div')
96607                     .attr('class', 'issue-info')
96608                     .style('max-height', '0')
96609                     .style('opacity', '0')
96610                     .each(function(d) {
96611                         if (typeof d.reference === 'function') {
96612                             d3_select(this)
96613                                 .call(d.reference);
96614                         } else {
96615                             d3_select(this)
96616                                 .text(t('inspector.no_documentation_key'));
96617                         }
96618                     });
96619
96620
96621                 // Update
96622                 containers = containers
96623                     .merge(containersEnter)
96624                     .classed('active', function(d) { return d.id === _activeIssueID; });
96625
96626                 containers.selectAll('.issue-message')
96627                     .text(function(d) {
96628                         return d.message(context);
96629                     });
96630
96631                 // fixes
96632                 var fixLists = containers.selectAll('.issue-fix-list');
96633
96634                 var fixes = fixLists.selectAll('.issue-fix-item')
96635                     .data(function(d) { return d.fixes ? d.fixes : []; });
96636
96637                 var fixesEnter = fixes.enter()
96638                     .append('li')
96639                     .attr('class', function(d) {
96640                         return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
96641                     })
96642                     .on('click', function(d) {
96643                         // not all fixes are actionable
96644                         if (!d.onClick) return;
96645
96646                         // Don't run another fix for this issue within a second of running one
96647                         // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
96648                         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
96649                         d.issue.dateLastRanFix = new Date();
96650
96651                         // remove hover-highlighting
96652                         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
96653
96654                         new Promise(function(resolve, reject) {
96655                             d.onClick(context, resolve, reject);
96656                             if (d.onClick.length <= 1) {
96657                                 // if the fix doesn't take any completion parameters then consider it resolved
96658                                 resolve();
96659                             }
96660                         })
96661                         .then(function() {
96662                             // revalidate whenever the fix has finished running successfully
96663                             context.validator().validate();
96664                         });
96665                     })
96666                     .on('mouseover.highlight', function(d) {
96667                         utilHighlightEntities(d.entityIds, true, context);
96668                     })
96669                     .on('mouseout.highlight', function(d) {
96670                         utilHighlightEntities(d.entityIds, false, context);
96671                     });
96672
96673                 fixesEnter
96674                     .append('span')
96675                     .attr('class', 'fix-icon')
96676                     .each(function(d) {
96677                         var iconName = d.icon || 'iD-icon-wrench';
96678                         if (iconName.startsWith('maki')) {
96679                             iconName += '-15';
96680                         }
96681                         d3_select(this).call(svgIcon('#' + iconName));
96682                     });
96683
96684                 fixesEnter
96685                     .append('span')
96686                     .attr('class', 'fix-message')
96687                     .text(function(d) { return d.title; });
96688             }
96689
96690
96691             entityIssues.entityID = function(val) {
96692                 if (!arguments.length) return _entityID;
96693                 if (_entityID !== val) {
96694                     _entityID = val;
96695                     _activeIssueID = null;
96696                 }
96697                 return entityIssues;
96698             };
96699
96700
96701             return entityIssues;
96702         }
96703
96704         function uiEntityEditor(context) {
96705             var dispatch$1 = dispatch('choose');
96706             var _state = 'select';
96707             var _coalesceChanges = false;
96708             var _modified = false;
96709             var _scrolled = false;
96710             var _base;
96711             var _entityID;
96712             var _activePreset;
96713             var _tagReference;
96714             var _presetFavorite;
96715
96716             var entityIssues = uiEntityIssues(context);
96717             var quickLinks = uiQuickLinks();
96718             var presetEditor = uiPresetEditor(context).on('change', changeTags);
96719             var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
96720             var rawMemberEditor = uiRawMemberEditor(context);
96721             var rawMembershipEditor = uiRawMembershipEditor(context);
96722
96723             function entityEditor(selection) {
96724                 var entity = context.entity(_entityID);
96725                 var tags = Object.assign({}, entity.tags);  // shallow copy
96726
96727                 // Header
96728                 var header = selection.selectAll('.header')
96729                     .data([0]);
96730
96731                 // Enter
96732                 var headerEnter = header.enter()
96733                     .append('div')
96734                     .attr('class', 'header fillL cf');
96735
96736                 headerEnter
96737                     .append('button')
96738                     .attr('class', 'fl preset-reset preset-choose')
96739                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
96740
96741                 headerEnter
96742                     .append('button')
96743                     .attr('class', 'fr preset-close')
96744                     .on('click', function() { context.enter(modeBrowse(context)); })
96745                     .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96746
96747                 headerEnter
96748                     .append('h3')
96749                     .text(t('inspector.edit'));
96750
96751                 // Update
96752                 header = header
96753                     .merge(headerEnter);
96754
96755                 header.selectAll('.preset-reset')
96756                     .on('click', function() {
96757                         dispatch$1.call('choose', this, _activePreset);
96758                     });
96759
96760
96761                 // Body
96762                 var body = selection.selectAll('.inspector-body')
96763                     .data([0]);
96764
96765                 // Enter
96766                 var bodyEnter = body.enter()
96767                     .append('div')
96768                     .attr('class', 'inspector-body')
96769                     .on('scroll.entity-editor', function() { _scrolled = true; });
96770
96771                 bodyEnter
96772                     .append('div')
96773                     .attr('class', 'preset-list-item inspector-inner')
96774                     .append('div')
96775                     .attr('class', 'preset-list-button-wrap')
96776                     .append('button')
96777                     .attr('class', 'preset-list-button preset-reset')
96778                     .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
96779                     .append('div')
96780                     .attr('class', 'label')
96781                     .append('div')
96782                     .attr('class', 'label-inner');
96783
96784                 bodyEnter
96785                     .append('div')
96786                     .attr('class', 'preset-quick-links');
96787
96788                 bodyEnter
96789                     .append('div')
96790                     .attr('class', 'entity-issues');
96791
96792                 bodyEnter
96793                     .append('div')
96794                     .attr('class', 'preset-editor');
96795
96796                 bodyEnter
96797                     .append('div')
96798                     .attr('class', 'raw-tag-editor inspector-inner');
96799
96800                 bodyEnter
96801                     .append('div')
96802                     .attr('class', 'raw-member-editor inspector-inner');
96803
96804                 bodyEnter
96805                     .append('div')
96806                     .attr('class', 'raw-membership-editor inspector-inner');
96807
96808                 bodyEnter
96809                     .append('input')
96810                     .attr('type', 'text')
96811                     .attr('class', 'key-trap');
96812
96813
96814                 // Update
96815                 body = body
96816                     .merge(bodyEnter);
96817
96818                 if (_presetFavorite) {
96819                     body.selectAll('.preset-list-button-wrap')
96820                         .call(_presetFavorite.button);
96821                 }
96822
96823                 // update header
96824                 if (_tagReference) {
96825                     body.selectAll('.preset-list-button-wrap')
96826                         .call(_tagReference.button);
96827
96828                     body.selectAll('.preset-list-item')
96829                         .call(_tagReference.body);
96830                 }
96831
96832                 body.selectAll('.preset-reset')
96833                     .on('click', function() {
96834                         dispatch$1.call('choose', this, _activePreset);
96835                     });
96836
96837                 body.select('.preset-list-item button')
96838                     .call(uiPresetIcon(context)
96839                         .geometry(context.geometry(_entityID))
96840                         .preset(_activePreset)
96841                     );
96842
96843                 // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
96844                 var label = body.select('.label-inner');
96845                 var nameparts = label.selectAll('.namepart')
96846                     .data(_activePreset.name().split(' – '), function(d) { return d; });
96847
96848                 nameparts.exit()
96849                     .remove();
96850
96851                 nameparts
96852                     .enter()
96853                     .append('div')
96854                     .attr('class', 'namepart')
96855                     .text(function(d) { return d; });
96856
96857                 // update quick links
96858                 var choices = [{
96859                     id: 'zoom_to',
96860                     label: 'inspector.zoom_to.title',
96861                     tooltip: function() {
96862                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
96863                     },
96864                     click: function zoomTo() {
96865                         context.mode().zoomToSelected();
96866                     }
96867                 }];
96868
96869                 body.select('.preset-quick-links')
96870                     .call(quickLinks.choices(choices));
96871
96872
96873                 // update editor sections
96874                 body.select('.entity-issues')
96875                     .call(entityIssues
96876                         .entityID(_entityID)
96877                     );
96878
96879                 body.select('.preset-editor')
96880                     .call(presetEditor
96881                         .preset(_activePreset)
96882                         .entityID(_entityID)
96883                         .tags(tags)
96884                         .state(_state)
96885                     );
96886
96887                 body.select('.raw-tag-editor')
96888                     .call(rawTagEditor
96889                         .preset(_activePreset)
96890                         .entityID(_entityID)
96891                         .tags(tags)
96892                         .state(_state)
96893                     );
96894
96895                 if (entity.type === 'relation') {
96896                     body.select('.raw-member-editor')
96897                         .style('display', 'block')
96898                         .call(rawMemberEditor
96899                             .entityID(_entityID)
96900                         );
96901                 } else {
96902                     body.select('.raw-member-editor')
96903                         .style('display', 'none');
96904                 }
96905
96906                 body.select('.raw-membership-editor')
96907                     .call(rawMembershipEditor
96908                         .entityID(_entityID)
96909                     );
96910
96911                 body.select('.key-trap')
96912                     .on('keydown.key-trap', function() {
96913                         // On tabbing, send focus back to the first field on the inspector-body
96914                         // (probably the `name` field) #4159
96915                         if (event.keyCode === 9 && !event.shiftKey) {
96916                             event.preventDefault();
96917                             body.select('input').node().focus();
96918                         }
96919                     });
96920
96921                 context.history()
96922                     .on('change.entity-editor', historyChanged);
96923
96924
96925                 function historyChanged(difference) {
96926                     if (_state === 'hide') return;
96927                     var significant = !difference ||
96928                             difference.didChange.properties ||
96929                             difference.didChange.addition ||
96930                             difference.didChange.deletion;
96931                     if (!significant) return;
96932
96933                     var entity = context.hasEntity(_entityID);
96934                     var graph = context.graph();
96935                     if (!entity) return;
96936
96937                     var match = context.presets().match(entity, graph);
96938                     var activePreset = entityEditor.preset();
96939                     var weakPreset = activePreset &&
96940                         Object.keys(activePreset.addTags || {}).length === 0;
96941
96942                     // A "weak" preset doesn't set any tags. (e.g. "Address")
96943                     // Don't replace a weak preset with a fallback preset (e.g. "Point")
96944                     if (!(weakPreset && match.isFallback())) {
96945                         entityEditor.preset(match);
96946                     }
96947                     entityEditor.modified(_base !== graph);
96948                     entityEditor(selection);
96949                 }
96950             }
96951
96952
96953             // Tag changes that fire on input can all get coalesced into a single
96954             // history operation when the user leaves the field.  #2342
96955             function changeTags(changed, onInput) {
96956                 var entity = context.entity(_entityID);
96957                 var annotation = t('operations.change_tags.annotation');
96958                 var tags = Object.assign({}, entity.tags);   // shallow copy
96959
96960                 for (var k in changed) {
96961                     if (!k) continue;
96962                     var v = changed[k];
96963                     if (v !== undefined || tags.hasOwnProperty(k)) {
96964                         tags[k] = v;
96965                     }
96966                 }
96967
96968                 if (!onInput) {
96969                     tags = utilCleanTags(tags);
96970                 }
96971
96972                 if (!fastDeepEqual(entity.tags, tags)) {
96973                     if (_coalesceChanges) {
96974                         context.overwrite(actionChangeTags(_entityID, tags), annotation);
96975                     } else {
96976                         context.perform(actionChangeTags(_entityID, tags), annotation);
96977                         _coalesceChanges = !!onInput;
96978                     }
96979                 }
96980
96981                 // if leaving field (blur event), rerun validation
96982                 if (!onInput) {
96983                     context.validator().validate();
96984                 }
96985             }
96986
96987
96988             entityEditor.modified = function(val) {
96989                 if (!arguments.length) return _modified;
96990                 _modified = val;
96991                 d3_selectAll('button.preset-close use')
96992                     .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96993                 return entityEditor;
96994             };
96995
96996
96997             entityEditor.state = function(val) {
96998                 if (!arguments.length) return _state;
96999                 _state = val;
97000                 return entityEditor;
97001             };
97002
97003
97004             entityEditor.entityID = function(val) {
97005                 if (!arguments.length) return _entityID;
97006                 if (_entityID === val) return entityEditor;  // exit early if no change
97007
97008                 _entityID = val;
97009                 _base = context.graph();
97010                 _coalesceChanges = false;
97011
97012                 // reset the scroll to the top of the inspector (warning: triggers reflow)
97013                 if (_scrolled) {
97014                     window.requestIdleCallback(function() {
97015                         var body = d3_selectAll('.entity-editor-pane .inspector-body');
97016                         if (!body.empty()) {
97017                             _scrolled = false;
97018                             body.node().scrollTop = 0;
97019                         }
97020                     });
97021                 }
97022
97023                 var presetMatch = context.presets().match(context.entity(_entityID), _base);
97024
97025                 return entityEditor
97026                     .preset(presetMatch)
97027                     .modified(false);
97028             };
97029
97030
97031             entityEditor.preset = function(val) {
97032                 if (!arguments.length) return _activePreset;
97033                 if (val !== _activePreset) {
97034                     _activePreset = val;
97035                     _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)))
97036                         .showing(false);
97037                 }
97038                 _presetFavorite = uiPresetFavoriteButton(_activePreset, context.geometry(_entityID), context);
97039                 return entityEditor;
97040             };
97041
97042
97043             return utilRebind(entityEditor, dispatch$1, 'on');
97044         }
97045
97046         function uiPresetList(context) {
97047             var dispatch$1 = dispatch('choose');
97048             var _entityID;
97049             var _currentPreset;
97050             var _autofocus = false;
97051             var geocoder = services$1.geocoder;
97052
97053
97054             function presetList(selection) {
97055                 var entity = context.entity(_entityID);
97056                 var geometry = context.geometry(_entityID);
97057
97058                 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
97059                 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
97060                     geometry = 'point';
97061                 }
97062
97063                 var presets = context.presets().matchGeometry(geometry);
97064
97065                 selection.html('');
97066
97067                 var messagewrap = selection
97068                     .append('div')
97069                     .attr('class', 'header fillL');
97070
97071                 var message = messagewrap
97072                     .append('h3')
97073                     .text(t('inspector.choose'));
97074
97075                 messagewrap
97076                     .append('button')
97077                     .attr('class', 'preset-choose')
97078                     .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
97079                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
97080
97081                 function initialKeydown() {
97082                     // hack to let delete shortcut work when search is autofocused
97083                     if (search.property('value').length === 0 &&
97084                         (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
97085                          event.keyCode === utilKeybinding.keyCodes['⌦'])) {
97086                         event.preventDefault();
97087                         event.stopPropagation();
97088                         operationDelete([_entityID], context)();
97089
97090                     // hack to let undo work when search is autofocused
97091                     } else if (search.property('value').length === 0 &&
97092                         (event.ctrlKey || event.metaKey) &&
97093                         event.keyCode === utilKeybinding.keyCodes.z) {
97094                         event.preventDefault();
97095                         event.stopPropagation();
97096                         context.undo();
97097                     } else if (!event.ctrlKey && !event.metaKey) {
97098                         // don't check for delete/undo hack on future keydown events
97099                         d3_select(this).on('keydown', keydown);
97100                         keydown.call(this);
97101                     }
97102                 }
97103
97104                 function keydown() {
97105                     // down arrow
97106                     if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
97107                         // if insertion point is at the end of the string
97108                         search.node().selectionStart === search.property('value').length) {
97109                         event.preventDefault();
97110                         event.stopPropagation();
97111                         // move focus to the first item in the preset list
97112                         var buttons = list.selectAll('.preset-list-button');
97113                         if (!buttons.empty()) buttons.nodes()[0].focus();
97114                     }
97115                 }
97116
97117                 function keypress() {
97118                     // enter
97119                     var value = search.property('value');
97120                     if (event.keyCode === 13 && value.length) {
97121                         list.selectAll('.preset-list-item:first-child')
97122                             .each(function(d) { d.choose.call(this); });
97123                     }
97124                 }
97125
97126                 function inputevent() {
97127                     var value = search.property('value');
97128                     list.classed('filtered', value.length);
97129                     if (value.length) {
97130                         var entity = context.entity(_entityID);
97131                         if (geocoder && entity) {
97132                             var center = entity.extent(context.graph()).center();
97133                             geocoder.countryCode(center, function countryCallback(err, countryCode) {
97134                                 // get the input value again because it may have changed
97135                                 var currentValue = search.property('value');
97136
97137                                 if (!currentValue.length) return;
97138
97139                                 var results;
97140                                 if (!err && countryCode) {
97141                                     countryCode = countryCode.toLowerCase();
97142                                     results = presets.search(currentValue, geometry, countryCode);
97143                                 } else {
97144                                     results = presets.search(currentValue, geometry);
97145                                 }
97146                                 message.text(t('inspector.results', {
97147                                     n: results.collection.length,
97148                                     search: currentValue
97149                                 }));
97150                                 list.call(drawList, results);
97151                             });
97152                         }
97153                     } else {
97154                         list.call(drawList, context.presets().defaults(geometry, 36));
97155                         message.text(t('inspector.choose'));
97156                     }
97157                 }
97158
97159                 var searchWrap = selection
97160                     .append('div')
97161                     .attr('class', 'search-header');
97162
97163                 var search = searchWrap
97164                     .append('input')
97165                     .attr('class', 'preset-search-input')
97166                     .attr('placeholder', t('inspector.search'))
97167                     .attr('type', 'search')
97168                     .call(utilNoAuto)
97169                     .on('keydown', initialKeydown)
97170                     .on('keypress', keypress)
97171                     .on('input', inputevent);
97172
97173                 searchWrap
97174                     .call(svgIcon('#iD-icon-search', 'pre-text'));
97175
97176                 if (_autofocus) {
97177                     search.node().focus();
97178                 }
97179
97180                 var listWrap = selection
97181                     .append('div')
97182                     .attr('class', 'inspector-body');
97183
97184                 var list = listWrap
97185                     .append('div')
97186                     .attr('class', 'preset-list fillL cf')
97187                     .call(drawList, context.presets().defaults(geometry, 36));
97188
97189                 context.features().on('change.preset-list', updateForFeatureHiddenState);
97190             }
97191
97192
97193             function drawList(list, presets) {
97194                 var collection = presets.collection.reduce(function(collection, preset) {
97195                     if (preset.members) {
97196                         collection.push(CategoryItem(preset));
97197                     } else if (preset.visible()) {
97198                         collection.push(PresetItem(preset));
97199                     }
97200                     return collection;
97201                 }, []);
97202
97203                 var items = list.selectAll('.preset-list-item')
97204                     .data(collection, function(d) { return d.preset.id; });
97205
97206                 items.order();
97207
97208                 items.exit()
97209                     .remove();
97210
97211                 items.enter()
97212                     .append('div')
97213                     .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
97214                     .classed('current', function(item) { return item.preset === _currentPreset; })
97215                     .each(function(item) { d3_select(this).call(item); })
97216                     .style('opacity', 0)
97217                     .transition()
97218                     .style('opacity', 1);
97219
97220                 updateForFeatureHiddenState();
97221             }
97222
97223             function itemKeydown(){
97224                 // the actively focused item
97225                 var item = d3_select(this.closest('.preset-list-item'));
97226                 var parentItem = d3_select(item.node().parentNode.closest('.preset-list-item'));
97227
97228                 // arrow down, move focus to the next, lower item
97229                 if (event.keyCode === utilKeybinding.keyCodes['↓']) {
97230                     event.preventDefault();
97231                     event.stopPropagation();
97232                     // the next item in the list at the same level
97233                     var nextItem = d3_select(item.node().nextElementSibling);
97234                     // if there is no next item in this list
97235                     if (nextItem.empty()) {
97236                         // if there is a parent item
97237                         if (!parentItem.empty()) {
97238                             // the item is the last item of a sublist,
97239                             // select the next item at the parent level
97240                             nextItem = d3_select(parentItem.node().nextElementSibling);
97241                         }
97242                     // if the focused item is expanded
97243                     } else if (d3_select(this).classed('expanded')) {
97244                         // select the first subitem instead
97245                         nextItem = item.select('.subgrid .preset-list-item:first-child');
97246                     }
97247                     if (!nextItem.empty()) {
97248                         // focus on the next item
97249                         nextItem.select('.preset-list-button').node().focus();
97250                     }
97251
97252                 // arrow up, move focus to the previous, higher item
97253                 } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
97254                     event.preventDefault();
97255                     event.stopPropagation();
97256                     // the previous item in the list at the same level
97257                     var previousItem = d3_select(item.node().previousElementSibling);
97258
97259                     // if there is no previous item in this list
97260                     if (previousItem.empty()) {
97261                         // if there is a parent item
97262                         if (!parentItem.empty()) {
97263                             // the item is the first subitem of a sublist select the parent item
97264                             previousItem = parentItem;
97265                         }
97266                     // if the previous item is expanded
97267                     } else if (previousItem.select('.preset-list-button').classed('expanded')) {
97268                         // select the last subitem of the sublist of the previous item
97269                         previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
97270                     }
97271
97272                     if (!previousItem.empty()) {
97273                         // focus on the previous item
97274                         previousItem.select('.preset-list-button').node().focus();
97275                     } else {
97276                         // the focus is at the top of the list, move focus back to the search field
97277                         var search = d3_select(this.closest('.preset-list-pane')).select('.preset-search-input');
97278                         search.node().focus();
97279                     }
97280
97281                 // arrow left, move focus to the parent item if there is one
97282                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97283                     event.preventDefault();
97284                     event.stopPropagation();
97285                     // if there is a parent item, focus on the parent item
97286                     if (!parentItem.empty()) {
97287                         parentItem.select('.preset-list-button').node().focus();
97288                     }
97289
97290                 // arrow right, choose this item
97291                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97292                     event.preventDefault();
97293                     event.stopPropagation();
97294                     item.datum().choose.call(d3_select(this).node());
97295                 }
97296             }
97297
97298
97299             function CategoryItem(preset) {
97300                 var box, sublist, shown = false;
97301
97302                 function item(selection) {
97303                     var wrap = selection.append('div')
97304                         .attr('class', 'preset-list-button-wrap category');
97305
97306                     function click() {
97307                         var isExpanded = d3_select(this).classed('expanded');
97308                         var iconName = isExpanded ?
97309                             (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
97310                         d3_select(this)
97311                             .classed('expanded', !isExpanded);
97312                         d3_select(this).selectAll('div.label-inner svg.icon use')
97313                             .attr('href', iconName);
97314                         item.choose();
97315                     }
97316
97317                     var button = wrap
97318                         .append('button')
97319                         .attr('class', 'preset-list-button')
97320                         .classed('expanded', false)
97321                         .call(uiPresetIcon(context)
97322                             .geometry(context.geometry(_entityID))
97323                             .preset(preset))
97324                         .on('click', click)
97325                         .on('keydown', function() {
97326                             // right arrow, expand the focused item
97327                             if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97328                                 event.preventDefault();
97329                                 event.stopPropagation();
97330                                 // if the item isn't expanded
97331                                 if (!d3_select(this).classed('expanded')) {
97332                                     // toggle expansion (expand the item)
97333                                     click.call(this);
97334                                 }
97335                             // left arrow, collapse the focused item
97336                             } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97337                                 event.preventDefault();
97338                                 event.stopPropagation();
97339                                 // if the item is expanded
97340                                 if (d3_select(this).classed('expanded')) {
97341                                     // toggle expansion (collapse the item)
97342                                     click.call(this);
97343                                 }
97344                             } else {
97345                                 itemKeydown.call(this);
97346                             }
97347                         });
97348
97349                     var label = button
97350                         .append('div')
97351                         .attr('class', 'label')
97352                         .append('div')
97353                         .attr('class', 'label-inner');
97354
97355                     label
97356                         .append('div')
97357                         .attr('class', 'namepart')
97358                         .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
97359                         .append('span')
97360                         .html(function() { return preset.name() + '&hellip;'; });
97361
97362                     box = selection.append('div')
97363                         .attr('class', 'subgrid')
97364                         .style('max-height', '0px')
97365                         .style('opacity', 0);
97366
97367                     box.append('div')
97368                         .attr('class', 'arrow');
97369
97370                     sublist = box.append('div')
97371                         .attr('class', 'preset-list fillL3');
97372                 }
97373
97374
97375                 item.choose = function() {
97376                     if (!box || !sublist) return;
97377
97378                     if (shown) {
97379                         shown = false;
97380                         box.transition()
97381                             .duration(200)
97382                             .style('opacity', '0')
97383                             .style('max-height', '0px')
97384                             .style('padding-bottom', '0px');
97385                     } else {
97386                         shown = true;
97387                         var members = preset.members.matchGeometry(context.geometry(_entityID));
97388                         sublist.call(drawList, members);
97389                         box.transition()
97390                             .duration(200)
97391                             .style('opacity', '1')
97392                             .style('max-height', 200 + members.collection.length * 190 + 'px')
97393                             .style('padding-bottom', '10px');
97394                     }
97395                 };
97396
97397                 item.preset = preset;
97398                 return item;
97399             }
97400
97401
97402             function PresetItem(preset) {
97403                 function item(selection) {
97404                     var wrap = selection.append('div')
97405                         .attr('class', 'preset-list-button-wrap');
97406
97407                     var button = wrap.append('button')
97408                         .attr('class', 'preset-list-button')
97409                         .call(uiPresetIcon(context)
97410                             .geometry(context.geometry(_entityID))
97411                             .preset(preset))
97412                         .on('click', item.choose)
97413                         .on('keydown', itemKeydown);
97414
97415                     var label = button
97416                         .append('div')
97417                         .attr('class', 'label')
97418                         .append('div')
97419                         .attr('class', 'label-inner');
97420
97421                     // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
97422                     label.selectAll('.namepart')
97423                         .data(preset.name().split(' – '))
97424                         .enter()
97425                         .append('div')
97426                         .attr('class', 'namepart')
97427                         .text(function(d) { return d; });
97428
97429                     wrap.call(item.reference.button);
97430                     selection.call(item.reference.body);
97431                 }
97432
97433                 item.choose = function() {
97434                     if (d3_select(this).classed('disabled')) return;
97435
97436                     context.presets().setMostRecent(preset, context.geometry(_entityID));
97437                     context.perform(
97438                         actionChangePreset(_entityID, _currentPreset, preset),
97439                         t('operations.change_tags.annotation')
97440                     );
97441
97442                     context.validator().validate();  // rerun validation
97443                     dispatch$1.call('choose', this, preset);
97444                 };
97445
97446                 item.help = function() {
97447                     event.stopPropagation();
97448                     item.reference.toggle();
97449                 };
97450
97451                 item.preset = preset;
97452                 item.reference = uiTagReference(preset.reference(context.geometry(_entityID)));
97453
97454                 return item;
97455             }
97456
97457
97458             function updateForFeatureHiddenState() {
97459                 if (!context.hasEntity(_entityID)) return;
97460
97461                 var geometry = context.geometry(_entityID);
97462                 var button = d3_selectAll('.preset-list .preset-list-button');
97463
97464                 // remove existing tooltips
97465                 button.call(tooltip().destroyAny);
97466
97467                 button.each(function(item, index) {
97468                     var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
97469                     var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
97470
97471                     d3_select(this)
97472                         .classed('disabled', isHiddenPreset);
97473
97474                     if (isHiddenPreset) {
97475                         var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
97476                         var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
97477                         var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
97478                         d3_select(this).call(tooltip()
97479                             .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
97480                             .placement(index < 2 ? 'bottom' : 'top')
97481                         );
97482                     }
97483                 });
97484             }
97485
97486             presetList.autofocus = function(val) {
97487                 if (!arguments.length) return _autofocus;
97488                 _autofocus = val;
97489                 return presetList;
97490             };
97491
97492
97493             presetList.entityID = function(val) {
97494                 if (!arguments.length) return _entityID;
97495                 _entityID = val;
97496                 presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
97497                 return presetList;
97498             };
97499
97500
97501             presetList.preset = function(val) {
97502                 if (!arguments.length) return _currentPreset;
97503                 _currentPreset = val;
97504                 return presetList;
97505             };
97506
97507
97508             return utilRebind(presetList, dispatch$1, 'on');
97509         }
97510
97511         function uiInspector(context) {
97512             var presetList = uiPresetList(context);
97513             var entityEditor = uiEntityEditor(context);
97514             var wrap = d3_select(null),
97515                 presetPane = d3_select(null),
97516                 editorPane = d3_select(null);
97517             var _state = 'select';
97518             var _entityID;
97519             var _newFeature = false;
97520
97521
97522             function inspector(selection, newFeature) {
97523                 presetList
97524                     .entityID(_entityID)
97525                     .autofocus(_newFeature)
97526                     .on('choose', inspector.setPreset);
97527
97528                 entityEditor
97529                     .state(_state)
97530                     .entityID(_entityID)
97531                     .on('choose', inspector.showList);
97532
97533                 wrap = selection.selectAll('.panewrap')
97534                     .data([0]);
97535
97536                 var enter = wrap.enter()
97537                     .append('div')
97538                     .attr('class', 'panewrap');
97539
97540                 enter
97541                     .append('div')
97542                     .attr('class', 'preset-list-pane pane');
97543
97544                 enter
97545                     .append('div')
97546                     .attr('class', 'entity-editor-pane pane');
97547
97548                 wrap = wrap.merge(enter);
97549                 presetPane = wrap.selectAll('.preset-list-pane');
97550                 editorPane = wrap.selectAll('.entity-editor-pane');
97551
97552                 var entity = context.entity(_entityID);
97553
97554                 var hasNonGeometryTags = entity.hasNonGeometryTags();
97555                 var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
97556                     (!hasNonGeometryTags && !entity.isHighwayIntersection(context.graph()));
97557                 var issues = context.validator().getEntityIssues(_entityID);
97558                 // start with the preset list if the feature is new and untagged or is an uninteresting vertex
97559                 var showPresetList = (newFeature && !hasNonGeometryTags) || (isTaglessOrIntersectionVertex && !issues.length);
97560
97561                 if (showPresetList) {
97562                     wrap.style('right', '-100%');
97563                     presetPane.call(presetList);
97564                 } else {
97565                     wrap.style('right', '0%');
97566                     editorPane.call(entityEditor);
97567                 }
97568
97569                 var footer = selection.selectAll('.footer')
97570                     .data([0]);
97571
97572                 footer = footer.enter()
97573                     .append('div')
97574                     .attr('class', 'footer')
97575                     .merge(footer);
97576
97577                 footer
97578                     .call(uiViewOnOSM(context)
97579                         .what(context.hasEntity(_entityID))
97580                     );
97581             }
97582
97583             inspector.showList = function(preset) {
97584                 wrap.transition()
97585                     .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
97586
97587                 presetPane
97588                     .call(presetList.preset(preset).autofocus(true));
97589             };
97590
97591             inspector.setPreset = function(preset) {
97592
97593                 // upon setting multipolygon, go to the area preset list instead of the editor
97594                 if (preset.id === 'type/multipolygon') {
97595                     presetPane
97596                         .call(presetList.preset(preset).autofocus(true));
97597
97598                 } else {
97599                     wrap.transition()
97600                         .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
97601
97602                     editorPane
97603                         .call(entityEditor.preset(preset));
97604                 }
97605
97606             };
97607
97608             inspector.state = function(val) {
97609                 if (!arguments.length) return _state;
97610                 _state = val;
97611                 entityEditor.state(_state);
97612
97613                 // remove any old field help overlay that might have gotten attached to the inspector
97614                 d3_selectAll('.field-help-body').remove();
97615
97616                 return inspector;
97617             };
97618
97619
97620             inspector.entityID = function(val) {
97621                 if (!arguments.length) return _entityID;
97622                 _entityID = val;
97623                 return inspector;
97624             };
97625
97626
97627             inspector.newFeature = function(val) {
97628                 if (!arguments.length) return _newFeature;
97629                 _newFeature = val;
97630                 return inspector;
97631             };
97632
97633
97634             return inspector;
97635         }
97636
97637         function uiSidebar(context) {
97638             var inspector = uiInspector(context);
97639             var dataEditor = uiDataEditor(context);
97640             var noteEditor = uiNoteEditor(context);
97641             var improveOsmEditor = uiImproveOsmEditor(context);
97642             var keepRightEditor = uiKeepRightEditor(context);
97643             var _current;
97644             var _wasData = false;
97645             var _wasNote = false;
97646             var _wasQAError = false;
97647
97648
97649             function sidebar(selection) {
97650                 var container = d3_select('#id-container');
97651                 var minWidth = 280;
97652                 var sidebarWidth;
97653                 var containerWidth;
97654                 var dragOffset;
97655
97656                 var resizer = selection
97657                     .append('div')
97658                     .attr('id', 'sidebar-resizer');
97659
97660                 // Set the initial width constraints
97661                 selection
97662                     .style('min-width', minWidth + 'px')
97663                     .style('max-width', '400px')
97664                     .style('width', '33.3333%');
97665
97666                 resizer.call(d3_drag()
97667                     .container(container.node())
97668                     .on('start', function() {
97669                         // offset from edge of sidebar-resizer
97670                         dragOffset = event.sourceEvent.offsetX - 1;
97671
97672                         sidebarWidth = selection.node().getBoundingClientRect().width;
97673                         containerWidth = container.node().getBoundingClientRect().width;
97674                         var widthPct = (sidebarWidth / containerWidth) * 100;
97675                         selection
97676                             .style('width', widthPct + '%')    // lock in current width
97677                             .style('max-width', '85%');        // but allow larger widths
97678
97679                         resizer.classed('dragging', true);
97680                     })
97681                     .on('drag', function() {
97682                         var isRTL = (textDirection === 'rtl');
97683                         var scaleX = isRTL ? 0 : 1;
97684                         var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97685
97686                         var x = event.x - dragOffset;
97687                         sidebarWidth = isRTL ? containerWidth - x : x;
97688
97689                         var isCollapsed = selection.classed('collapsed');
97690                         var shouldCollapse = sidebarWidth < minWidth;
97691
97692                         selection.classed('collapsed', shouldCollapse);
97693
97694                         if (shouldCollapse) {
97695                             if (!isCollapsed) {
97696                                 selection
97697                                     .style(xMarginProperty, '-400px')
97698                                     .style('width', '400px');
97699
97700                                 context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
97701                             }
97702
97703                         } else {
97704                             var widthPct = (sidebarWidth / containerWidth) * 100;
97705                             selection
97706                                 .style(xMarginProperty, null)
97707                                 .style('width', widthPct + '%');
97708
97709                             if (isCollapsed) {
97710                                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
97711                             } else {
97712                                 context.ui().onResize([-event.dx * scaleX, 0]);
97713                             }
97714                         }
97715                     })
97716                     .on('end', function() {
97717                         resizer.classed('dragging', false);
97718                     })
97719                 );
97720
97721                 var featureListWrap = selection
97722                     .append('div')
97723                     .attr('class', 'feature-list-pane')
97724                     .call(uiFeatureList(context));
97725
97726                 var inspectorWrap = selection
97727                     .append('div')
97728                     .attr('class', 'inspector-hidden inspector-wrap fr');
97729
97730
97731                 function hover(datum) {
97732                     if (datum && datum.__featurehash__) {   // hovering on data
97733                         _wasData = true;
97734                         sidebar
97735                             .show(dataEditor.datum(datum));
97736
97737                         selection.selectAll('.sidebar-component')
97738                             .classed('inspector-hover', true);
97739
97740                     } else if (datum instanceof osmNote) {
97741                         if (context.mode().id === 'drag-note') return;
97742                         _wasNote = true;
97743
97744                         var osm = services$1.osm;
97745                         if (osm) {
97746                             datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
97747                         }
97748
97749                         sidebar
97750                             .show(noteEditor.note(datum));
97751
97752                         selection.selectAll('.sidebar-component')
97753                             .classed('inspector-hover', true);
97754
97755                     } else if (datum instanceof qaError) {
97756                         _wasQAError = true;
97757
97758                         var errService = services$1[datum.service];
97759                         if (errService) {
97760                             // marker may contain stale data - get latest
97761                             datum = errService.getError(datum.id);
97762                         }
97763
97764                         // Temporary solution while only two services
97765                         var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
97766
97767                         d3_selectAll('.qa_error.' + datum.service)
97768                             .classed('hover', function(d) { return d.id === datum.id; });
97769
97770                         sidebar
97771                             .show(errEditor.error(datum));
97772
97773                         selection.selectAll('.sidebar-component')
97774                             .classed('inspector-hover', true);
97775
97776                     } else if (!_current && (datum instanceof osmEntity)) {
97777                         featureListWrap
97778                             .classed('inspector-hidden', true);
97779
97780                         inspectorWrap
97781                             .classed('inspector-hidden', false)
97782                             .classed('inspector-hover', true);
97783
97784                         if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
97785                             inspector
97786                                 .state('hover')
97787                                 .entityID(datum.id);
97788
97789                             inspectorWrap
97790                                 .call(inspector);
97791                         }
97792
97793                     } else if (!_current) {
97794                         featureListWrap
97795                             .classed('inspector-hidden', false);
97796                         inspectorWrap
97797                             .classed('inspector-hidden', true);
97798                         inspector
97799                             .state('hide');
97800
97801                     } else if (_wasData || _wasNote || _wasQAError) {
97802                         _wasNote = false;
97803                         _wasData = false;
97804                         _wasQAError = false;
97805                         d3_selectAll('.note').classed('hover', false);
97806                         d3_selectAll('.qa_error').classed('hover', false);
97807                         sidebar.hide();
97808                     }
97809                 }
97810
97811                 sidebar.hover = throttle(hover, 200);
97812
97813
97814                 sidebar.intersects = function(extent) {
97815                     var rect = selection.node().getBoundingClientRect();
97816                     return extent.intersects([
97817                         context.projection.invert([0, rect.height]),
97818                         context.projection.invert([rect.width, 0])
97819                     ]);
97820                 };
97821
97822
97823                 sidebar.select = function(id, newFeature) {
97824                     sidebar.hide();
97825
97826                     if (id) {
97827                         var entity = context.entity(id);
97828                         // uncollapse the sidebar
97829                         if (selection.classed('collapsed')) {
97830                             if (newFeature) {
97831                                 var extent = entity.extent(context.graph());
97832                                 sidebar.expand(sidebar.intersects(extent));
97833                             }
97834                         }
97835
97836                         featureListWrap
97837                             .classed('inspector-hidden', true);
97838
97839                         inspectorWrap
97840                             .classed('inspector-hidden', false)
97841                             .classed('inspector-hover', false);
97842
97843                         if (inspector.entityID() !== id || inspector.state() !== 'select') {
97844                             inspector
97845                                 .state('select')
97846                                 .entityID(id)
97847                                 .newFeature(newFeature);
97848
97849                             inspectorWrap
97850                                 .call(inspector, newFeature);
97851                         }
97852
97853                         sidebar.showPresetList = function() {
97854                             inspector.showList(context.presets().match(entity, context.graph()));
97855                         };
97856
97857                     } else {
97858                         inspector
97859                             .state('hide');
97860                     }
97861                 };
97862
97863
97864                 sidebar.show = function(component, element) {
97865                     featureListWrap
97866                         .classed('inspector-hidden', true);
97867                     inspectorWrap
97868                         .classed('inspector-hidden', true);
97869
97870                     if (_current) _current.remove();
97871                     _current = selection
97872                         .append('div')
97873                         .attr('class', 'sidebar-component')
97874                         .call(component, element);
97875                 };
97876
97877
97878                 sidebar.hide = function() {
97879                     featureListWrap
97880                         .classed('inspector-hidden', false);
97881                     inspectorWrap
97882                         .classed('inspector-hidden', true);
97883
97884                     if (_current) _current.remove();
97885                     _current = null;
97886                 };
97887
97888
97889                 sidebar.expand = function(moveMap) {
97890                     if (selection.classed('collapsed')) {
97891                         sidebar.toggle(moveMap);
97892                     }
97893                 };
97894
97895
97896                 sidebar.collapse = function(moveMap) {
97897                     if (!selection.classed('collapsed')) {
97898                         sidebar.toggle(moveMap);
97899                     }
97900                 };
97901
97902
97903                 sidebar.toggle = function(moveMap) {
97904                     var e = event;
97905                     if (e && e.sourceEvent) {
97906                         e.sourceEvent.preventDefault();
97907                     } else if (e) {
97908                         e.preventDefault();
97909                     }
97910
97911                     // Don't allow sidebar to toggle when the user is in the walkthrough.
97912                     if (context.inIntro()) return;
97913
97914                     var isCollapsed = selection.classed('collapsed');
97915                     var isCollapsing = !isCollapsed;
97916                     var isRTL = (textDirection === 'rtl');
97917                     var scaleX = isRTL ? 0 : 1;
97918                     var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97919
97920                     sidebarWidth = selection.node().getBoundingClientRect().width;
97921
97922                     // switch from % to px
97923                     selection.style('width', sidebarWidth + 'px');
97924
97925                     var startMargin, endMargin, lastMargin;
97926                     if (isCollapsing) {
97927                         startMargin = lastMargin = 0;
97928                         endMargin = -sidebarWidth;
97929                     } else {
97930                         startMargin = lastMargin = -sidebarWidth;
97931                         endMargin = 0;
97932                     }
97933
97934                     selection.transition()
97935                         .style(xMarginProperty, endMargin + 'px')
97936                         .tween('panner', function() {
97937                             var i = d3_interpolateNumber(startMargin, endMargin);
97938                             return function(t) {
97939                                 var dx = lastMargin - Math.round(i(t));
97940                                 lastMargin = lastMargin - dx;
97941                                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
97942                             };
97943                         })
97944                         .on('end', function() {
97945                             selection.classed('collapsed', isCollapsing);
97946
97947                             // switch back from px to %
97948                             if (!isCollapsing) {
97949                                 var containerWidth = container.node().getBoundingClientRect().width;
97950                                 var widthPct = (sidebarWidth / containerWidth) * 100;
97951                                 selection
97952                                     .style(xMarginProperty, null)
97953                                     .style('width', widthPct + '%');
97954                             }
97955                         });
97956                 };
97957
97958                 // toggle the sidebar collapse when double-clicking the resizer
97959                 resizer.on('dblclick', sidebar.toggle);
97960             }
97961
97962             sidebar.showPresetList = function() {};
97963             sidebar.hover = function() {};
97964             sidebar.hover.cancel = function() {};
97965             sidebar.intersects = function() {};
97966             sidebar.select = function() {};
97967             sidebar.show = function() {};
97968             sidebar.hide = function() {};
97969             sidebar.expand = function() {};
97970             sidebar.collapse = function() {};
97971             sidebar.toggle = function() {};
97972
97973             return sidebar;
97974         }
97975
97976         function uiSpinner(context) {
97977             var osm = context.connection();
97978
97979
97980             return function(selection) {
97981                 var img = selection
97982                     .append('img')
97983                     .attr('src', context.imagePath('loader-black.gif'))
97984                     .style('opacity', 0);
97985
97986                 if (osm) {
97987                     osm
97988                         .on('loading.spinner', function() {
97989                             img.transition()
97990                                 .style('opacity', 1);
97991                         })
97992                         .on('loaded.spinner', function() {
97993                             img.transition()
97994                                 .style('opacity', 0);
97995                         });
97996                 }
97997             };
97998         }
97999
98000         function uiSplash(context) {
98001
98002             return function(selection) {
98003                 if (context.storage('sawSplash'))
98004                      return;
98005
98006                 context.storage('sawSplash', true);
98007
98008                 var modalSelection = uiModal(selection);
98009
98010                 modalSelection.select('.modal')
98011                     .attr('class', 'modal-splash modal');
98012
98013                 var introModal = modalSelection.select('.content')
98014                     .append('div')
98015                     .attr('class', 'fillL');
98016
98017                 introModal
98018                     .append('div')
98019                     .attr('class','modal-section')
98020                     .append('h3').text(t('splash.welcome'));
98021
98022                 introModal
98023                     .append('div')
98024                     .attr('class','modal-section')
98025                     .append('p')
98026                     .html(t('splash.text', {
98027                         version: context.version,
98028                         website: '<a href="http://ideditor.com/">ideditor.com</a>',
98029                         github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
98030                     }));
98031
98032                 var buttonWrap = introModal
98033                     .append('div')
98034                     .attr('class', 'modal-actions');
98035
98036                 var walkthrough = buttonWrap
98037                     .append('button')
98038                     .attr('class', 'walkthrough')
98039                     .on('click', function() {
98040                         context.container().call(uiIntro(context));
98041                         modalSelection.close();
98042                     });
98043
98044                 walkthrough
98045                     .append('svg')
98046                     .attr('class', 'logo logo-walkthrough')
98047                     .append('use')
98048                     .attr('xlink:href', '#iD-logo-walkthrough');
98049
98050                 walkthrough
98051                     .append('div')
98052                     .text(t('splash.walkthrough'));
98053
98054                 var startEditing = buttonWrap
98055                     .append('button')
98056                     .attr('class', 'start-editing')
98057                     .on('click', modalSelection.close);
98058
98059                 startEditing
98060                     .append('svg')
98061                     .attr('class', 'logo logo-features')
98062                     .append('use')
98063                     .attr('xlink:href', '#iD-logo-features');
98064
98065                 startEditing
98066                     .append('div')
98067                     .text(t('splash.start'));
98068
98069
98070                 modalSelection.select('button.close')
98071                     .attr('class','hide');
98072
98073             };
98074         }
98075
98076         function uiStatus(context) {
98077             var osm = context.connection();
98078
98079
98080             return function(selection) {
98081                 if (!osm) return;
98082
98083                 function update() {
98084                     osm.status(function(err, apiStatus) {
98085                         selection.html('');
98086
98087                         if (err) {
98088                             if (apiStatus === 'connectionSwitched') {
98089                                 // if the connection was just switched, we can't rely on
98090                                 // the status (we're getting the status of the previous api)
98091                                 return;
98092
98093                             } else if (apiStatus === 'rateLimited') {
98094                                 selection
98095                                     .text(t('status.rateLimit'))
98096                                     .append('a')
98097                                     .attr('class', 'api-status-login')
98098                                     .attr('target', '_blank')
98099                                     .call(svgIcon('#iD-icon-out-link', 'inline'))
98100                                     .append('span')
98101                                     .text(t('login'))
98102                                     .on('click.login', function() {
98103                                         event.preventDefault();
98104                                         osm.authenticate();
98105                                     });
98106                             } else {
98107                                 // eslint-disable-next-line no-warning-comments
98108                                 // TODO: nice messages for different error types
98109                                 selection.text(t('status.error'));
98110                             }
98111
98112                         } else if (apiStatus === 'readonly') {
98113                             selection.text(t('status.readonly'));
98114                         } else if (apiStatus === 'offline') {
98115                             selection.text(t('status.offline'));
98116                         }
98117
98118                         selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
98119                     });
98120                 }
98121
98122                 osm.on('change', function() { update(); });
98123
98124                 window.setInterval(update, 90000);
98125                 update();
98126             };
98127         }
98128
98129         function modeDrawArea(context, wayID, startGraph, baselineGraph, button) {
98130             var mode = {
98131                 button: button,
98132                 id: 'draw-area'
98133             };
98134
98135             var behavior;
98136
98137             mode.wayID = wayID;
98138
98139             mode.enter = function() {
98140                 var way = context.entity(wayID);
98141
98142                 behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
98143                     .tail(t('modes.draw_area.tail'));
98144
98145                 var addNode = behavior.addNode;
98146
98147                 behavior.addNode = function(node, d) {
98148                     var length = way.nodes.length;
98149                     var penultimate = length > 2 ? way.nodes[length - 2] : null;
98150
98151                     if (node.id === way.first() || node.id === penultimate) {
98152                         behavior.finish();
98153                     } else {
98154                         addNode(node, d);
98155                     }
98156                 };
98157
98158                 context.install(behavior);
98159             };
98160
98161
98162             mode.exit = function() {
98163                 context.uninstall(behavior);
98164             };
98165
98166
98167             mode.selectedIDs = function() {
98168                 return [wayID];
98169             };
98170
98171
98172             mode.activeID = function() {
98173                 return (behavior && behavior.activeID()) || [];
98174             };
98175
98176
98177             return mode;
98178         }
98179
98180         function modeAddArea(context, mode) {
98181             mode.id = 'add-area';
98182
98183             var behavior = behaviorAddWay(context)
98184                 .tail(t('modes.add_area.tail'))
98185                 .on('start', start)
98186                 .on('startFromWay', startFromWay)
98187                 .on('startFromNode', startFromNode);
98188
98189             var defaultTags = { area: 'yes' };
98190             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
98191
98192
98193             function actionClose(wayId) {
98194                 return function (graph) {
98195                     return graph.replace(graph.entity(wayId).close());
98196                 };
98197             }
98198
98199
98200             function start(loc) {
98201                 var startGraph = context.graph();
98202                 var node = osmNode({ loc: loc });
98203                 var way = osmWay({ tags: defaultTags });
98204
98205                 context.perform(
98206                     actionAddEntity(node),
98207                     actionAddEntity(way),
98208                     actionAddVertex(way.id, node.id),
98209                     actionClose(way.id)
98210                 );
98211
98212                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98213             }
98214
98215
98216             function startFromWay(loc, edge) {
98217                 var startGraph = context.graph();
98218                 var node = osmNode({ loc: loc });
98219                 var way = osmWay({ tags: defaultTags });
98220
98221                 context.perform(
98222                     actionAddEntity(node),
98223                     actionAddEntity(way),
98224                     actionAddVertex(way.id, node.id),
98225                     actionClose(way.id),
98226                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98227                 );
98228
98229                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98230             }
98231
98232
98233             function startFromNode(node) {
98234                 var startGraph = context.graph();
98235                 var way = osmWay({ tags: defaultTags });
98236
98237                 context.perform(
98238                     actionAddEntity(way),
98239                     actionAddVertex(way.id, node.id),
98240                     actionClose(way.id)
98241                 );
98242
98243                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98244             }
98245
98246
98247             mode.enter = function() {
98248                 context.install(behavior);
98249             };
98250
98251
98252             mode.exit = function() {
98253                 context.uninstall(behavior);
98254             };
98255
98256
98257             return mode;
98258         }
98259
98260         function modeAddLine(context, mode) {
98261             mode.id = 'add-line';
98262
98263             var behavior = behaviorAddWay(context)
98264                 .tail(t('modes.add_line.tail'))
98265                 .on('start', start)
98266                 .on('startFromWay', startFromWay)
98267                 .on('startFromNode', startFromNode);
98268
98269             var defaultTags = {};
98270             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
98271
98272
98273             function start(loc) {
98274                 var startGraph = context.graph();
98275                 var node = osmNode({ loc: loc });
98276                 var way = osmWay({ tags: defaultTags });
98277
98278                 context.perform(
98279                     actionAddEntity(node),
98280                     actionAddEntity(way),
98281                     actionAddVertex(way.id, node.id)
98282                 );
98283
98284                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98285             }
98286
98287
98288             function startFromWay(loc, edge) {
98289                 var startGraph = context.graph();
98290                 var node = osmNode({ loc: loc });
98291                 var way = osmWay({ tags: defaultTags });
98292
98293                 context.perform(
98294                     actionAddEntity(node),
98295                     actionAddEntity(way),
98296                     actionAddVertex(way.id, node.id),
98297                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98298                 );
98299
98300                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98301             }
98302
98303
98304             function startFromNode(node) {
98305                 var startGraph = context.graph();
98306                 var way = osmWay({ tags: defaultTags });
98307
98308                 context.perform(
98309                     actionAddEntity(way),
98310                     actionAddVertex(way.id, node.id)
98311                 );
98312
98313                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98314             }
98315
98316
98317             mode.enter = function() {
98318                 context.install(behavior);
98319             };
98320
98321
98322             mode.exit = function() {
98323                 context.uninstall(behavior);
98324             };
98325
98326             return mode;
98327         }
98328
98329         function modeAddPoint(context, mode) {
98330
98331             mode.id = 'add-point';
98332
98333             var behavior = behaviorDraw(context)
98334                 .tail(t('modes.add_point.tail'))
98335                 .on('click', add)
98336                 .on('clickWay', addWay)
98337                 .on('clickNode', addNode)
98338                 .on('cancel', cancel)
98339                 .on('finish', cancel);
98340
98341             var defaultTags = {};
98342             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
98343
98344
98345             function add(loc) {
98346                 var node = osmNode({ loc: loc, tags: defaultTags });
98347
98348                 context.perform(
98349                     actionAddEntity(node),
98350                     t('operations.add.annotation.point')
98351                 );
98352
98353                 enterSelectMode(node);
98354             }
98355
98356
98357             function addWay(loc, edge) {
98358                 var node = osmNode({ tags: defaultTags });
98359
98360                 context.perform(
98361                     actionAddMidpoint({loc: loc, edge: edge}, node),
98362                     t('operations.add.annotation.vertex')
98363                 );
98364
98365                 enterSelectMode(node);
98366             }
98367
98368             function enterSelectMode(node) {
98369                 context.enter(
98370                     modeSelect(context, [node.id]).newFeature(true)
98371                 );
98372             }
98373
98374
98375             function addNode(node) {
98376                 if (Object.keys(defaultTags).length === 0) {
98377                     enterSelectMode(node);
98378                     return;
98379                 }
98380
98381                 var tags = Object.assign({}, node.tags);  // shallow copy
98382                 for (var key in defaultTags) {
98383                     tags[key] = defaultTags[key];
98384                 }
98385
98386                 context.perform(
98387                     actionChangeTags(node.id, tags),
98388                     t('operations.add.annotation.point')
98389                 );
98390
98391                 enterSelectMode(node);
98392             }
98393
98394
98395             function cancel() {
98396                 context.enter(modeBrowse(context));
98397             }
98398
98399
98400             mode.enter = function() {
98401                 context.install(behavior);
98402             };
98403
98404
98405             mode.exit = function() {
98406                 context.uninstall(behavior);
98407             };
98408
98409
98410             return mode;
98411         }
98412
98413         function modeAddNote(context) {
98414             var mode = {
98415                 id: 'add-note',
98416                 button: 'note',
98417                 title: t('modes.add_note.title'),
98418                 description: t('modes.add_note.description'),
98419                 key: t('modes.add_note.key')
98420             };
98421
98422             var behavior = behaviorDraw(context)
98423                 .tail(t('modes.add_note.tail'))
98424                 .on('click', add)
98425                 .on('cancel', cancel)
98426                 .on('finish', cancel);
98427
98428
98429             function add(loc) {
98430                 var osm = services$1.osm;
98431                 if (!osm) return;
98432
98433                 var note = osmNote({ loc: loc, status: 'open', comments: [] });
98434                 osm.replaceNote(note);
98435
98436                 // force a reraw (there is no history change that would otherwise do this)
98437                 context.pan([0,0]);
98438
98439                 context
98440                     .selectedNoteID(note.id)
98441                     .enter(modeSelectNote(context, note.id).newFeature(true));
98442             }
98443
98444
98445             function cancel() {
98446                 context.enter(modeBrowse(context));
98447             }
98448
98449
98450             mode.enter = function() {
98451                 context.install(behavior);
98452             };
98453
98454
98455             mode.exit = function() {
98456                 context.uninstall(behavior);
98457             };
98458
98459
98460             return mode;
98461         }
98462
98463         function uiConflicts(context) {
98464             var dispatch$1 = dispatch('cancel', 'save');
98465             var keybinding = utilKeybinding('conflicts');
98466             var _origChanges;
98467             var _conflictList;
98468
98469
98470             function keybindingOn() {
98471                 d3_select(document)
98472                     .call(keybinding.on('⎋', cancel, true));
98473             }
98474
98475             function keybindingOff() {
98476                 d3_select(document)
98477                     .call(keybinding.unbind);
98478             }
98479
98480             function tryAgain() {
98481                 keybindingOff();
98482                 dispatch$1.call('save');
98483             }
98484
98485             function cancel() {
98486                 keybindingOff();
98487                 dispatch$1.call('cancel');
98488             }
98489
98490
98491             function conflicts(selection) {
98492                 keybindingOn();
98493
98494                 var headerEnter = selection.selectAll('.header')
98495                     .data([0])
98496                     .enter()
98497                     .append('div')
98498                     .attr('class', 'header fillL');
98499
98500                 headerEnter
98501                     .append('button')
98502                     .attr('class', 'fr')
98503                     .on('click', cancel)
98504                     .call(svgIcon('#iD-icon-close'));
98505
98506                 headerEnter
98507                     .append('h3')
98508                     .text(t('save.conflict.header'));
98509
98510                 var bodyEnter = selection.selectAll('.body')
98511                     .data([0])
98512                     .enter()
98513                     .append('div')
98514                     .attr('class', 'body fillL');
98515
98516                 var conflictsHelpEnter = bodyEnter
98517                     .append('div')
98518                     .attr('class', 'conflicts-help')
98519                     .text(t('save.conflict.help'));
98520
98521
98522                 // Download changes link
98523                 var detected = utilDetect();
98524                 var changeset = new osmChangeset();
98525
98526                 delete changeset.id;  // Export without changeset_id
98527
98528                 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
98529                 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
98530                 var fileName = 'changes.osc';
98531
98532                 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
98533                     .append('a')
98534                     .attr('class', 'download-changes');
98535
98536                 if (detected.download) {      // All except IE11 and Edge
98537                     linkEnter                 // download the data as a file
98538                         .attr('href', window.URL.createObjectURL(blob))
98539                         .attr('download', fileName);
98540
98541                 } else {                      // IE11 and Edge
98542                     linkEnter                 // open data uri in a new tab
98543                         .attr('target', '_blank')
98544                         .on('click.download', function() {
98545                             navigator.msSaveBlob(blob, fileName);
98546                         });
98547                 }
98548
98549                 linkEnter
98550                     .call(svgIcon('#iD-icon-load', 'inline'))
98551                     .append('span')
98552                     .text(t('save.conflict.download_changes'));
98553
98554
98555                 bodyEnter
98556                     .append('div')
98557                     .attr('class', 'conflict-container fillL3')
98558                     .call(showConflict, 0);
98559
98560                 bodyEnter
98561                     .append('div')
98562                     .attr('class', 'conflicts-done')
98563                     .attr('opacity', 0)
98564                     .style('display', 'none')
98565                     .text(t('save.conflict.done'));
98566
98567                 var buttonsEnter = bodyEnter
98568                     .append('div')
98569                     .attr('class','buttons col12 joined conflicts-buttons');
98570
98571                 buttonsEnter
98572                     .append('button')
98573                     .attr('disabled', _conflictList.length > 1)
98574                     .attr('class', 'action conflicts-button col6')
98575                     .text(t('save.title'))
98576                     .on('click.try_again', tryAgain);
98577
98578                 buttonsEnter
98579                     .append('button')
98580                     .attr('class', 'secondary-action conflicts-button col6')
98581                     .text(t('confirm.cancel'))
98582                     .on('click.cancel', cancel);
98583             }
98584
98585
98586             function showConflict(selection, index) {
98587                 index = utilWrap(index, _conflictList.length);
98588
98589                 var parent = d3_select(selection.node().parentNode);
98590
98591                 // enable save button if this is the last conflict being reviewed..
98592                 if (index === _conflictList.length - 1) {
98593                     window.setTimeout(function() {
98594                         parent.select('.conflicts-button')
98595                             .attr('disabled', null);
98596
98597                         parent.select('.conflicts-done')
98598                             .transition()
98599                             .attr('opacity', 1)
98600                             .style('display', 'block');
98601                     }, 250);
98602                 }
98603
98604                 var conflict = selection
98605                     .selectAll('.conflict')
98606                     .data([_conflictList[index]]);
98607
98608                 conflict.exit()
98609                     .remove();
98610
98611                 var conflictEnter = conflict.enter()
98612                     .append('div')
98613                     .attr('class', 'conflict');
98614
98615                 conflictEnter
98616                     .append('h4')
98617                     .attr('class', 'conflict-count')
98618                     .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
98619
98620                 conflictEnter
98621                     .append('a')
98622                     .attr('class', 'conflict-description')
98623                     .attr('href', '#')
98624                     .text(function(d) { return d.name; })
98625                     .on('click', function(d) {
98626                         event.preventDefault();
98627                         zoomToEntity(d.id);
98628                     });
98629
98630                 var details = conflictEnter
98631                     .append('div')
98632                     .attr('class', 'conflict-detail-container');
98633
98634                 details
98635                     .append('ul')
98636                     .attr('class', 'conflict-detail-list')
98637                     .selectAll('li')
98638                     .data(function(d) { return d.details || []; })
98639                     .enter()
98640                     .append('li')
98641                     .attr('class', 'conflict-detail-item')
98642                     .html(function(d) { return d; });
98643
98644                 details
98645                     .append('div')
98646                     .attr('class', 'conflict-choices')
98647                     .call(addChoices);
98648
98649                 details
98650                     .append('div')
98651                     .attr('class', 'conflict-nav-buttons joined cf')
98652                     .selectAll('button')
98653                     .data(['previous', 'next'])
98654                     .enter()
98655                     .append('button')
98656                     .text(function(d) { return t('save.conflict.' + d); })
98657                     .attr('class', 'conflict-nav-button action col6')
98658                     .attr('disabled', function(d, i) {
98659                         return (i === 0 && index === 0) ||
98660                             (i === 1 && index === _conflictList.length - 1) || null;
98661                     })
98662                     .on('click', function(d, i) {
98663                         event.preventDefault();
98664
98665                         var container = parent.selectAll('.conflict-container');
98666                         var sign = (i === 0 ? -1 : 1);
98667
98668                         container
98669                             .selectAll('.conflict')
98670                             .remove();
98671
98672                         container
98673                             .call(showConflict, index + sign);
98674                     });
98675
98676             }
98677
98678
98679             function addChoices(selection) {
98680                 var choices = selection
98681                     .append('ul')
98682                     .attr('class', 'layer-list')
98683                     .selectAll('li')
98684                     .data(function(d) { return d.choices || []; });
98685
98686                 // enter
98687                 var choicesEnter = choices.enter()
98688                     .append('li')
98689                     .attr('class', 'layer');
98690
98691                 var labelEnter = choicesEnter
98692                     .append('label');
98693
98694                 labelEnter
98695                     .append('input')
98696                     .attr('type', 'radio')
98697                     .attr('name', function(d) { return d.id; })
98698                     .on('change', function(d, i) {
98699                         var ul = this.parentNode.parentNode.parentNode;
98700                         ul.__data__.chosen = i;
98701                         choose(ul, d);
98702                     });
98703
98704                 labelEnter
98705                     .append('span')
98706                     .text(function(d) { return d.text; });
98707
98708                 // update
98709                 choicesEnter
98710                     .merge(choices)
98711                     .each(function(d, i) {
98712                         var ul = this.parentNode;
98713                         if (ul.__data__.chosen === i) {
98714                             choose(ul, d);
98715                         }
98716                     });
98717             }
98718
98719
98720             function choose(ul, datum) {
98721                 if (event) event.preventDefault();
98722
98723                 d3_select(ul)
98724                     .selectAll('li')
98725                     .classed('active', function(d) { return d === datum; })
98726                     .selectAll('input')
98727                     .property('checked', function(d) { return d === datum; });
98728
98729                 var extent = geoExtent();
98730                 var entity;
98731
98732                 entity = context.graph().hasEntity(datum.id);
98733                 if (entity) extent._extend(entity.extent(context.graph()));
98734
98735                 datum.action();
98736
98737                 entity = context.graph().hasEntity(datum.id);
98738                 if (entity) extent._extend(entity.extent(context.graph()));
98739
98740                 zoomToEntity(datum.id, extent);
98741             }
98742
98743
98744             function zoomToEntity(id, extent) {
98745                 context.surface().selectAll('.hover')
98746                     .classed('hover', false);
98747
98748                 var entity = context.graph().hasEntity(id);
98749                 if (entity) {
98750                     if (extent) {
98751                         context.map().trimmedExtent(extent);
98752                     } else {
98753                         context.map().zoomToEase(entity);
98754                     }
98755                     context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
98756                         .classed('hover', true);
98757                 }
98758             }
98759
98760
98761             // The conflict list should be an array of objects like:
98762             // {
98763             //     id: id,
98764             //     name: entityName(local),
98765             //     details: merge.conflicts(),
98766             //     chosen: 1,
98767             //     choices: [
98768             //         choice(id, keepMine, forceLocal),
98769             //         choice(id, keepTheirs, forceRemote)
98770             //     ]
98771             // }
98772             conflicts.conflictList = function(_) {
98773                 if (!arguments.length) return _conflictList;
98774                 _conflictList = _;
98775                 return conflicts;
98776             };
98777
98778
98779             conflicts.origChanges = function(_) {
98780                 if (!arguments.length) return _origChanges;
98781                 _origChanges = _;
98782                 return conflicts;
98783             };
98784
98785
98786             return utilRebind(conflicts, dispatch$1, 'on');
98787         }
98788
98789         function uiChangesetEditor(context) {
98790             var dispatch$1 = dispatch('change');
98791             var formFields = uiFormFields(context);
98792             var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
98793             var _fieldsArr;
98794             var _tags;
98795             var _changesetID;
98796
98797
98798             function changesetEditor(selection) {
98799                 render(selection);
98800             }
98801
98802
98803             function render(selection) {
98804                 var initial = false;
98805
98806                 if (!_fieldsArr) {
98807                     initial = true;
98808                     var presets = context.presets();
98809
98810                     _fieldsArr = [
98811                         uiField(context, presets.field('comment'), null, { show: true, revert: false }),
98812                         uiField(context, presets.field('source'), null, { show: false, revert: false }),
98813                         uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
98814                     ];
98815
98816                     _fieldsArr.forEach(function(field) {
98817                         field
98818                             .on('change', function(t, onInput) {
98819                                 dispatch$1.call('change', field, t, onInput);
98820                             });
98821                     });
98822                 }
98823
98824                 _fieldsArr.forEach(function(field) {
98825                     field
98826                         .tags(_tags);
98827                 });
98828
98829
98830                 selection
98831                     .call(formFields.fieldsArr(_fieldsArr));
98832
98833
98834                 if (initial) {
98835                     var commentField = selection.select('#preset-input-comment');
98836                     var commentNode = commentField.node();
98837
98838                     if (commentNode) {
98839                         commentNode.focus();
98840                         commentNode.select();
98841                     }
98842
98843                     // trigger a 'blur' event so that comment field can be cleaned
98844                     // and checked for hashtags, even if retrieved from localstorage
98845                     utilTriggerEvent(commentField, 'blur');
98846
98847                     var osm = context.connection();
98848                     if (osm) {
98849                         osm.userChangesets(function (err, changesets) {
98850                             if (err) return;
98851
98852                             var comments = changesets.map(function(changeset) {
98853                                 var comment = changeset.tags.comment;
98854                                 return comment ? { title: comment, value: comment } : null;
98855                             }).filter(Boolean);
98856
98857                             commentField
98858                                 .call(commentCombo
98859                                     .data(utilArrayUniqBy(comments, 'title'))
98860                                 );
98861                         });
98862                     }
98863                 }
98864
98865                 // Add warning if comment mentions Google
98866                 var hasGoogle = _tags.comment.match(/google/i);
98867                 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
98868                     .data(hasGoogle ? [0] : []);
98869
98870                 commentWarning.exit()
98871                     .transition()
98872                     .duration(200)
98873                     .style('opacity', 0)
98874                     .remove();
98875
98876                 var commentEnter = commentWarning.enter()
98877                     .insert('div', '.tag-reference-body')
98878                     .attr('class', 'field-warning comment-warning')
98879                     .style('opacity', 0);
98880
98881                 commentEnter
98882                     .append('a')
98883                     .attr('target', '_blank')
98884                     .attr('tabindex', -1)
98885                     .call(svgIcon('#iD-icon-alert', 'inline'))
98886                     .attr('href', t('commit.google_warning_link'))
98887                     .append('span')
98888                     .text(t('commit.google_warning'));
98889
98890                 commentEnter
98891                     .transition()
98892                     .duration(200)
98893                     .style('opacity', 1);
98894             }
98895
98896
98897             changesetEditor.tags = function(_) {
98898                 if (!arguments.length) return _tags;
98899                 _tags = _;
98900                 // Don't reset _fieldsArr here.
98901                 return changesetEditor;
98902             };
98903
98904
98905             changesetEditor.changesetID = function(_) {
98906                 if (!arguments.length) return _changesetID;
98907                 if (_changesetID === _) return changesetEditor;
98908                 _changesetID = _;
98909                 _fieldsArr = null;
98910                 return changesetEditor;
98911             };
98912
98913
98914             return utilRebind(changesetEditor, dispatch$1, 'on');
98915         }
98916
98917         function uiCommitChanges(context) {
98918             var detected = utilDetect();
98919             var _entityID;
98920
98921
98922             function commitChanges(selection) {
98923                 var history = context.history();
98924                 var summary = history.difference().summary();
98925
98926                 var container = selection.selectAll('.modal-section.commit-section')
98927                     .data([0]);
98928
98929                 var containerEnter = container.enter()
98930                     .append('div')
98931                     .attr('class', 'commit-section modal-section fillL2');
98932
98933                 containerEnter
98934                     .append('h3')
98935                     .text(t('commit.changes', { count: summary.length }));
98936
98937                 containerEnter
98938                     .append('ul')
98939                     .attr('class', 'changeset-list');
98940
98941                 container = containerEnter
98942                     .merge(container);
98943
98944
98945                 var items = container.select('ul').selectAll('li')
98946                     .data(summary);
98947
98948                 var itemsEnter = items.enter()
98949                     .append('li')
98950                     .attr('class', 'change-item');
98951
98952                 itemsEnter
98953                     .each(function(d) {
98954                         d3_select(this)
98955                             .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
98956                     });
98957
98958                 itemsEnter
98959                     .append('span')
98960                     .attr('class', 'change-type')
98961                     .text(function(d) { return t('commit.' + d.changeType) + ' '; });
98962
98963                 itemsEnter
98964                     .append('strong')
98965                     .attr('class', 'entity-type')
98966                     .text(function(d) {
98967                         var matched = context.presets().match(d.entity, d.graph);
98968                         return (matched && matched.name()) || utilDisplayType(d.entity.id);
98969                     });
98970
98971                 itemsEnter
98972                     .append('span')
98973                     .attr('class', 'entity-name')
98974                     .text(function(d) {
98975                         var name = utilDisplayName(d.entity) || '',
98976                             string = '';
98977                         if (name !== '') {
98978                             string += ':';
98979                         }
98980                         return string += ' ' + name;
98981                     });
98982
98983                 itemsEnter
98984                     .style('opacity', 0)
98985                     .transition()
98986                     .style('opacity', 1);
98987
98988                 items = itemsEnter
98989                     .merge(items);
98990
98991                 items
98992                     .on('mouseover', mouseover)
98993                     .on('mouseout', mouseout)
98994                     .on('click', click);
98995
98996
98997                 // Download changeset link
98998                 var changeset = new osmChangeset().update({ id: undefined });
98999                 var changes = history.changes(actionDiscardTags(history.difference()));
99000
99001                 delete changeset.id;  // Export without chnageset_id
99002
99003                 var data = JXON.stringify(changeset.osmChangeJXON(changes));
99004                 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
99005                 var fileName = 'changes.osc';
99006
99007                 var linkEnter = container.selectAll('.download-changes')
99008                     .data([0])
99009                     .enter()
99010                     .append('a')
99011                     .attr('class', 'download-changes');
99012
99013                 if (detected.download) {      // All except IE11 and Edge
99014                     linkEnter                 // download the data as a file
99015                         .attr('href', window.URL.createObjectURL(blob))
99016                         .attr('download', fileName);
99017
99018                 } else {                      // IE11 and Edge
99019                     linkEnter                 // open data uri in a new tab
99020                         .attr('target', '_blank')
99021                         .on('click.download', function() {
99022                             navigator.msSaveBlob(blob, fileName);
99023                         });
99024                 }
99025
99026                 linkEnter
99027                     .call(svgIcon('#iD-icon-load', 'inline'))
99028                     .append('span')
99029                     .text(t('commit.download_changes'));
99030
99031
99032                 function mouseover(d) {
99033                     if (d.entity) {
99034                         context.surface().selectAll(
99035                             utilEntityOrMemberSelector([d.entity.id], context.graph())
99036                         ).classed('hover', true);
99037                     }
99038                 }
99039
99040
99041                 function mouseout() {
99042                     context.surface().selectAll('.hover')
99043                         .classed('hover', false);
99044                 }
99045
99046
99047                 function click(change) {
99048                     if (change.changeType === 'deleted') {
99049                         _entityID = null;
99050                     } else {
99051                         var entity = change.entity;
99052                         _entityID = change.entity.id;
99053                         context.map().zoomToEase(entity);
99054                         context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
99055                             .classed('hover', true);
99056                     }
99057                 }
99058             }
99059
99060
99061             commitChanges.entityID = function(_) {
99062                 if (!arguments.length) return _entityID;
99063                 _entityID = _;
99064                 return commitChanges;
99065             };
99066
99067
99068             return commitChanges;
99069         }
99070
99071         function uiCommitWarnings(context) {
99072
99073             function commitWarnings(selection) {
99074                 var issuesBySeverity = context.validator()
99075                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeDisabledRules: true });
99076
99077                 for (var severity in issuesBySeverity) {
99078                     var issues = issuesBySeverity[severity];
99079                     var section = severity + '-section';
99080                     var issueItem = severity + '-item';
99081
99082                     var container = selection.selectAll('.' + section)
99083                         .data(issues.length ? [0] : []);
99084
99085                     container.exit()
99086                         .remove();
99087
99088                     var containerEnter = container.enter()
99089                         .append('div')
99090                         .attr('class', 'modal-section ' + section + ' fillL2');
99091
99092                     containerEnter
99093                         .append('h3')
99094                         .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
99095
99096                     containerEnter
99097                         .append('ul')
99098                         .attr('class', 'changeset-list');
99099
99100                     container = containerEnter
99101                         .merge(container);
99102
99103
99104                     var items = container.select('ul').selectAll('li')
99105                         .data(issues, function(d) { return d.id; });
99106
99107                     items.exit()
99108                         .remove();
99109
99110                     var itemsEnter = items.enter()
99111                         .append('li')
99112                         .attr('class', issueItem);
99113
99114                     itemsEnter
99115                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
99116
99117                     itemsEnter
99118                         .append('strong')
99119                         .attr('class', 'issue-message');
99120
99121                     itemsEnter.filter(function(d) { return d.tooltip; })
99122                         .call(tooltip()
99123                             .title(function(d) { return d.tooltip; })
99124                             .placement('top')
99125                         );
99126
99127                     items = itemsEnter
99128                         .merge(items);
99129
99130                     items.selectAll('.issue-message')
99131                         .text(function(d) {
99132                             return d.message(context);
99133                         });
99134
99135                     items
99136                         .on('mouseover', function(d) {
99137                             if (d.entityIds) {
99138                                 context.surface().selectAll(
99139                                     utilEntityOrMemberSelector(
99140                                         d.entityIds,
99141                                         context.graph()
99142                                     )
99143                                 ).classed('hover', true);
99144                             }
99145                         })
99146                         .on('mouseout', function() {
99147                             context.surface().selectAll('.hover')
99148                                 .classed('hover', false);
99149                         })
99150                         .on('click', function(d) {
99151                             context.validator().focusIssue(d);
99152                         });
99153                 }
99154             }
99155
99156
99157             return commitWarnings;
99158         }
99159
99160         var _changeset$1;
99161         var readOnlyTags = [
99162             /^changesets_count$/,
99163             /^created_by$/,
99164             /^ideditor:/,
99165             /^imagery_used$/,
99166             /^host$/,
99167             /^locale$/,
99168             /^warnings:/
99169         ];
99170
99171         // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
99172         // from https://stackoverflow.com/a/25575009
99173         var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
99174
99175
99176         function uiCommit(context) {
99177             var dispatch$1 = dispatch('cancel', 'save');
99178             var _userDetails;
99179             var _selection;
99180
99181             var changesetEditor = uiChangesetEditor(context)
99182                 .on('change', changeTags);
99183             var rawTagEditor = uiRawTagEditor(context)
99184                 .on('change', changeTags);
99185             var commitChanges = uiCommitChanges(context);
99186             var commitWarnings = uiCommitWarnings(context);
99187
99188
99189             function commit(selection) {
99190                 _selection = selection;
99191
99192                 var osm = context.connection();
99193                 if (!osm) return;
99194
99195                 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
99196                 var commentDate = +context.storage('commentDate') || 0;
99197                 var currDate = Date.now();
99198                 var cutoff = 2 * 86400 * 1000;   // 2 days
99199                 if (commentDate > currDate || currDate - commentDate > cutoff) {
99200                     context.storage('comment', null);
99201                     context.storage('hashtags', null);
99202                     context.storage('source', null);
99203                 }
99204
99205                 var tags;
99206                 // Initialize changeset if one does not exist yet.
99207                 // Also pull values from local storage.
99208                 if (!_changeset$1) {
99209                     var detected = utilDetect();
99210                     tags = {
99211                         comment: context.storage('comment') || '',
99212                         created_by: ('iD ' + context.version).substr(0, 255),
99213                         host: detected.host.substr(0, 255),
99214                         locale: detected.locale.substr(0, 255)
99215                     };
99216
99217                     // call findHashtags initially - this will remove stored
99218                     // hashtags if any hashtags are found in the comment - #4304
99219                     findHashtags(tags, true);
99220
99221                     var hashtags = context.storage('hashtags');
99222                     if (hashtags) {
99223                         tags.hashtags = hashtags;
99224                     }
99225
99226                     var source = context.storage('source');
99227                     if (source) {
99228                         tags.source = source;
99229                     }
99230                     var photoOverlaysUsed = context.history().photoOverlaysUsed();
99231                     if (photoOverlaysUsed.length) {
99232                         var sources = (tags.source || '').split(';');
99233
99234                         // include this tag for any photo layer
99235                         if (sources.indexOf('streetlevel imagery') === -1) {
99236                             sources.push('streetlevel imagery');
99237                         }
99238                         
99239                         // add the photo overlays used during editing as sources
99240                         photoOverlaysUsed.forEach(function(photoOverlay) {
99241                             if (sources.indexOf(photoOverlay) === -1) {
99242                                 sources.push(photoOverlay);
99243                             }
99244                         });
99245
99246                         tags.source = sources.join(';').substr(0, 255);
99247                     }
99248
99249                     _changeset$1 = new osmChangeset({ tags: tags });
99250                 }
99251
99252                 tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99253
99254                 // assign tags for imagery used
99255                 var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
99256                 tags.imagery_used = imageryUsed || 'None';
99257
99258                 // assign tags for closed issues and notes
99259                 var osmClosed = osm.getClosedIDs();
99260                 if (osmClosed.length) {
99261                     tags['closed:note'] = osmClosed.join(';').substr(0, 255);
99262                 }
99263                 if (services$1.keepRight) {
99264                     var krClosed = services$1.keepRight.getClosedIDs();
99265                     if (krClosed.length) {
99266                         tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
99267                     }
99268                 }
99269                 if (services$1.improveOSM) {
99270                     var iOsmClosed = services$1.improveOSM.getClosedIDs();
99271                     if (iOsmClosed.length) {
99272                         tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
99273                     }
99274                 }
99275
99276                 // remove existing warning counts
99277                 for (var key in tags) {
99278                     if (key.match(/^warnings:/)) {
99279                         delete tags[key];
99280                     }
99281                 }
99282
99283                 // add counts of warnings generated by the user's edits
99284                 var warnings = context.validator()
99285                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeIgnored: true, includeDisabledRules: true }).warning;
99286
99287                 var warningsByType = utilArrayGroupBy(warnings, 'type');
99288                 for (var warningType in warningsByType) {
99289                     var warningsOfType = warningsByType[warningType];
99290                     if (warningsOfType[0].subtype) {
99291                         var warningsBySubtype = utilArrayGroupBy(warningsOfType, 'subtype');
99292                         for (var warningSubtype in warningsBySubtype) {
99293                             var warningsOfSubtype = warningsBySubtype[warningSubtype];
99294                             tags['warnings:' + warningType + ':' + warningSubtype] = warningsOfSubtype.length.toString();
99295                         }
99296                     } else {
99297                         tags['warnings:' + warningType] = warningsOfType.length.toString();
99298                     }
99299                 }
99300
99301
99302                 _changeset$1 = _changeset$1.update({ tags: tags });
99303
99304                 var header = selection.selectAll('.header')
99305                     .data([0]);
99306
99307                 var headerTitle = header.enter()
99308                     .append('div')
99309                     .attr('class', 'header fillL header-container');
99310
99311                 headerTitle
99312                     .append('div')
99313                     .attr('class', 'header-block header-block-outer');
99314
99315                 headerTitle
99316                     .append('div')
99317                     .attr('class', 'header-block')
99318                     .append('h3')
99319                     .text(t('commit.title'));
99320
99321                 headerTitle
99322                     .append('div')
99323                     .attr('class', 'header-block header-block-outer header-block-close')
99324                     .append('button')
99325                     .attr('class', 'close')
99326                     .on('click', function() { context.enter(modeBrowse(context)); })
99327                     .call(svgIcon('#iD-icon-close'));
99328
99329                 var body = selection.selectAll('.body')
99330                     .data([0]);
99331
99332                 body = body.enter()
99333                     .append('div')
99334                     .attr('class', 'body')
99335                     .merge(body);
99336
99337
99338                 // Changeset Section
99339                 var changesetSection = body.selectAll('.changeset-editor')
99340                     .data([0]);
99341
99342                 changesetSection = changesetSection.enter()
99343                     .append('div')
99344                     .attr('class', 'modal-section changeset-editor')
99345                     .merge(changesetSection);
99346
99347                 changesetSection
99348                     .call(changesetEditor
99349                         .changesetID(_changeset$1.id)
99350                         .tags(tags)
99351                     );
99352
99353
99354                 // Warnings
99355                 body.call(commitWarnings);
99356
99357
99358                 // Upload Explanation
99359                 var saveSection = body.selectAll('.save-section')
99360                     .data([0]);
99361
99362                 saveSection = saveSection.enter()
99363                     .append('div')
99364                     .attr('class','modal-section save-section fillL cf')
99365                     .merge(saveSection);
99366
99367                 var prose = saveSection.selectAll('.commit-info')
99368                     .data([0]);
99369
99370                 if (prose.enter().size()) {   // first time, make sure to update user details in prose
99371                     _userDetails = null;
99372                 }
99373
99374                 prose = prose.enter()
99375                     .append('p')
99376                     .attr('class', 'commit-info')
99377                     .text(t('commit.upload_explanation'))
99378                     .merge(prose);
99379
99380                 // always check if this has changed, but only update prose.html()
99381                 // if needed, because it can trigger a style recalculation
99382                 osm.userDetails(function(err, user) {
99383                     if (err) return;
99384
99385                     if (_userDetails === user) return;  // no change
99386                     _userDetails = user;
99387
99388                     var userLink = d3_select(document.createElement('div'));
99389
99390                     if (user.image_url) {
99391                         userLink
99392                             .append('img')
99393                             .attr('src', user.image_url)
99394                             .attr('class', 'icon pre-text user-icon');
99395                     }
99396
99397                     userLink
99398                         .append('a')
99399                         .attr('class', 'user-info')
99400                         .text(user.display_name)
99401                         .attr('href', osm.userURL(user.display_name))
99402                         .attr('tabindex', -1)
99403                         .attr('target', '_blank');
99404
99405                     prose
99406                         .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
99407                 });
99408
99409
99410                 // Request Review
99411                 var requestReview = saveSection.selectAll('.request-review')
99412                     .data([0]);
99413
99414                 // Enter
99415                 var requestReviewEnter = requestReview.enter()
99416                     .append('div')
99417                     .attr('class', 'request-review');
99418
99419                 var labelEnter = requestReviewEnter
99420                     .append('label')
99421                     .attr('for', 'commit-input-request-review');
99422
99423                 labelEnter
99424                     .append('input')
99425                     .attr('type', 'checkbox')
99426                     .attr('id', 'commit-input-request-review');
99427
99428                 labelEnter
99429                     .append('span')
99430                     .text(t('commit.request_review'));
99431
99432                 // Update
99433                 requestReview = requestReview
99434                     .merge(requestReviewEnter);
99435
99436                 var requestReviewInput = requestReview.selectAll('input')
99437                     .property('checked', isReviewRequested(_changeset$1.tags))
99438                     .on('change', toggleRequestReview);
99439
99440
99441                 // Buttons
99442                 var buttonSection = saveSection.selectAll('.buttons')
99443                     .data([0]);
99444
99445                 // enter
99446                 var buttonEnter = buttonSection.enter()
99447                     .append('div')
99448                     .attr('class', 'buttons fillL cf');
99449
99450                 buttonEnter
99451                     .append('button')
99452                     .attr('class', 'secondary-action button cancel-button')
99453                     .append('span')
99454                     .attr('class', 'label')
99455                     .text(t('commit.cancel'));
99456
99457                 var uploadButton = buttonEnter
99458                     .append('button')
99459                     .attr('class', 'action button save-button');
99460
99461                 uploadButton.append('span')
99462                     .attr('class', 'label')
99463                     .text(t('commit.save'));
99464
99465                 var uploadBlockerTooltipText = getUploadBlockerMessage();
99466
99467                 // update
99468                 buttonSection = buttonSection
99469                     .merge(buttonEnter);
99470
99471                 buttonSection.selectAll('.cancel-button')
99472                     .on('click.cancel', function() {
99473                         var selectedID = commitChanges.entityID();
99474                         dispatch$1.call('cancel', this, selectedID);
99475                     });
99476
99477                 buttonSection.selectAll('.save-button')
99478                     .classed('disabled', uploadBlockerTooltipText !== null)
99479                     .on('click.save', function() {
99480                         if (!d3_select(this).classed('disabled')) {
99481                             this.blur();    // avoid keeping focus on the button - #4641
99482                             dispatch$1.call('save', this, _changeset$1);
99483                         }
99484                     });
99485
99486                 // remove any existing tooltip
99487                 tooltip().destroyAny(buttonSection.selectAll('.save-button'));
99488
99489                 if (uploadBlockerTooltipText) {
99490                     buttonSection.selectAll('.save-button')
99491                         .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
99492                 }
99493
99494                 // Raw Tag Editor
99495                 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
99496                     .data([0]);
99497
99498                 tagSection = tagSection.enter()
99499                     .append('div')
99500                     .attr('class', 'modal-section tag-section raw-tag-editor')
99501                     .merge(tagSection);
99502
99503                 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99504                 tagSection
99505                     .call(rawTagEditor
99506                         .expanded(expanded)
99507                         .readOnlyTags(readOnlyTags)
99508                         .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99509                     );
99510
99511
99512                 // Change summary
99513                 body.call(commitChanges);
99514
99515
99516                 function toggleRequestReview() {
99517                     var rr = requestReviewInput.property('checked');
99518                     updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
99519
99520                     var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99521                     tagSection
99522                         .call(rawTagEditor
99523                             .expanded(expanded)
99524                             .readOnlyTags(readOnlyTags)
99525                             .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99526                         );
99527                 }
99528             }
99529
99530
99531             function getUploadBlockerMessage() {
99532                 var errors = context.validator()
99533                     .getIssuesBySeverity({ what: 'edited', where: 'all' }).error;
99534
99535                 if (errors.length) {
99536                     return t('commit.outstanding_errors_message', { count: errors.length });
99537
99538                 } else {
99539                     var n = d3_select('#preset-input-comment').node();
99540                     var hasChangesetComment = n && n.value.length > 0;
99541                     if (!hasChangesetComment) {
99542                         return t('commit.comment_needed_message');
99543                     }
99544                 }
99545                 return null;
99546             }
99547
99548
99549             function changeTags(changed, onInput) {
99550                 if (changed.hasOwnProperty('comment')) {
99551                     if (changed.comment === undefined) {
99552                         changed.comment = '';
99553                     }
99554                     if (!onInput) {
99555                         context.storage('comment', changed.comment);
99556                         context.storage('commentDate', Date.now());
99557                     }
99558                 }
99559                 if (changed.hasOwnProperty('source')) {
99560                     if (changed.source === undefined) {
99561                         context.storage('source', null);
99562                     } else if (!onInput) {
99563                         context.storage('source', changed.source);
99564                         context.storage('commentDate', Date.now());
99565                     }
99566                 }
99567
99568                 updateChangeset(changed, onInput);
99569
99570                 if (_selection) {
99571                     _selection.call(commit);
99572                 }
99573             }
99574
99575
99576             function findHashtags(tags, commentOnly) {
99577                 var inComment = commentTags();
99578                 var inHashTags = hashTags();
99579
99580                 if (inComment !== null) {                    // when hashtags are detected in comment...
99581                     context.storage('hashtags', null);       // always remove stored hashtags - #4304
99582                     if (commentOnly) { inHashTags = []; }    // optionally override hashtags field
99583                 }
99584
99585                 // keep only one copy of the tags
99586                 var all = new Set();
99587                 var keepTags = [];
99588                 inComment.forEach(checkTag);
99589                 inHashTags.forEach(checkTag);
99590                 return keepTags;
99591
99592                 // Compare tags as lowercase strings, but keep original case tags
99593                 function checkTag(s) {
99594                     var compare = s.toLowerCase();
99595                     if (!all.has(compare)) {
99596                         all.add(compare);
99597                         keepTags.push(s);
99598                     }
99599                 }
99600
99601                 // Extract hashtags from `comment`
99602                 function commentTags() {
99603                     var matches = (tags.comment || '')
99604                         .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
99605                         .match(hashtagRegex);
99606
99607                     return (matches || []);
99608                 }
99609
99610                 // Extract and clean hashtags from `hashtags`
99611                 function hashTags() {
99612                     var matches = (tags.hashtags || '')
99613                         .split(/[,;\s]+/)
99614                         .map(function (s) {
99615                             if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
99616                             var matched = s.match(hashtagRegex);
99617                             return matched && matched[0];
99618                         }).filter(Boolean);                       // exclude falsy
99619
99620                     return (matches || []);
99621                 }
99622             }
99623
99624
99625             function isReviewRequested(tags) {
99626                 var rr = tags.review_requested;
99627                 if (rr === undefined) return false;
99628                 rr = rr.trim().toLowerCase();
99629                 return !(rr === '' || rr === 'no');
99630             }
99631
99632
99633             function updateChangeset(changed, onInput) {
99634                 var tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99635
99636                 Object.keys(changed).forEach(function(k) {
99637                     var v = changed[k];
99638                     k = k.trim().substr(0, 255);
99639                     if (readOnlyTags.indexOf(k) !== -1) return;
99640
99641                     if (k !== '' && v !== undefined) {
99642                         if (onInput) {
99643                             tags[k] = v;
99644                         } else {
99645                             tags[k] = v.trim().substr(0, 255);
99646                         }
99647                     } else {
99648                         delete tags[k];
99649                     }
99650                 });
99651
99652                 if (!onInput) {
99653                     // when changing the comment, override hashtags with any found in comment.
99654                     var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
99655                     var arr = findHashtags(tags, commentOnly);
99656                     if (arr.length) {
99657                         tags.hashtags = arr.join(';').substr(0, 255);
99658                         context.storage('hashtags', tags.hashtags);
99659                     } else {
99660                         delete tags.hashtags;
99661                         context.storage('hashtags', null);
99662                     }
99663                 }
99664
99665                 // always update userdetails, just in case user reauthenticates as someone else
99666                 if (_userDetails && _userDetails.changesets_count !== undefined) {
99667                     var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
99668                     tags.changesets_count = String(changesetsCount);
99669
99670                     // first 100 edits - new user
99671                     if (changesetsCount <= 100) {
99672                         var s;
99673                         s = context.storage('walkthrough_completed');
99674                         if (s) {
99675                             tags['ideditor:walkthrough_completed'] = s;
99676                         }
99677
99678                         s = context.storage('walkthrough_progress');
99679                         if (s) {
99680                             tags['ideditor:walkthrough_progress'] = s;
99681                         }
99682
99683                         s = context.storage('walkthrough_started');
99684                         if (s) {
99685                             tags['ideditor:walkthrough_started'] = s;
99686                         }
99687                     }
99688                 } else {
99689                     delete tags.changesets_count;
99690                 }
99691
99692                 if (!fastDeepEqual(_changeset$1.tags, tags)) {
99693                     _changeset$1 = _changeset$1.update({ tags: tags });
99694                 }
99695             }
99696
99697
99698             commit.reset = function() {
99699                 _changeset$1 = null;
99700             };
99701
99702
99703             return utilRebind(commit, dispatch$1, 'on');
99704         }
99705
99706         function uiSuccess(context) {
99707             var MAXEVENTS = 2;
99708
99709             // All else being equal, rank more "social" communities higher
99710             // (anything not in this list receives no adjustment)
99711             var COMMUNITYRANK = {
99712                 'meetup': +5,
99713                 'slack': +4,
99714                 'facebook': +3,
99715                 'reddit': +2,
99716                 'forum': -2,
99717                 'mailinglist': -3,
99718                 'irc': -4
99719             };
99720
99721             var detected = utilDetect();
99722             var dispatch$1 = dispatch('cancel');
99723             var _changeset;
99724             var _location;
99725
99726
99727             // string-to-date parsing in JavaScript is weird
99728             function parseEventDate(when) {
99729                 if (!when) return;
99730
99731                 var raw = when.trim();
99732                 if (!raw) return;
99733
99734                 if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
99735                     raw += 'Z';           // this forces date to be parsed as a UTC date
99736                 }
99737
99738                 var parsed = new Date(raw);
99739                 return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
99740             }
99741
99742
99743             function success(selection) {
99744                 var header = selection
99745                     .append('div')
99746                     .attr('class', 'header fillL');
99747
99748                 header
99749                     .append('button')
99750                     .attr('class', 'fr')
99751                     .on('click', function() { dispatch$1.call('cancel'); })
99752                     .call(svgIcon('#iD-icon-close'));
99753
99754                 header
99755                     .append('h3')
99756                     .text(t('success.just_edited'));
99757
99758                 var body = selection
99759                     .append('div')
99760                     .attr('class', 'body save-success fillL');
99761
99762                 var summary = body
99763                     .append('div')
99764                     .attr('class', 'save-summary');
99765
99766                 summary
99767                     .append('h3')
99768                     .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
99769
99770                 summary
99771                     .append('p')
99772                     .text(t('success.help_html'))
99773                     .append('a')
99774                     .attr('class', 'link-out')
99775                     .attr('target', '_blank')
99776                     .attr('tabindex', -1)
99777                     .attr('href', t('success.help_link_url'))
99778                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99779                     .append('span')
99780                     .text(t('success.help_link_text'));
99781
99782                 var osm = context.connection();
99783                 if (!osm) return;
99784
99785                 var changesetURL = osm.changesetURL(_changeset.id);
99786
99787                 var table = summary
99788                     .append('table')
99789                     .attr('class', 'summary-table');
99790
99791                 var row = table
99792                     .append('tr')
99793                     .attr('class', 'summary-row');
99794
99795                 row
99796                     .append('td')
99797                     .attr('class', 'cell-icon summary-icon')
99798                     .append('a')
99799                     .attr('target', '_blank')
99800                     .attr('href', changesetURL)
99801                     .append('svg')
99802                     .attr('class', 'logo-small')
99803                     .append('use')
99804                     .attr('xlink:href', '#iD-logo-osm');
99805
99806                 var summaryDetail = row
99807                     .append('td')
99808                     .attr('class', 'cell-detail summary-detail');
99809
99810                 summaryDetail
99811                     .append('a')
99812                     .attr('class', 'cell-detail summary-view-on-osm')
99813                     .attr('target', '_blank')
99814                     .attr('href', changesetURL)
99815                     .text(t('success.view_on_osm'));
99816
99817                 summaryDetail
99818                     .append('div')
99819                     .text(t('success.changeset_id', { changeset_id: _changeset.id }));
99820
99821
99822                 // Gather community polygon IDs intersecting the map..
99823                 var matchFeatures = data.community.query(context.map().center(), true) || [];
99824                 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
99825
99826                 // Gather community resources that are either global or match a polygon.
99827                 var matchResources = Object.values(data.community.resources)
99828                     .filter(function(v) { return !v.featureId || matchIDs.indexOf(v.featureId) !== -1; });
99829
99830                 if (matchResources.length) {
99831                     // sort by size ascending, then by community rank
99832                     matchResources.sort(function(a, b) {
99833                         var aSize = Infinity;
99834                         var bSize = Infinity;
99835                         var aRank = COMMUNITYRANK[a.type] || 0;
99836                         var bRank = COMMUNITYRANK[b.type] || 0;
99837
99838                         if (a.featureId) {
99839                             aSize = data.community.features[a.featureId].properties.area;
99840                         }
99841                         if (b.featureId) {
99842                             bSize = data.community.features[b.featureId].properties.area;
99843                         }
99844
99845                         return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
99846                     });
99847
99848                     body
99849                         .call(showCommunityLinks, matchResources);
99850                 }
99851             }
99852
99853
99854             function showCommunityLinks(selection, matchResources) {
99855                 var communityLinks = selection
99856                     .append('div')
99857                     .attr('class', 'save-communityLinks');
99858
99859                 communityLinks
99860                     .append('h3')
99861                     .text(t('success.like_osm'));
99862
99863                 var table = communityLinks
99864                     .append('table')
99865                     .attr('class', 'community-table');
99866
99867                 var row = table.selectAll('.community-row')
99868                     .data(matchResources);
99869
99870                 var rowEnter = row.enter()
99871                     .append('tr')
99872                     .attr('class', 'community-row');
99873
99874                 rowEnter
99875                     .append('td')
99876                     .attr('class', 'cell-icon community-icon')
99877                     .append('a')
99878                     .attr('target', '_blank')
99879                     .attr('href', function(d) { return d.url; })
99880                     .append('svg')
99881                     .attr('class', 'logo-small')
99882                     .append('use')
99883                     .attr('xlink:href', function(d) { return '#community-' + d.type; });
99884
99885                 var communityDetail = rowEnter
99886                     .append('td')
99887                     .attr('class', 'cell-detail community-detail');
99888
99889                 communityDetail
99890                     .each(showCommunityDetails);
99891
99892                 communityLinks
99893                     .append('div')
99894                     .attr('class', 'community-missing')
99895                     .text(t('success.missing'))
99896                     .append('a')
99897                     .attr('class', 'link-out')
99898                     .attr('target', '_blank')
99899                     .attr('tabindex', -1)
99900                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99901                     .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
99902                     .append('span')
99903                     .text(t('success.tell_us'));
99904             }
99905
99906
99907             function showCommunityDetails(d) {
99908                 var selection = d3_select(this);
99909                 var communityID = d.id;
99910                 var replacements = {
99911                     url: linkify(d.url),
99912                     signupUrl: linkify(d.signupUrl || d.url)
99913                 };
99914
99915                 selection
99916                     .append('div')
99917                     .attr('class', 'community-name')
99918                     .append('a')
99919                     .attr('target', '_blank')
99920                     .attr('href', d.url)
99921                     .text(t('community.' + d.id + '.name'));
99922
99923                 var descriptionHTML = t('community.' + d.id + '.description', replacements);
99924
99925                 if (d.type === 'reddit') {   // linkify subreddits  #4997
99926                     descriptionHTML = descriptionHTML
99927                         .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
99928                 }
99929
99930                 selection
99931                     .append('div')
99932                     .attr('class', 'community-description')
99933                     .html(descriptionHTML);
99934
99935                 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
99936                     selection
99937                         .append('div')
99938                         .call(uiDisclosure(context, 'community-more-' + d.id, false)
99939                             .expanded(false)
99940                             .updatePreference(false)
99941                             .title(t('success.more'))
99942                             .content(showMore)
99943                         );
99944                 }
99945
99946                 var nextEvents = (d.events || [])
99947                     .map(function(event) {
99948                         event.date = parseEventDate(event.when);
99949                         return event;
99950                     })
99951                     .filter(function(event) {               // date is valid and future (or today)
99952                         var t = event.date.getTime();
99953                         var now = (new Date()).setHours(0,0,0,0);
99954                         return !isNaN(t) && t >= now;
99955                     })
99956                     .sort(function(a, b) {                  // sort by date ascending
99957                         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
99958                     })
99959                     .slice(0, MAXEVENTS);                   // limit number of events shown
99960
99961                 if (nextEvents.length) {
99962                     selection
99963                         .append('div')
99964                         .call(uiDisclosure(context, 'community-events-' + d.id, false)
99965                             .expanded(false)
99966                             .updatePreference(false)
99967                             .title(t('success.events'))
99968                             .content(showNextEvents)
99969                         )
99970                         .select('.hide-toggle')
99971                         .append('span')
99972                         .attr('class', 'badge-text')
99973                         .text(nextEvents.length);
99974                 }
99975
99976
99977                 function showMore(selection) {
99978                     var more = selection.selectAll('.community-more')
99979                         .data([0]);
99980
99981                     var moreEnter = more.enter()
99982                         .append('div')
99983                         .attr('class', 'community-more');
99984
99985                     if (d.extendedDescription) {
99986                         moreEnter
99987                             .append('div')
99988                             .attr('class', 'community-extended-description')
99989                             .html(t('community.' + d.id + '.extendedDescription', replacements));
99990                     }
99991
99992                     if (d.languageCodes && d.languageCodes.length) {
99993                         moreEnter
99994                             .append('div')
99995                             .attr('class', 'community-languages')
99996                             .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
99997                     }
99998                 }
99999
100000
100001                 function showNextEvents(selection) {
100002                     var events = selection
100003                         .append('div')
100004                         .attr('class', 'community-events');
100005
100006                     var item = events.selectAll('.community-event')
100007                         .data(nextEvents);
100008
100009                     var itemEnter = item.enter()
100010                         .append('div')
100011                         .attr('class', 'community-event');
100012
100013                     itemEnter
100014                         .append('div')
100015                         .attr('class', 'community-event-name')
100016                         .append('a')
100017                         .attr('target', '_blank')
100018                         .attr('href', function(d) { return d.url; })
100019                         .text(function(d) {
100020                             var name = d.name;
100021                             if (d.i18n && d.id) {
100022                                 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
100023                             }
100024                             return name;
100025                         });
100026
100027                     itemEnter
100028                         .append('div')
100029                         .attr('class', 'community-event-when')
100030                         .text(function(d) {
100031                             var options = {
100032                                 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
100033                             };
100034                             if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
100035                                 options.hour = 'numeric';
100036                                 options.minute = 'numeric';
100037                             }
100038                             return d.date.toLocaleString(detected.locale, options);
100039                         });
100040
100041                     itemEnter
100042                         .append('div')
100043                         .attr('class', 'community-event-where')
100044                         .text(function(d) {
100045                             var where = d.where;
100046                             if (d.i18n && d.id) {
100047                                 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
100048                             }
100049                             return where;
100050                         });
100051
100052                     itemEnter
100053                         .append('div')
100054                         .attr('class', 'community-event-description')
100055                         .text(function(d) {
100056                             var description = d.description;
100057                             if (d.i18n && d.id) {
100058                                 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
100059                             }
100060                             return description;
100061                         });
100062                 }
100063
100064
100065                 function linkify(url, text) {
100066                     text = text || url;
100067                     return '<a target="_blank" href="' + url + '">' + text + '</a>';
100068                 }
100069             }
100070
100071
100072             success.changeset = function(_) {
100073                 if (!arguments.length) return _changeset;
100074                 _changeset = _;
100075                 return success;
100076             };
100077
100078
100079             success.location = function(_) {
100080                 if (!arguments.length) return _location;
100081                 _location = _;
100082                 return success;
100083             };
100084
100085
100086             return utilRebind(success, dispatch$1, 'on');
100087         }
100088
100089         var _isSaving = false;
100090
100091
100092         function modeSave(context) {
100093             var mode = { id: 'save' };
100094             var keybinding = utilKeybinding('modeSave');
100095
100096             var loading = uiLoading(context)
100097                 .message(t('save.uploading'))
100098                 .blocking(true);
100099
100100             var commit = uiCommit(context)
100101                 .on('cancel', cancel)
100102                 .on('save', save);
100103
100104             var _toCheck = [];
100105             var _toLoad = [];
100106             var _loaded = {};
100107             var _toLoadCount = 0;
100108             var _toLoadTotal = 0;
100109
100110             var _conflicts = [];
100111             var _errors = [];
100112             var _origChanges;
100113             var _location;
100114
100115
100116             function cancel(selectedID) {
100117                 if (selectedID) {
100118                     context.enter(modeSelect(context, [selectedID]));
100119                 } else {
100120                     context.enter(modeBrowse(context));
100121                 }
100122             }
100123
100124
100125             function save(changeset, tryAgain, checkConflicts) {
100126                 // Guard against accidentally entering save code twice - #4641
100127                 if (_isSaving && !tryAgain) {
100128                     return;
100129                 }
100130
100131                 var osm = context.connection();
100132                 if (!osm) {
100133                     cancel();
100134                     return;
100135                 }
100136
100137                 // If user somehow got logged out mid-save, try to reauthenticate..
100138                 // This can happen if they were logged in from before, but the tokens are no longer valid.
100139                 if (!osm.authenticated()) {
100140                     osm.authenticate(function(err) {
100141                         if (err) {
100142                             cancel();   // quit save mode..
100143                         } else {
100144                             save(changeset, tryAgain, checkConflicts);  // continue where we left off..
100145                         }
100146                     });
100147                     return;
100148                 }
100149
100150                 if (!_isSaving) {
100151                     keybindingOff();
100152                     context.container().call(loading);  // block input
100153                     _isSaving = true;
100154                 }
100155
100156                 var history = context.history();
100157                 var localGraph = context.graph();
100158                 var remoteGraph = coreGraph(history.base(), true);
100159
100160                 _conflicts = [];
100161                 _errors = [];
100162
100163                 // Store original changes, in case user wants to download them as an .osc file
100164                 _origChanges = history.changes(actionDiscardTags(history.difference()));
100165
100166                 // First time, `history.perform` a no-op action.
100167                 // Any conflict resolutions will be done as `history.replace`
100168                 if (!tryAgain) {
100169                     history.perform(actionNoop());
100170                 }
100171
100172                 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
100173                 if (!checkConflicts) {
100174                     upload(changeset);
100175
100176                 // Do the full (slow) conflict check..
100177                 } else {
100178                     var summary = history.difference().summary();
100179                     _toCheck = [];
100180                     for (var i = 0; i < summary.length; i++) {
100181                         var item = summary[i];
100182                         if (item.changeType === 'modified') {
100183                             _toCheck.push(item.entity.id);
100184                         }
100185                     }
100186
100187                     _toLoad = withChildNodes(_toCheck, localGraph);
100188                     _loaded = {};
100189                     _toLoadCount = 0;
100190                     _toLoadTotal = _toLoad.length;
100191
100192                     if (_toCheck.length) {
100193                         showProgress(_toLoadCount, _toLoadTotal);
100194                         _toLoad.forEach(function(id) { _loaded[id] = false; });
100195                         osm.loadMultiple(_toLoad, loaded);
100196                     } else {
100197                         upload(changeset);
100198                     }
100199                 }
100200
100201                 return;
100202
100203
100204                 function withChildNodes(ids, graph) {
100205                     var s = new Set(ids);
100206                     ids.forEach(function(id) {
100207                         var entity = graph.entity(id);
100208                         if (entity.type !== 'way') return;
100209
100210                         graph.childNodes(entity).forEach(function(child) {
100211                             if (child.version !== undefined) {
100212                                 s.add(child.id);
100213                             }
100214                         });
100215                     });
100216
100217                     return Array.from(s);
100218                 }
100219
100220
100221                 // Reload modified entities into an alternate graph and check for conflicts..
100222                 function loaded(err, result) {
100223                     if (_errors.length) return;
100224
100225                     if (err) {
100226                         _errors.push({
100227                             msg: err.message || err.responseText,
100228                             details: [ t('save.status_code', { code: err.status }) ]
100229                         });
100230                         showErrors();
100231
100232                     } else {
100233                         var loadMore = [];
100234
100235                         result.data.forEach(function(entity) {
100236                             remoteGraph.replace(entity);
100237                             _loaded[entity.id] = true;
100238                             _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
100239
100240                             if (!entity.visible) return;
100241
100242                             // Because loadMultiple doesn't download /full like loadEntity,
100243                             // need to also load children that aren't already being checked..
100244                             var i, id;
100245                             if (entity.type === 'way') {
100246                                 for (i = 0; i < entity.nodes.length; i++) {
100247                                     id = entity.nodes[i];
100248                                     if (_loaded[id] === undefined) {
100249                                         _loaded[id] = false;
100250                                         loadMore.push(id);
100251                                     }
100252                                 }
100253                             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
100254                                 for (i = 0; i < entity.members.length; i++) {
100255                                     id = entity.members[i].id;
100256                                     if (_loaded[id] === undefined) {
100257                                         _loaded[id] = false;
100258                                         loadMore.push(id);
100259                                     }
100260                                 }
100261                             }
100262                         });
100263
100264                         _toLoadCount += result.data.length;
100265                         _toLoadTotal += loadMore.length;
100266                         showProgress(_toLoadCount, _toLoadTotal);
100267
100268                         if (loadMore.length) {
100269                             _toLoad.push.apply(_toLoad, loadMore);
100270                             osm.loadMultiple(loadMore, loaded);
100271                         }
100272
100273                         if (!_toLoad.length) {
100274                             detectConflicts();
100275                         }
100276                     }
100277                 }
100278
100279
100280                 function detectConflicts() {
100281                     function choice(id, text, action) {
100282                         return { id: id, text: text, action: function() { history.replace(action); } };
100283                     }
100284                     function formatUser(d) {
100285                         return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
100286                     }
100287                     function entityName(entity) {
100288                         return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
100289                     }
100290
100291                     function sameVersions(local, remote) {
100292                         if (local.version !== remote.version) return false;
100293
100294                         if (local.type === 'way') {
100295                             var children = utilArrayUnion(local.nodes, remote.nodes);
100296                             for (var i = 0; i < children.length; i++) {
100297                                 var a = localGraph.hasEntity(children[i]);
100298                                 var b = remoteGraph.hasEntity(children[i]);
100299                                 if (a && b && a.version !== b.version) return false;
100300                             }
100301                         }
100302
100303                         return true;
100304                     }
100305
100306                     _toCheck.forEach(function(id) {
100307                         var local = localGraph.entity(id);
100308                         var remote = remoteGraph.entity(id);
100309
100310                         if (sameVersions(local, remote)) return;
100311
100312                         var action = actionMergeRemoteChanges;
100313                         var merge = action(id, localGraph, remoteGraph, formatUser);
100314
100315                         history.replace(merge);
100316
100317                         var mergeConflicts = merge.conflicts();
100318                         if (!mergeConflicts.length) return;  // merged safely
100319
100320                         var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
100321                         var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
100322                         var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
100323                         var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
100324
100325                         _conflicts.push({
100326                             id: id,
100327                             name: entityName(local),
100328                             details: mergeConflicts,
100329                             chosen: 1,
100330                             choices: [
100331                                 choice(id, keepMine, forceLocal),
100332                                 choice(id, keepTheirs, forceRemote)
100333                             ]
100334                         });
100335                     });
100336
100337                     upload(changeset);
100338                 }
100339             }
100340
100341
100342             function upload(changeset) {
100343                 var osm = context.connection();
100344                 if (!osm) {
100345                     _errors.push({ msg: 'No OSM Service' });
100346                 }
100347
100348                 if (_conflicts.length) {
100349                     _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
100350                     showConflicts(changeset);
100351
100352                 } else if (_errors.length) {
100353                     showErrors();
100354
100355                 } else {
100356                     var history = context.history();
100357                     var changes = history.changes(actionDiscardTags(history.difference()));
100358                     if (changes.modified.length || changes.created.length || changes.deleted.length) {
100359                         loadLocation();  // so it is ready when we display the save screen
100360                         osm.putChangeset(changeset, changes, uploadCallback);
100361                     } else {        // changes were insignificant or reverted by user
100362                         d3_select('.inspector-wrap *').remove();
100363                         loading.close();
100364                         _isSaving = false;
100365                         context.flush();
100366                         cancel();
100367                     }
100368                 }
100369             }
100370
100371
100372             function uploadCallback(err, changeset) {
100373                 if (err) {
100374                     if (err.status === 409) {          // 409 Conflict
100375                         save(changeset, true, true);   // tryAgain = true, checkConflicts = true
100376                     } else {
100377                         _errors.push({
100378                             msg: err.message || err.responseText,
100379                             details: [ t('save.status_code', { code: err.status }) ]
100380                         });
100381                         showErrors();
100382                     }
100383
100384                 } else {
100385                     context.history().clearSaved();
100386                     success(changeset);
100387                     // Add delay to allow for postgres replication #1646 #2678
100388                     window.setTimeout(function() {
100389                         d3_select('.inspector-wrap *').remove();
100390                         loading.close();
100391                         _isSaving = false;
100392                         context.flush();
100393                     }, 2500);
100394                 }
100395             }
100396
100397
100398             function showProgress(num, total) {
100399                 var modal = context.container().select('.loading-modal .modal-section');
100400                 var progress = modal.selectAll('.progress')
100401                     .data([0]);
100402
100403                 // enter/update
100404                 progress.enter()
100405                     .append('div')
100406                     .attr('class', 'progress')
100407                     .merge(progress)
100408                     .text(t('save.conflict_progress', { num: num, total: total }));
100409             }
100410
100411
100412             function showConflicts(changeset) {
100413                 var history = context.history();
100414                 var selection = context.container()
100415                     .select('#sidebar')
100416                     .append('div')
100417                     .attr('class','sidebar-component');
100418
100419                 loading.close();
100420                 _isSaving = false;
100421
100422                 var ui = uiConflicts(context)
100423                     .conflictList(_conflicts)
100424                     .origChanges(_origChanges)
100425                     .on('cancel', function() {
100426                         history.pop();
100427                         selection.remove();
100428                         keybindingOn();
100429                     })
100430                     .on('save', function() {
100431                         for (var i = 0; i < _conflicts.length; i++) {
100432                             if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
100433                                 var entity = context.hasEntity(_conflicts[i].id);
100434                                 if (entity && entity.type === 'way') {
100435                                     var children = utilArrayUniq(entity.nodes);
100436                                     for (var j = 0; j < children.length; j++) {
100437                                         history.replace(actionRevert(children[j]));
100438                                     }
100439                                 }
100440                                 history.replace(actionRevert(_conflicts[i].id));
100441                             }
100442                         }
100443
100444                         selection.remove();
100445                         save(changeset, true, false);  // tryAgain = true, checkConflicts = false
100446                     });
100447
100448                 selection.call(ui);
100449             }
100450
100451
100452             function showErrors() {
100453                 keybindingOn();
100454                 context.history().pop();
100455                 loading.close();
100456                 _isSaving = false;
100457
100458                 var selection = uiConfirm(context.container());
100459                 selection
100460                     .select('.modal-section.header')
100461                     .append('h3')
100462                     .text(t('save.error'));
100463
100464                 addErrors(selection, _errors);
100465                 selection.okButton();
100466             }
100467
100468
100469             function addErrors(selection, data) {
100470                 var message = selection
100471                     .select('.modal-section.message-text');
100472
100473                 var items = message
100474                     .selectAll('.error-container')
100475                     .data(data);
100476
100477                 var enter = items.enter()
100478                     .append('div')
100479                     .attr('class', 'error-container');
100480
100481                 enter
100482                     .append('a')
100483                     .attr('class', 'error-description')
100484                     .attr('href', '#')
100485                     .classed('hide-toggle', true)
100486                     .text(function(d) { return d.msg || t('save.unknown_error_details'); })
100487                     .on('click', function() {
100488                         event.preventDefault();
100489
100490                         var error = d3_select(this);
100491                         var detail = d3_select(this.nextElementSibling);
100492                         var exp = error.classed('expanded');
100493
100494                         detail.style('display', exp ? 'none' : 'block');
100495                         error.classed('expanded', !exp);
100496                     });
100497
100498                 var details = enter
100499                     .append('div')
100500                     .attr('class', 'error-detail-container')
100501                     .style('display', 'none');
100502
100503                 details
100504                     .append('ul')
100505                     .attr('class', 'error-detail-list')
100506                     .selectAll('li')
100507                     .data(function(d) { return d.details || []; })
100508                     .enter()
100509                     .append('li')
100510                     .attr('class', 'error-detail-item')
100511                     .text(function(d) { return d; });
100512
100513                 items.exit()
100514                     .remove();
100515             }
100516
100517
100518             function success(changeset) {
100519                 commit.reset();
100520
100521                 var ui = uiSuccess(context)
100522                     .changeset(changeset)
100523                     .location(_location)
100524                     .on('cancel', function() { context.ui().sidebar.hide(); });
100525
100526                 context.enter(modeBrowse(context).sidebar(ui));
100527             }
100528
100529
100530             function keybindingOn() {
100531                 d3_select(document)
100532                     .call(keybinding.on('⎋', cancel, true));
100533             }
100534
100535
100536             function keybindingOff() {
100537                 d3_select(document)
100538                     .call(keybinding.unbind);
100539             }
100540
100541
100542             // Reverse geocode current map location so we can display a message on
100543             // the success screen like "Thank you for editing around place, region."
100544             function loadLocation() {
100545                 _location = null;
100546                 if (!services$1.geocoder) return;
100547
100548                 services$1.geocoder.reverse(context.map().center(), function(err, result) {
100549                     if (err || !result || !result.address) return;
100550
100551                     var addr = result.address;
100552                     var place = (addr && (addr.town || addr.city || addr.county)) || '';
100553                     var region = (addr && (addr.state || addr.country)) || '';
100554                     var separator = (place && region) ? t('success.thank_you_where.separator') : '';
100555
100556                     _location = t('success.thank_you_where.format',
100557                         { place: place, separator: separator, region: region }
100558                     );
100559                 });
100560             }
100561
100562
100563             mode.enter = function() {
100564                 // Show sidebar
100565                 context.ui().sidebar.expand();
100566
100567                 function done() {
100568                     context.ui().sidebar.show(commit);
100569                 }
100570
100571                 keybindingOn();
100572
100573                 context.container().selectAll('#content')
100574                     .attr('class', 'inactive');
100575
100576                 var osm = context.connection();
100577                 if (!osm) {
100578                     cancel();
100579                     return;
100580                 }
100581
100582                 if (osm.authenticated()) {
100583                     done();
100584                 } else {
100585                     osm.authenticate(function(err) {
100586                         if (err) {
100587                             cancel();
100588                         } else {
100589                             done();
100590                         }
100591                     });
100592                 }
100593             };
100594
100595
100596             mode.exit = function() {
100597                 _isSaving = false;
100598
100599                 keybindingOff();
100600
100601                 context.container().selectAll('#content')
100602                     .attr('class', 'active');
100603
100604                 context.ui().sidebar.hide();
100605             };
100606
100607             return mode;
100608         }
100609
100610         function uiToolOldDrawModes(context) {
100611
100612             var tool = {
100613                 id: 'old_modes',
100614                 label: t('toolbar.add_feature')
100615             };
100616
100617             var modes = [
100618                 modeAddPoint(context, {
100619                     title: t('modes.add_point.title'),
100620                     button: 'point',
100621                     description: t('modes.add_point.description'),
100622                     preset: context.presets().item('point'),
100623                     key: '1'
100624                 }),
100625                 modeAddLine(context, {
100626                     title: t('modes.add_line.title'),
100627                     button: 'line',
100628                     description: t('modes.add_line.description'),
100629                     preset: context.presets().item('line'),
100630                     key: '2'
100631                 }),
100632                 modeAddArea(context, {
100633                     title: t('modes.add_area.title'),
100634                     button: 'area',
100635                     description: t('modes.add_area.description'),
100636                     preset: context.presets().item('area'),
100637                     key: '3'
100638                 })
100639             ];
100640
100641
100642             function enabled() {
100643                 return osmEditable();
100644             }
100645
100646             function osmEditable() {
100647                 var mode = context.mode();
100648                 return context.editable() && mode && mode.id !== 'save';
100649             }
100650
100651             modes.forEach(function(mode) {
100652                 context.keybinding().on(mode.key, function() {
100653                     if (!enabled()) return;
100654
100655                     if (mode.id === context.mode().id) {
100656                         context.enter(modeBrowse(context));
100657                     } else {
100658                         context.enter(mode);
100659                     }
100660                 });
100661             });
100662
100663             tool.render = function(selection) {
100664
100665                 var wrap = selection
100666                     .append('div')
100667                     .attr('class', 'joined')
100668                     .style('display', 'flex');
100669
100670                 context
100671                     .on('enter.editor', function(entered) {
100672                         selection.selectAll('button.add-button')
100673                             .classed('active', function(mode) { return entered.button === mode.button; });
100674                         context.container()
100675                             .classed('mode-' + entered.id, true);
100676                     });
100677
100678                 context
100679                     .on('exit.editor', function(exited) {
100680                         context.container()
100681                             .classed('mode-' + exited.id, false);
100682                     });
100683
100684
100685                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100686
100687                 context.map()
100688                     .on('move.modes', debouncedUpdate)
100689                     .on('drawn.modes', debouncedUpdate);
100690
100691                 context
100692                     .on('enter.modes', update);
100693
100694                 update();
100695
100696
100697                 function update() {
100698
100699                     var buttons = wrap.selectAll('button.add-button')
100700                         .data(modes, function(d) { return d.id; });
100701
100702                     // exit
100703                     buttons.exit()
100704                         .remove();
100705
100706                     // enter
100707                     var buttonsEnter = buttons.enter()
100708                         .append('button')
100709                         .attr('tabindex', -1)
100710                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100711                         .on('click.mode-buttons', function(d) {
100712                             if (!enabled()) return;
100713
100714                             // When drawing, ignore accidental clicks on mode buttons - #4042
100715                             var currMode = context.mode().id;
100716                             if (/^draw/.test(currMode)) return;
100717
100718                             if (d.id === currMode) {
100719                                 context.enter(modeBrowse(context));
100720                             } else {
100721                                 context.enter(d);
100722                             }
100723                         })
100724                         .call(tooltip()
100725                             .placement('bottom')
100726                             .html(true)
100727                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100728                         );
100729
100730                     buttonsEnter
100731                         .each(function(d) {
100732                             d3_select(this)
100733                                 .call(svgIcon('#iD-icon-' + d.button));
100734                         });
100735
100736                     buttonsEnter
100737                         .append('span')
100738                         .attr('class', 'label')
100739                         .text(function(mode) { return mode.title; });
100740
100741                     // if we are adding/removing the buttons, check if toolbar has overflowed
100742                     if (buttons.enter().size() || buttons.exit().size()) {
100743                         context.ui().checkOverflow('#bar', true);
100744                     }
100745
100746                     // update
100747                     buttons = buttons
100748                         .merge(buttonsEnter)
100749                         .classed('disabled', function(d) { return !enabled(); });
100750                 }
100751             };
100752
100753             return tool;
100754         }
100755
100756         function uiToolNotes(context) {
100757
100758             var tool = {
100759                 id: 'notes',
100760                 label: t('modes.add_note.label')
100761             };
100762
100763             var mode = modeAddNote(context);
100764
100765             function enabled() {
100766                 return notesEnabled() && notesEditable();
100767             }
100768
100769             function notesEnabled() {
100770                 var noteLayer = context.layers().layer('notes');
100771                 return noteLayer && noteLayer.enabled();
100772             }
100773
100774             function notesEditable() {
100775                 var mode = context.mode();
100776                 return context.map().notesEditable() && mode && mode.id !== 'save';
100777             }
100778
100779             context.keybinding().on(mode.key, function() {
100780                 if (!enabled()) return;
100781
100782                 if (mode.id === context.mode().id) {
100783                     context.enter(modeBrowse(context));
100784                 } else {
100785                     context.enter(mode);
100786                 }
100787             });
100788
100789             tool.render = function(selection) {
100790
100791                 context
100792                     .on('enter.editor.notes', function(entered) {
100793                         selection.selectAll('button.add-button')
100794                             .classed('active', function(mode) { return entered.button === mode.button; });
100795                         context.container()
100796                             .classed('mode-' + entered.id, true);
100797                     });
100798
100799                 context
100800                     .on('exit.editor.notes', function(exited) {
100801                         context.container()
100802                             .classed('mode-' + exited.id, false);
100803                     });
100804
100805
100806                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100807
100808                 context.map()
100809                     .on('move.notes', debouncedUpdate)
100810                     .on('drawn.notes', debouncedUpdate);
100811
100812                 context
100813                     .on('enter.notes', update);
100814
100815                 update();
100816
100817
100818                 function update() {
100819                     var showNotes = notesEnabled();
100820                     var data = showNotes ? [mode] : [];
100821
100822                     var buttons = selection.selectAll('button.add-button')
100823                         .data(data, function(d) { return d.id; });
100824
100825                     // exit
100826                     buttons.exit()
100827                         .remove();
100828
100829                     // enter
100830                     var buttonsEnter = buttons.enter()
100831                         .append('button')
100832                         .attr('tabindex', -1)
100833                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100834                         .on('click.notes', function(d) {
100835                             if (!enabled()) return;
100836
100837                             // When drawing, ignore accidental clicks on mode buttons - #4042
100838                             var currMode = context.mode().id;
100839                             if (/^draw/.test(currMode)) return;
100840
100841                             if (d.id === currMode) {
100842                                 context.enter(modeBrowse(context));
100843                             } else {
100844                                 context.enter(d);
100845                             }
100846                         })
100847                         .call(tooltip()
100848                             .placement('bottom')
100849                             .html(true)
100850                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100851                         );
100852
100853                     buttonsEnter
100854                         .each(function(d) {
100855                             d3_select(this)
100856                                 .call(svgIcon(d.icon || '#iD-icon-' + d.button));
100857                         });
100858
100859                     // if we are adding/removing the buttons, check if toolbar has overflowed
100860                     if (buttons.enter().size() || buttons.exit().size()) {
100861                         context.ui().checkOverflow('#bar', true);
100862                     }
100863
100864                     // update
100865                     buttons = buttons
100866                         .merge(buttonsEnter)
100867                         .classed('disabled', function(d) { return !enabled(); });
100868                 }
100869             };
100870
100871             tool.uninstall = function() {
100872                 context
100873                     .on('enter.editor.notes', null)
100874                     .on('exit.editor.notes', null)
100875                     .on('enter.notes', null);
100876
100877                 context.map()
100878                     .on('move.notes', null)
100879                     .on('drawn.notes', null);
100880             };
100881
100882             return tool;
100883         }
100884
100885         function uiToolSave(context) {
100886
100887             var tool = {
100888                 id: 'save',
100889                 label: t('save.title')
100890             };
100891
100892             var button = null;
100893             var tooltipBehavior = null;
100894             var history = context.history();
100895             var key = uiCmd('⌘S');
100896             var _numChanges = 0;
100897
100898             function isSaving() {
100899                 var mode = context.mode();
100900                 return mode && mode.id === 'save';
100901             }
100902
100903             function isDisabled() {
100904                 return _numChanges === 0 || isSaving();
100905             }
100906
100907             function save() {
100908                 event.preventDefault();
100909                 if (!context.inIntro() && !isSaving() && history.hasChanges()) {
100910                     context.enter(modeSave(context));
100911                 }
100912             }
100913
100914             function bgColor() {
100915                 var step;
100916                 if (_numChanges === 0) {
100917                     return null;
100918                 } else if (_numChanges <= 50) {
100919                     step = _numChanges / 50;
100920                     return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
100921                 } else {
100922                     step = Math.min((_numChanges - 50) / 50, 1.0);
100923                     return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
100924                 }
100925             }
100926
100927
100928             function updateCount() {
100929                 var val = history.difference().summary().length;
100930                 if (val === _numChanges) return;
100931                 _numChanges = val;
100932
100933                 if (tooltipBehavior) {
100934                     tooltipBehavior
100935                         .title(uiTooltipHtml(
100936                             t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
100937                         );
100938                 }
100939
100940                 if (button) {
100941                     button
100942                         .classed('disabled', isDisabled())
100943                         .style('background', bgColor());
100944
100945                     button.select('span.count')
100946                         .text(_numChanges);
100947                 }
100948             }
100949
100950
100951             tool.render = function(selection) {
100952                 tooltipBehavior = tooltip()
100953                     .placement('bottom')
100954                     .html(true)
100955                     .title(uiTooltipHtml(t('save.no_changes'), key));
100956
100957                 button = selection
100958                     .append('button')
100959                     .attr('class', 'save disabled bar-button')
100960                     .attr('tabindex', -1)
100961                     .on('click', save)
100962                     .call(tooltipBehavior);
100963
100964                 button
100965                     .call(svgIcon('#iD-icon-save'));
100966
100967                 button
100968                     .append('span')
100969                     .attr('class', 'count')
100970                     .text('0');
100971
100972                 updateCount();
100973
100974
100975                 context.keybinding()
100976                     .on(key, save, true);
100977
100978
100979                 context.history()
100980                     .on('change.save', updateCount);
100981
100982                 context
100983                     .on('enter.save', function() {
100984                         if (button) {
100985                             button
100986                                 .classed('disabled', isDisabled());
100987
100988                             if (isSaving()) {
100989                                 button.call(tooltipBehavior.hide);
100990                             }
100991                         }
100992                     });
100993             };
100994
100995
100996             tool.uninstall = function() {
100997                 context.keybinding()
100998                     .off(key, true);
100999
101000                 context.history()
101001                     .on('change.save', null);
101002
101003                 context
101004                     .on('enter.save', null);
101005
101006                 button = null;
101007                 tooltipBehavior = null;
101008             };
101009
101010             return tool;
101011         }
101012
101013         function uiToolSidebarToggle(context) {
101014
101015             var tool = {
101016                 id: 'sidebar_toggle',
101017                 label: t('toolbar.inspect')
101018             };
101019
101020             tool.render = function(selection) {
101021                 selection
101022                     .append('button')
101023                     .attr('class', 'bar-button')
101024                     .attr('tabindex', -1)
101025                     .on('click', function() {
101026                         context.ui().sidebar.toggle();
101027                     })
101028                     .call(tooltip()
101029                         .placement('bottom')
101030                         .html(true)
101031                         .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
101032                     )
101033                     .call(svgIcon('#iD-icon-sidebar-' + (textDirection === 'rtl' ? 'right' : 'left')));
101034             };
101035
101036             return tool;
101037         }
101038
101039         function uiToolUndoRedo(context) {
101040
101041             var tool = {
101042                 id: 'undo_redo',
101043                 label: t('toolbar.undo_redo')
101044             };
101045
101046             var commands = [{
101047                 id: 'undo',
101048                 cmd: uiCmd('⌘Z'),
101049                 action: function() { if (editable()) context.undo(); },
101050                 annotation: function() { return context.history().undoAnnotation(); }
101051             }, {
101052                 id: 'redo',
101053                 cmd: uiCmd('⌘⇧Z'),
101054                 action: function() { if (editable()) context.redo(); },
101055                 annotation: function() { return context.history().redoAnnotation(); }
101056             }];
101057
101058
101059             function editable() {
101060                 var mode = context.mode();
101061                 return context.editable() && mode && mode.id !== 'save';
101062             }
101063
101064
101065             tool.render = function(selection) {
101066                 var tooltipBehavior = tooltip()
101067                     .placement('bottom')
101068                     .html(true)
101069                     .title(function (d) {
101070                         return uiTooltipHtml(d.annotation() ?
101071                             t(d.id + '.tooltip', {action: d.annotation()}) :
101072                             t(d.id + '.nothing'), d.cmd);
101073                     });
101074
101075                 var buttons = selection.selectAll('button')
101076                     .data(commands)
101077                     .enter()
101078                     .append('button')
101079                     .attr('class', function(d) { return 'disabled ' + d.id + '-button bar-button'; })
101080                     .on('click', function(d) { return d.action(); })
101081                     .call(tooltipBehavior);
101082
101083                 buttons.each(function(d) {
101084                     var iconName = d.id;
101085                     if (textDirection === 'rtl') {
101086                         if (iconName === 'undo') {
101087                             iconName = 'redo';
101088                         } else if (iconName === 'redo') {
101089                             iconName = 'undo';
101090                         }
101091                     }
101092                     d3_select(this)
101093                         .call(svgIcon('#iD-icon-' + iconName));
101094                 });
101095
101096                 context.keybinding()
101097                     .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
101098                     .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
101099
101100
101101                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101102
101103                 context.map()
101104                     .on('move.undo_redo', debouncedUpdate)
101105                     .on('drawn.undo_redo', debouncedUpdate);
101106
101107                 context.history()
101108                     .on('change.undo_redo', function(difference) {
101109                         if (difference) update();
101110                     });
101111
101112                 context
101113                     .on('enter.undo_redo', update);
101114
101115
101116                 function update() {
101117                     buttons
101118                         .property('disabled', !editable())
101119                         .classed('disabled', function(d) {
101120                             return !editable() || !d.annotation();
101121                         })
101122                         .each(function() {
101123                             var selection = d3_select(this);
101124                             if (selection.property('tooltipVisible')) {
101125                                 selection.call(tooltipBehavior.show);
101126                             }
101127                         });
101128                 }
101129             };
101130
101131             tool.uninstall = function() {
101132                 context.keybinding()
101133                     .off(commands[0].cmd)
101134                     .off(commands[1].cmd);
101135
101136                 context.map()
101137                     .on('move.undo_redo', null)
101138                     .on('drawn.undo_redo', null);
101139
101140                 context.history()
101141                     .on('change.undo_redo', null);
101142
101143                 context
101144                     .on('enter.undo_redo', null);
101145             };
101146
101147             return tool;
101148         }
101149
101150         function uiTopToolbar(context) {
101151
101152             var sidebarToggle = uiToolSidebarToggle(context),
101153                 modes = uiToolOldDrawModes(context),
101154                 //searchAdd = uiToolSearchAdd(context),
101155                 //addFavorite = uiToolAddFavorite(context),
101156                 //addRecent = uiToolAddRecent(context),
101157                 notes = uiToolNotes(context),
101158                 undoRedo = uiToolUndoRedo(context),
101159                 save = uiToolSave(context);
101160
101161             function notesEnabled() {
101162                 var noteLayer = context.layers().layer('notes');
101163                 return noteLayer && noteLayer.enabled();
101164             }
101165
101166             function topToolbar(bar) {
101167
101168                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101169                 context.layers()
101170                     .on('change.topToolbar', debouncedUpdate);
101171
101172                 context.presets()
101173                     .on('favoritePreset.topToolbar', update)
101174                     .on('recentsChange.topToolbar', update);
101175
101176                 update();
101177
101178                 function update() {
101179
101180                     var tools = [
101181                         sidebarToggle,
101182                         'spacer',
101183                         modes
101184                     //    searchAdd
101185                     ];
101186                     /*
101187                     if (context.presets().getFavorites().length > 0) {
101188                         tools.push(addFavorite);
101189                     }
101190
101191                     if (addRecent.shouldShow()) {
101192                         tools.push(addRecent);
101193                     }*/
101194
101195                     tools.push('spacer');
101196
101197                     if (notesEnabled()) {
101198                         tools = tools.concat([notes, 'spacer']);
101199                     }
101200
101201                     tools = tools.concat([undoRedo, save]);
101202
101203                     var toolbarItems = bar.selectAll('.toolbar-item')
101204                         .data(tools, function(d) {
101205                             return d.id || d;
101206                         });
101207
101208                     toolbarItems.exit()
101209                         .each(function(d) {
101210                             if (d.uninstall) {
101211                                 d.uninstall();
101212                             }
101213                         })
101214                         .remove();
101215
101216                     var itemsEnter = toolbarItems
101217                         .enter()
101218                         .append('div')
101219                         .attr('class', function(d) {
101220                             var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
101221                             if (d.klass) classes += ' ' + d.klass;
101222                             return classes;
101223                         });
101224
101225                     var actionableItems = itemsEnter.filter(function(d) { return d !== 'spacer'; });
101226
101227                     actionableItems
101228                         .append('div')
101229                         .attr('class', 'item-content')
101230                         .each(function(d) {
101231                             d3_select(this).call(d.render, bar);
101232                         });
101233
101234                     actionableItems
101235                         .append('div')
101236                         .attr('class', 'item-label')
101237                         .text(function(d) {
101238                             return d.label;
101239                         });
101240                 }
101241
101242             }
101243
101244             return topToolbar;
101245         }
101246
101247         // these are module variables so they are preserved through a ui.restart()
101248         var sawVersion = null;
101249         var isNewVersion = false;
101250         var isNewUser = false;
101251
101252
101253         function uiVersion(context) {
101254
101255             var currVersion = context.version;
101256             var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
101257
101258             if (sawVersion === null && matchedVersion !== null) {
101259                 isNewVersion = (context.storage('sawVersion') !== currVersion);
101260                 isNewUser = !context.storage('sawSplash');
101261                 context.storage('sawVersion', currVersion);
101262                 sawVersion = currVersion;
101263             }
101264
101265             return function(selection) {
101266                 selection
101267                     .append('a')
101268                     .attr('target', '_blank')
101269                     .attr('tabindex', -1)
101270                     .attr('href', 'https://github.com/openstreetmap/iD')
101271                     .text(currVersion);
101272
101273                 // only show new version indicator to users that have used iD before
101274                 if (isNewVersion && !isNewUser) {
101275                     selection
101276                         .append('div')
101277                         .attr('class', 'badge')
101278                         .append('a')
101279                         .attr('target', '_blank')
101280                         .attr('tabindex', -1)
101281                         .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
101282                         .call(svgIcon('#maki-gift-11'))
101283                         .call(tooltip()
101284                             .title(t('version.whats_new', { version: currVersion }))
101285                             .placement('top')
101286                         );
101287                 }
101288             };
101289         }
101290
101291         function uiZoom(context) {
101292             var zooms = [{
101293                 id: 'zoom-in',
101294                 icon: 'plus',
101295                 title: t('zoom.in'),
101296                 action: context.zoomIn,
101297                 key: '+'
101298             }, {
101299                 id: 'zoom-out',
101300                 icon: 'minus',
101301                 title: t('zoom.out'),
101302                 action: context.zoomOut,
101303                 key: '-'
101304             }];
101305
101306
101307             function zoomIn() {
101308                 event.preventDefault();
101309                 context.zoomIn();
101310             }
101311
101312
101313             function zoomOut() {
101314                 event.preventDefault();
101315                 context.zoomOut();
101316             }
101317
101318
101319             function zoomInFurther() {
101320                 event.preventDefault();
101321                 context.zoomInFurther();
101322             }
101323
101324
101325             function zoomOutFurther() {
101326                 event.preventDefault();
101327                 context.zoomOutFurther();
101328             }
101329
101330
101331             return function(selection) {
101332                 var button = selection.selectAll('button')
101333                     .data(zooms)
101334                     .enter()
101335                     .append('button')
101336                     .attr('tabindex', -1)
101337                     .attr('class', function(d) { return d.id; })
101338                     .on('click.editor', function(d) { d.action(); })
101339                     .call(tooltip()
101340                         .placement((textDirection === 'rtl') ? 'right' : 'left')
101341                         .html(true)
101342                         .title(function(d) {
101343                             return uiTooltipHtml(d.title, d.key);
101344                         })
101345                     );
101346
101347                 button.each(function(d) {
101348                     d3_select(this)
101349                         .call(svgIcon('#iD-icon-' + d.icon, 'light'));
101350                 });
101351
101352                 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
101353                     context.keybinding().on([key], zoomIn);
101354                     context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
101355                 });
101356
101357                 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
101358                     context.keybinding().on([key], zoomOut);
101359                     context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
101360                 });
101361             };
101362         }
101363
101364         function uiInit(context) {
101365             var _initCounter = 0;
101366             var _initCallback;
101367             var _needWidth = {};
101368
101369
101370             function render(container) {
101371                 container
101372                     .attr('dir', textDirection);
101373
101374                 // setup fullscreen keybindings (no button shown at this time)
101375                 container
101376                     .call(uiFullScreen(context));
101377
101378                 var map = context.map();
101379                 map.redrawEnable(false);  // don't draw until we've set zoom/lat/long
101380
101381                 container
101382                     .append('svg')
101383                     .attr('id', 'defs')
101384                     .call(svgDefs(context));
101385
101386                 container
101387                     .append('div')
101388                     .attr('id', 'sidebar')
101389                     .call(ui.sidebar);
101390
101391                 var content = container
101392                     .append('div')
101393                     .attr('id', 'content')
101394                     .attr('class', 'active');
101395
101396                 // Top toolbar
101397                 content
101398                     .append('div')
101399                     .attr('id', 'bar')
101400                     .attr('class', 'fillD')
101401                     .call(uiTopToolbar(context));
101402
101403                 content
101404                     .append('div')
101405                     .attr('id', 'map')
101406                     .attr('dir', 'ltr')
101407                     .call(map);
101408
101409
101410                 // Map controls
101411                 var controls = content
101412                     .append('div')
101413                     .attr('class', 'map-controls');
101414
101415                 controls
101416                     .append('div')
101417                     .attr('class', 'map-control zoombuttons')
101418                     .call(uiZoom(context));
101419
101420                 controls
101421                     .append('div')
101422                     .attr('class', 'map-control geolocate-control')
101423                     .call(uiGeolocate(context));
101424
101425                 var background = uiBackground(context);
101426                 controls
101427                     .append('div')
101428                     .attr('class', 'map-control background-control')
101429                     .call(background.renderToggleButton);
101430
101431                 var mapData = uiMapData(context);
101432                 controls
101433                     .append('div')
101434                     .attr('class', 'map-control map-data-control')
101435                     .call(mapData.renderToggleButton);
101436
101437                 var issues = uiIssues(context);
101438                 controls
101439                     .append('div')
101440                     .attr('class', 'map-control map-issues-control')
101441                     .call(issues.renderToggleButton);
101442
101443                 var help = uiHelp(context);
101444                 controls
101445                     .append('div')
101446                     .attr('class', 'map-control help-control')
101447                     .call(help.renderToggleButton);
101448
101449                 content
101450                     .append('div')
101451                     .attr('class', 'spinner')
101452                     .call(uiSpinner(context));
101453
101454                 // Add attribution and footer
101455                 var about = content
101456                     .append('div')
101457                     .attr('id', 'about');
101458
101459                 about
101460                     .append('div')
101461                     .attr('id', 'attrib')
101462                     .attr('dir', 'ltr')
101463                     .call(uiAttribution(context));
101464
101465                 about
101466                     .append('div')
101467                     .attr('class', 'api-status')
101468                     .call(uiStatus(context));
101469
101470
101471                 var footer = about
101472                     .append('div')
101473                     .attr('id', 'footer')
101474                     .attr('class', 'fillD');
101475
101476                 footer
101477                     .append('div')
101478                     .attr('id', 'flash-wrap')
101479                     .attr('class', 'footer-hide');
101480
101481                 var footerWrap = footer
101482                     .append('div')
101483                     .attr('id', 'footer-wrap')
101484                     .attr('class', 'footer-show');
101485
101486                 footerWrap
101487                     .append('div')
101488                     .attr('id', 'scale-block')
101489                     .call(uiScale(context));
101490
101491                 var aboutList = footerWrap
101492                     .append('div')
101493                     .attr('id', 'info-block')
101494                     .append('ul')
101495                     .attr('id', 'about-list');
101496
101497                 if (!context.embed()) {
101498                     aboutList
101499                         .call(uiAccount(context));
101500                 }
101501
101502                 aboutList
101503                     .append('li')
101504                     .attr('class', 'version')
101505                     .call(uiVersion(context));
101506
101507                 var issueLinks = aboutList
101508                     .append('li');
101509
101510                 issueLinks
101511                     .append('a')
101512                     .attr('target', '_blank')
101513                     .attr('tabindex', -1)
101514                     .attr('href', 'https://github.com/openstreetmap/iD/issues')
101515                     .call(svgIcon('#iD-icon-bug', 'light'))
101516                     .call(tooltip().title(t('report_a_bug')).placement('top'));
101517
101518                 issueLinks
101519                     .append('a')
101520                     .attr('target', '_blank')
101521                     .attr('tabindex', -1)
101522                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
101523                     .call(svgIcon('#iD-icon-translate', 'light'))
101524                     .call(tooltip().title(t('help_translate')).placement('top'));
101525
101526                 aboutList
101527                     .append('li')
101528                     .attr('class', 'feature-warning')
101529                     .attr('tabindex', -1)
101530                     .call(uiFeatureInfo(context));
101531
101532                 aboutList
101533                     .append('li')
101534                     .attr('class', 'user-list')
101535                     .attr('tabindex', -1)
101536                     .call(uiContributors(context));
101537
101538
101539                 // Setup map dimensions and move map to initial center/zoom.
101540                 // This should happen after #content and toolbars exist.
101541                 ui.onResize();
101542                 map.redrawEnable(true);
101543
101544                 var hash = behaviorHash(context);
101545                 hash();
101546                 if (!hash.hadHash) {
101547                     map.centerZoom([0, 0], 2);
101548                 }
101549
101550
101551                 var overMap = content
101552                     .append('div')
101553                     .attr('class', 'over-map');
101554
101555                 // Add panes
101556                 // This should happen after map is initialized, as some require surface()
101557                 var panes = overMap
101558                     .append('div')
101559                     .attr('class', 'map-panes');
101560
101561                 panes
101562                     .call(background.renderPane)
101563                     .call(mapData.renderPane)
101564                     .call(issues.renderPane)
101565                     .call(help.renderPane);
101566
101567                 // Add absolutely-positioned elements that sit on top of the map
101568                 // This should happen after the map is ready (center/zoom)
101569                 overMap
101570                     .call(uiMapInMap(context))
101571                     .call(uiInfo(context))
101572                     .call(uiNotice(context));
101573
101574
101575                 overMap
101576                     .append('div')
101577                     .attr('id', 'photoviewer')
101578                     .classed('al', true)       // 'al'=left,  'ar'=right
101579                     .classed('hide', true)
101580                     .call(ui.photoviewer);
101581
101582
101583                 // Bind events
101584                 window.onbeforeunload = function() {
101585                     return context.save();
101586                 };
101587                 window.onunload = function() {
101588                     context.history().unlock();
101589                 };
101590
101591                 d3_select(window)
101592                     .on('gesturestart.editor', eventCancel)
101593                     .on('gesturechange.editor', eventCancel)
101594                     .on('gestureend.editor', eventCancel)
101595                     .on('resize.editor', ui.onResize);
101596
101597
101598                 var panPixels = 80;
101599                 context.keybinding()
101600                     .on('⌫', function() { event.preventDefault(); })
101601                     .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
101602                     .on('←', pan([panPixels, 0]))
101603                     .on('↑', pan([0, panPixels]))
101604                     .on('→', pan([-panPixels, 0]))
101605                     .on('↓', pan([0, -panPixels]))
101606                     .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
101607                     .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
101608                     .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
101609                     .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
101610
101611                 context.enter(modeBrowse(context));
101612
101613                 if (!_initCounter++) {
101614                     if (!hash.startWalkthrough) {
101615                         context.container()
101616                             .call(uiSplash(context))
101617                             .call(uiRestore(context));
101618                     }
101619
101620                     context.container()
101621                         .call(uiShortcuts(context));
101622                 }
101623
101624                 var osm = context.connection();
101625                 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
101626
101627                 if (osm && auth) {
101628                     osm
101629                         .on('authLoading.ui', function() {
101630                             context.container()
101631                                 .call(auth);
101632                         })
101633                         .on('authDone.ui', function() {
101634                             auth.close();
101635                         });
101636                 }
101637
101638                 _initCounter++;
101639
101640                 if (hash.startWalkthrough) {
101641                     hash.startWalkthrough = false;
101642                     context.container().call(uiIntro(context));
101643                 }
101644
101645
101646                 function pan(d) {
101647                     return function() {
101648                         if (d3_select('.combobox').size()) return;
101649                         event.preventDefault();
101650                         context.pan(d, 100);
101651                     };
101652                 }
101653
101654                 function eventCancel() {
101655                     event.preventDefault();
101656                 }
101657             }
101658
101659
101660             function ui(node, callback) {
101661                 _initCallback = callback;
101662                 var container = d3_select(node);
101663                 context.container(container);
101664                 context.loadLocale(function(err) {
101665                     if (!err) {
101666                         render(container);
101667                     }
101668                     if (callback) {
101669                         callback(err);
101670                     }
101671                 });
101672             }
101673
101674
101675             ui.restart = function(arg) {
101676                 context.keybinding().clear();
101677                 context.locale(arg);
101678                 context.loadLocale(function(err) {
101679                     if (!err) {
101680                         context.container().selectAll('*').remove();
101681                         render(context.container());
101682                         if (_initCallback) _initCallback();
101683                     }
101684                 });
101685             };
101686
101687
101688             ui.sidebar = uiSidebar(context);
101689
101690             ui.photoviewer = uiPhotoviewer(context);
101691
101692             ui.onResize = function(withPan) {
101693                 var map = context.map();
101694
101695                 // Recalc dimensions of map and sidebar.. (`true` = force recalc)
101696                 // This will call `getBoundingClientRect` and trigger reflow,
101697                 //  but the values will be cached for later use.
101698                 var mapDimensions = utilGetDimensions(d3_select('#content'), true);
101699                 utilGetDimensions(d3_select('#sidebar'), true);
101700
101701                 if (withPan !== undefined) {
101702                     map.redrawEnable(false);
101703                     map.pan(withPan);
101704                     map.redrawEnable(true);
101705                 }
101706                 map.dimensions(mapDimensions);
101707
101708                 ui.photoviewer.onMapResize();
101709
101710                 // check if header or footer have overflowed
101711                 ui.checkOverflow('#bar');
101712                 ui.checkOverflow('#footer');
101713
101714                 // Use outdated code so it works on Explorer
101715                 var resizeWindowEvent = document.createEvent('Event');
101716
101717                 resizeWindowEvent.initEvent('resizeWindow', true, true);
101718
101719                 document.dispatchEvent(resizeWindowEvent);
101720             };
101721
101722
101723             // Call checkOverflow when resizing or whenever the contents change.
101724             ui.checkOverflow = function(selector, reset) {
101725                 if (reset) {
101726                     delete _needWidth[selector];
101727                 }
101728
101729                 var element = d3_select(selector);
101730                 var scrollWidth = element.property('scrollWidth');
101731                 var clientWidth = element.property('clientWidth');
101732                 var needed = _needWidth[selector] || scrollWidth;
101733
101734                 if (scrollWidth > clientWidth) {    // overflow happening
101735                     element.classed('narrow', true);
101736                     if (!_needWidth[selector]) {
101737                         _needWidth[selector] = scrollWidth;
101738                     }
101739
101740                 } else if (scrollWidth >= needed) {
101741                     element.classed('narrow', false);
101742                 }
101743             };
101744
101745             ui.togglePanes = function(showPane) {
101746                 var shownPanes = d3_selectAll('.map-pane.shown');
101747
101748                 var side = textDirection === 'ltr' ? 'right' : 'left';
101749
101750                 shownPanes
101751                     .classed('shown', false);
101752
101753                 d3_selectAll('.map-control button')
101754                     .classed('active', false);
101755
101756                 if (showPane) {
101757                     shownPanes
101758                         .style('display', 'none')
101759                         .style(side, '-500px');
101760
101761                     d3_selectAll('.' + showPane.attr('pane') + '-control button')
101762                         .classed('active', true);
101763
101764                     showPane
101765                         .classed('shown', true)
101766                         .style('display', 'block');
101767                     if (shownPanes.empty()) {
101768                         showPane
101769                             .style('display', 'block')
101770                             .style(side, '-500px')
101771                             .transition()
101772                             .duration(200)
101773                             .style(side, '0px');
101774                     } else {
101775                         showPane
101776                             .style(side, '0px');
101777                     }
101778                 } else {
101779                     shownPanes
101780                         .style('display', 'block')
101781                         .style(side, '0px')
101782                         .transition()
101783                         .duration(200)
101784                         .style(side, '-500px')
101785                         .on('end', function() {
101786                             d3_select(this).style('display', 'none');
101787                         });
101788                 }
101789             };
101790
101791             return ui;
101792         }
101793
101794         function coreContext() {
101795             var dispatch$1 = dispatch('enter', 'exit', 'change');
101796             var context = utilRebind({}, dispatch$1, 'on');
101797             var _deferred = new Set();
101798
101799             context.version = '2.15.2';
101800
101801             // create a special translation that contains the keys in place of the strings
101802             var tkeys = JSON.parse(JSON.stringify(en));  // clone deep
101803             var parents = [];
101804
101805             function traverser(v, k, obj) {
101806                 parents.push(k);
101807                 if (typeof v === 'object') {
101808                     forOwn(v, traverser);
101809                 } else if (typeof v === 'string') {
101810                     obj[k] = parents.join('.');
101811                 }
101812                 parents.pop();
101813             }
101814
101815             function forOwn(obj, fn) {
101816                 Object.keys(obj).forEach(function(k) { fn(obj[k], k, obj); });
101817             }
101818
101819             forOwn(tkeys, traverser);
101820             addTranslation('_tkeys_', tkeys);
101821
101822             addTranslation('en', en);
101823             setLocale('en');
101824
101825
101826             // https://github.com/openstreetmap/iD/issues/772
101827             // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
101828             var storage;
101829             try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
101830             storage = storage || (function() {
101831                 var s = {};
101832                 return {
101833                     getItem: function(k) { return s[k]; },
101834                     setItem: function(k, v) { s[k] = v; },
101835                     removeItem: function(k) { delete s[k]; }
101836                 };
101837             })();
101838
101839             context.storage = function(k, v) {
101840                 try {
101841                     if (arguments.length === 1) return storage.getItem(k);
101842                     else if (v === null) storage.removeItem(k);
101843                     else storage.setItem(k, v);
101844                 } catch (e) {
101845                     // localstorage quota exceeded
101846                     /* eslint-disable no-console */
101847                     if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
101848                     /* eslint-enable no-console */
101849                 }
101850             };
101851
101852
101853             /* User interface and keybinding */
101854             var ui;
101855             context.ui = function() { return ui; };
101856
101857             var keybinding = utilKeybinding('context');
101858             context.keybinding = function() { return keybinding; };
101859             d3_select(document).call(keybinding);
101860
101861
101862             /* Straight accessors. Avoid using these if you can. */
101863             var connection, history, validator;
101864             context.connection = function() { return connection; };
101865             context.history = function() { return history; };
101866             context.validator = function() { return validator; };
101867
101868             /* Connection */
101869             context.preauth = function(options) {
101870                 if (connection) {
101871                     connection.switch(options);
101872                 }
101873                 return context;
101874             };
101875
101876
101877             function afterLoad(cid, callback) {
101878                 return function(err, result) {
101879                     if (err) {
101880                         // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
101881                         if (err.status === 400 || err.status === 401 || err.status === 403) {
101882                             if (connection) {
101883                                 connection.logout();
101884                             }
101885                         }
101886                         if (typeof callback === 'function') {
101887                             callback(err);
101888                         }
101889                         return;
101890
101891                     } else if (connection && connection.getConnectionId() !== cid) {
101892                         if (typeof callback === 'function') {
101893                             callback({ message: 'Connection Switched', status: -1 });
101894                         }
101895                         return;
101896
101897                     } else {
101898                         history.merge(result.data, result.extent);
101899                         if (typeof callback === 'function') {
101900                             callback(err, result);
101901                         }
101902                         return;
101903                     }
101904                 };
101905             }
101906
101907
101908             context.loadTiles = function(projection, callback) {
101909                 var handle = window.requestIdleCallback(function() {
101910                     _deferred.delete(handle);
101911                     if (connection && context.editable()) {
101912                         var cid = connection.getConnectionId();
101913                         connection.loadTiles(projection, afterLoad(cid, callback));
101914                     }
101915                 });
101916                 _deferred.add(handle);
101917             };
101918
101919             context.loadTileAtLoc = function(loc, callback) {
101920                 var handle = window.requestIdleCallback(function() {
101921                     _deferred.delete(handle);
101922                     if (connection && context.editable()) {
101923                         var cid = connection.getConnectionId();
101924                         connection.loadTileAtLoc(loc, afterLoad(cid, callback));
101925                     }
101926                 });
101927                 _deferred.add(handle);
101928             };
101929
101930             context.loadEntity = function(entityID, callback) {
101931                 if (connection) {
101932                     var cid = connection.getConnectionId();
101933                     connection.loadEntity(entityID, afterLoad(cid, callback));
101934                 }
101935             };
101936
101937             context.zoomToEntity = function(entityID, zoomTo) {
101938                 if (zoomTo !== false) {
101939                     this.loadEntity(entityID, function(err, result) {
101940                         if (err) return;
101941                         var entity = result.data.find(function(e) { return e.id === entityID; });
101942                         if (entity) {
101943                             map.zoomTo(entity);
101944                         }
101945                     });
101946                 }
101947
101948                 map.on('drawn.zoomToEntity', function() {
101949                     if (!context.hasEntity(entityID)) return;
101950                     map.on('drawn.zoomToEntity', null);
101951                     context.on('enter.zoomToEntity', null);
101952                     context.enter(modeSelect(context, [entityID]));
101953                 });
101954
101955                 context.on('enter.zoomToEntity', function() {
101956                     if (mode.id !== 'browse') {
101957                         map.on('drawn.zoomToEntity', null);
101958                         context.on('enter.zoomToEntity', null);
101959                     }
101960                 });
101961             };
101962
101963             var minEditableZoom = 16;
101964             context.minEditableZoom = function(val) {
101965                 if (!arguments.length) return minEditableZoom;
101966                 minEditableZoom = val;
101967                 if (connection) {
101968                     connection.tileZoom(val);
101969                 }
101970                 return context;
101971             };
101972
101973
101974             /* History */
101975             var inIntro = false;
101976             context.inIntro = function(val) {
101977                 if (!arguments.length) return inIntro;
101978                 inIntro = val;
101979                 return context;
101980             };
101981
101982             context.save = function() {
101983                 // no history save, no message onbeforeunload
101984                 if (inIntro || d3_select('.modal').size()) return;
101985
101986                 var canSave;
101987                 if (mode && mode.id === 'save') {
101988                     canSave = false;
101989
101990                     // Attempt to prevent user from creating duplicate changes - see #5200
101991                     if (services$1.osm && services$1.osm.isChangesetInflight()) {
101992                         history.clearSaved();
101993                         return;
101994                     }
101995
101996                 } else {
101997                     canSave = context.selectedIDs().every(function(id) {
101998                         var entity = context.hasEntity(id);
101999                         return entity && !entity.isDegenerate();
102000                     });
102001                 }
102002
102003                 if (canSave) {
102004                     history.save();
102005                 }
102006                 if (history.hasChanges()) {
102007                     return t('save.unsaved_changes');
102008                 }
102009             };
102010
102011
102012             /* Graph */
102013             context.hasEntity = function(id) {
102014                 return history.graph().hasEntity(id);
102015             };
102016             context.entity = function(id) {
102017                 return history.graph().entity(id);
102018             };
102019             context.childNodes = function(way) {
102020                 return history.graph().childNodes(way);
102021             };
102022             context.geometry = function(id) {
102023                 return context.entity(id).geometry(history.graph());
102024             };
102025
102026
102027             /* Modes */
102028             var mode;
102029             context.mode = function() {
102030                 return mode;
102031             };
102032             context.enter = function(newMode) {
102033                 if (mode) {
102034                     mode.exit();
102035                     dispatch$1.call('exit', this, mode);
102036                 }
102037
102038                 mode = newMode;
102039                 mode.enter();
102040                 dispatch$1.call('enter', this, mode);
102041             };
102042
102043             context.selectedIDs = function() {
102044                 if (mode && mode.selectedIDs) {
102045                     return mode.selectedIDs();
102046                 } else {
102047                     return [];
102048                 }
102049             };
102050
102051             context.activeID = function() {
102052                 return mode && mode.activeID && mode.activeID();
102053             };
102054
102055             var _selectedNoteID;
102056             context.selectedNoteID = function(noteID) {
102057                 if (!arguments.length) return _selectedNoteID;
102058                 _selectedNoteID = noteID;
102059                 return context;
102060             };
102061
102062             var _selectedErrorID;
102063             context.selectedErrorID = function(errorID) {
102064                 if (!arguments.length) return _selectedErrorID;
102065                 _selectedErrorID = errorID;
102066                 return context;
102067             };
102068
102069
102070             /* Behaviors */
102071             context.install = function(behavior) {
102072                 context.surface().call(behavior);
102073             };
102074             context.uninstall = function(behavior) {
102075                 context.surface().call(behavior.off);
102076             };
102077
102078
102079             /* Copy/Paste */
102080             var copyIDs = [], copyGraph;
102081             context.copyGraph = function() { return copyGraph; };
102082             context.copyIDs = function(val) {
102083                 if (!arguments.length) return copyIDs;
102084                 copyIDs = val;
102085                 copyGraph = history.graph();
102086                 return context;
102087             };
102088
102089
102090             /* Background */
102091             var background;
102092             context.background = function() { return background; };
102093
102094
102095             /* Features */
102096             var features;
102097             context.features = function() { return features; };
102098             context.hasHiddenConnections = function(id) {
102099                 var graph = history.graph();
102100                 var entity = graph.entity(id);
102101                 return features.hasHiddenConnections(entity, graph);
102102             };
102103
102104
102105             /* Photos */
102106             var photos;
102107             context.photos = function() { return photos; };
102108
102109
102110             /* Presets */
102111             var presets;
102112             context.presets = function() { return presets; };
102113
102114
102115             /* Map */
102116             var map;
102117             context.map = function() { return map; };
102118             context.layers = function() { return map.layers; };
102119             context.surface = function() { return map.surface; };
102120             context.editable = function() { return map.editable(); };
102121             context.surfaceRect = function() {
102122                 return map.surface.node().getBoundingClientRect();
102123             };
102124
102125
102126             /* Debug */
102127             var debugFlags = {
102128                 tile: false,        // tile boundaries
102129                 collision: false,   // label collision bounding boxes
102130                 imagery: false,     // imagery bounding polygons
102131                 community: false,   // community bounding polygons
102132                 imperial: false,    // imperial (not metric) bounding polygons
102133                 driveLeft: false,   // driveLeft bounding polygons
102134                 target: false,      // touch targets
102135                 downloaded: false   // downloaded data from osm
102136             };
102137             context.debugFlags = function() {
102138                 return debugFlags;
102139             };
102140             context.setDebug = function(flag, val) {
102141                 if (arguments.length === 1) val = true;
102142                 debugFlags[flag] = val;
102143                 dispatch$1.call('change');
102144                 return context;
102145             };
102146             context.getDebug = function(flag) {
102147                 return flag && debugFlags[flag];
102148             };
102149
102150
102151             /* Container */
102152             var container = d3_select(document.body);
102153             context.container = function(val) {
102154                 if (!arguments.length) return container;
102155                 container = val;
102156                 container.classed('id-container', true);
102157                 return context;
102158             };
102159             var embed;
102160             context.embed = function(val) {
102161                 if (!arguments.length) return embed;
102162                 embed = val;
102163                 return context;
102164             };
102165
102166
102167             /* Assets */
102168             var assetPath = '';
102169             context.assetPath = function(val) {
102170                 if (!arguments.length) return assetPath;
102171                 assetPath = val;
102172                 return context;
102173             };
102174
102175             var assetMap = {};
102176             context.assetMap = function(val) {
102177                 if (!arguments.length) return assetMap;
102178                 assetMap = val;
102179                 return context;
102180             };
102181
102182             context.asset = function(val) {
102183                 var filename = assetPath + val;
102184                 return assetMap[filename] || filename;
102185             };
102186
102187             context.imagePath = function(val) {
102188                 return context.asset('img/' + val);
102189             };
102190
102191
102192             /* locales */
102193             // `locale` variable contains a "requested locale".
102194             // It won't become the `currentLocale` until after loadLocale() is called.
102195             var locale, localePath;
102196
102197             context.locale = function(loc, path) {
102198                 if (!arguments.length) return currentLocale;
102199                 locale = loc;
102200                 localePath = path;
102201                 return context;
102202             };
102203
102204             context.loadLocale = function(callback) {
102205                 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
102206                     localePath = localePath || context.asset('locales/' + locale + '.json');
102207                     d3_json(localePath)
102208                         .then(function(result) {
102209                             addTranslation(locale, result[locale]);
102210                             setLocale(locale);
102211                             utilDetect(true);
102212                             if (callback) callback();
102213                         })
102214                         .catch(function(err) {
102215                             if (callback) callback(err.message);
102216                         });
102217                 } else {
102218                     if (locale) {
102219                         setLocale(locale);
102220                         utilDetect(true);
102221                     }
102222                     if (callback) {
102223                         callback();
102224                     }
102225                 }
102226             };
102227
102228
102229             /* reset (aka flush) */
102230             context.reset = context.flush = function() {
102231                 context.debouncedSave.cancel();
102232
102233                 Array.from(_deferred).forEach(function(handle) {
102234                     window.cancelIdleCallback(handle);
102235                     _deferred.delete(handle);
102236                 });
102237
102238                 Object.values(services$1).forEach(function(service) {
102239                     if (service && typeof service.reset === 'function') {
102240                         service.reset(context);
102241                     }
102242                 });
102243
102244                 validator.reset();
102245                 features.reset();
102246                 history.reset();
102247
102248                 return context;
102249             };
102250
102251
102252             /* Init */
102253
102254             context.projection = geoRawMercator();
102255             context.curtainProjection = geoRawMercator();
102256
102257             locale = utilDetect().locale;
102258             if (locale && !dataLocales.hasOwnProperty(locale)) {
102259                 locale = locale.split('-')[0];
102260             }
102261
102262             history = coreHistory(context);
102263             validator = coreValidator(context);
102264
102265             context.graph = history.graph;
102266             context.changes = history.changes;
102267             context.intersects = history.intersects;
102268             context.pauseChangeDispatch = history.pauseChangeDispatch;
102269             context.resumeChangeDispatch = history.resumeChangeDispatch;
102270
102271             // Debounce save, since it's a synchronous localStorage write,
102272             // and history changes can happen frequently (e.g. when dragging).
102273             context.debouncedSave = debounce(context.save, 350);
102274             function withDebouncedSave(fn) {
102275                 return function() {
102276                     var result = fn.apply(history, arguments);
102277                     context.debouncedSave();
102278                     return result;
102279                 };
102280             }
102281
102282             context.perform = withDebouncedSave(history.perform);
102283             context.replace = withDebouncedSave(history.replace);
102284             context.pop = withDebouncedSave(history.pop);
102285             context.overwrite = withDebouncedSave(history.overwrite);
102286             context.undo = withDebouncedSave(history.undo);
102287             context.redo = withDebouncedSave(history.redo);
102288
102289             ui = uiInit(context);
102290
102291             connection = services$1.osm;
102292             background = rendererBackground(context);
102293             features = rendererFeatures(context);
102294             photos = rendererPhotos(context);
102295             presets = presetIndex(context);
102296
102297             if (services$1.maprules && utilStringQs(window.location.hash).maprules) {
102298                 var maprules = utilStringQs(window.location.hash).maprules;
102299                 d3_json(maprules)
102300                     .then(function(mapcss) {
102301                         services$1.maprules.init();
102302                         mapcss.forEach(function(mapcssSelector) {
102303                             return services$1.maprules.addRule(mapcssSelector);
102304                         });
102305                     })
102306                     .catch(function() {
102307                         /* ignore */
102308                     });
102309             }
102310
102311             map = rendererMap(context);
102312             context.mouse = map.mouse;
102313             context.extent = map.extent;
102314             context.pan = map.pan;
102315             context.zoomIn = map.zoomIn;
102316             context.zoomOut = map.zoomOut;
102317             context.zoomInFurther = map.zoomInFurther;
102318             context.zoomOutFurther = map.zoomOutFurther;
102319             context.redrawEnable = map.redrawEnable;
102320
102321             Object.values(services$1).forEach(function(service) {
102322                 if (service && typeof service.init === 'function') {
102323                     service.init(context);
102324                 }
102325             });
102326
102327             validator.init();
102328             background.init();
102329             features.init();
102330             photos.init();
102331
102332             if (utilStringQs(window.location.hash).presets) {
102333                 var external = utilStringQs(window.location.hash).presets;
102334                 presets.fromExternal(external, function(externalPresets) {
102335                     context.presets = function() { return externalPresets; }; // default + external presets...
102336                     osmSetAreaKeys(presets.areaKeys());
102337                     osmSetPointTags(presets.pointTags());
102338                     osmSetVertexTags(presets.vertexTags());
102339                 });
102340             } else {
102341                 presets.init();
102342                 osmSetAreaKeys(presets.areaKeys());
102343                 osmSetPointTags(presets.pointTags());
102344                 osmSetVertexTags(presets.vertexTags());
102345             }
102346
102347             return context;
102348         }
102349
102350         function uiSourceSwitch(context) {
102351             var keys;
102352
102353
102354             function click() {
102355                 event.preventDefault();
102356
102357                 var osm = context.connection();
102358                 if (!osm) return;
102359
102360                 if (context.inIntro()) return;
102361
102362                 if (context.history().hasChanges() &&
102363                     !window.confirm(t('source_switch.lose_changes'))) return;
102364
102365                 var isLive = d3_select(this)
102366                     .classed('live');
102367
102368                 isLive = !isLive;
102369                 context.enter(modeBrowse(context));
102370                 context.history().clearSaved();          // remove saved history
102371                 context.flush();                         // remove stored data
102372
102373                 d3_select(this)
102374                     .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
102375                     .classed('live', isLive);
102376
102377                 osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
102378             }
102379
102380             var sourceSwitch = function(selection) {
102381                 selection
102382                     .append('a')
102383                     .attr('href', '#')
102384                     .text(t('source_switch.live'))
102385                     .classed('live', true)
102386                     .attr('tabindex', -1)
102387                     .on('click', click);
102388             };
102389
102390
102391             sourceSwitch.keys = function(_) {
102392                 if (!arguments.length) return keys;
102393                 keys = _;
102394                 return sourceSwitch;
102395             };
102396
102397
102398             return sourceSwitch;
102399         }
102400
102401         var Connection = services$1.osm;
102402
102403         var debug = false;
102404
102405         var iD = /*#__PURE__*/Object.freeze({
102406                 Connection: Connection,
102407                 debug: debug,
102408                 d3: index$3,
102409                 Context: coreContext,
102410                 setAreaKeys: osmSetAreaKeys,
102411                 get areaKeys () { return osmAreaKeys; },
102412                 Difference: coreDifference,
102413                 Graph: coreGraph,
102414                 History: coreHistory,
102415                 Tree: coreTree,
102416                 geoCross: geoVecCross,
102417                 geoInterp: geoVecInterp,
102418                 geoRoundCoordinates: geoVecFloor,
102419                 geoEuclideanDistance: geoVecLength,
102420                 Entity: osmEntity,
102421                 Node: osmNode,
102422                 Relation: osmRelation,
102423                 Way: osmWay,
102424                 BackgroundSource: rendererBackgroundSource,
102425                 Background: rendererBackground,
102426                 Features: rendererFeatures,
102427                 Map: rendererMap,
102428                 TileLayer: rendererTileLayer,
102429                 Detect: utilDetect,
102430                 uiPreset: uiPresetEditor,
102431                 actionAddEntity: actionAddEntity,
102432                 actionAddMember: actionAddMember,
102433                 actionAddMidpoint: actionAddMidpoint,
102434                 actionAddVertex: actionAddVertex,
102435                 actionChangeMember: actionChangeMember,
102436                 actionChangePreset: actionChangePreset,
102437                 actionChangeTags: actionChangeTags,
102438                 actionCircularize: actionCircularize,
102439                 actionConnect: actionConnect,
102440                 actionCopyEntities: actionCopyEntities,
102441                 actionDeleteMember: actionDeleteMember,
102442                 actionDeleteMultiple: actionDeleteMultiple,
102443                 actionDeleteNode: actionDeleteNode,
102444                 actionDeleteRelation: actionDeleteRelation,
102445                 actionDeleteWay: actionDeleteWay,
102446                 actionDiscardTags: actionDiscardTags,
102447                 actionDisconnect: actionDisconnect,
102448                 actionExtract: actionExtract,
102449                 actionJoin: actionJoin,
102450                 actionMerge: actionMerge,
102451                 actionMergeNodes: actionMergeNodes,
102452                 actionMergePolygon: actionMergePolygon,
102453                 actionMergeRemoteChanges: actionMergeRemoteChanges,
102454                 actionMove: actionMove,
102455                 actionMoveMember: actionMoveMember,
102456                 actionMoveNode: actionMoveNode,
102457                 actionNoop: actionNoop,
102458                 actionOrthogonalize: actionOrthogonalize,
102459                 actionRestrictTurn: actionRestrictTurn,
102460                 actionReverse: actionReverse,
102461                 actionRevert: actionRevert,
102462                 actionRotate: actionRotate,
102463                 actionSplit: actionSplit,
102464                 actionStraightenNodes: actionStraightenNodes,
102465                 actionStraightenWay: actionStraightenWay,
102466                 actionUnrestrictTurn: actionUnrestrictTurn,
102467                 actionReflect: actionReflect,
102468                 actionUpgradeTags: actionUpgradeTags,
102469                 behaviorAddWay: behaviorAddWay,
102470                 behaviorBreathe: behaviorBreathe,
102471                 behaviorCopy: behaviorCopy,
102472                 behaviorDrag: behaviorDrag,
102473                 behaviorDrawWay: behaviorDrawWay,
102474                 behaviorDraw: behaviorDraw,
102475                 behaviorEdit: behaviorEdit,
102476                 behaviorHash: behaviorHash,
102477                 behaviorHover: behaviorHover,
102478                 behaviorLasso: behaviorLasso,
102479                 behaviorOperation: behaviorOperation,
102480                 behaviorPaste: behaviorPaste,
102481                 behaviorSelect: behaviorSelect,
102482                 behaviorTail: behaviorTail,
102483                 coreContext: coreContext,
102484                 coreDifference: coreDifference,
102485                 coreGraph: coreGraph,
102486                 coreHistory: coreHistory,
102487                 coreTree: coreTree,
102488                 coreValidator: coreValidator,
102489                 data: data,
102490                 dataWikipedia: wikipedia$2,
102491                 dataAddressFormats: dataAddressFormats,
102492                 dataDeprecated: dataDeprecated,
102493                 dataDiscarded: dataDiscarded,
102494                 dataLocales: dataLocales,
102495                 dataPhoneFormats: dataPhoneFormats,
102496                 dataShortcuts: dataShortcuts,
102497                 dataImperial: dataImperial,
102498                 dataDriveLeft: dataDriveLeft,
102499                 dataEn: en,
102500                 geoExtent: geoExtent,
102501                 geoLatToMeters: geoLatToMeters,
102502                 geoLonToMeters: geoLonToMeters,
102503                 geoMetersToLat: geoMetersToLat,
102504                 geoMetersToLon: geoMetersToLon,
102505                 geoMetersToOffset: geoMetersToOffset,
102506                 geoOffsetToMeters: geoOffsetToMeters,
102507                 geoScaleToZoom: geoScaleToZoom,
102508                 geoSphericalClosestNode: geoSphericalClosestNode,
102509                 geoSphericalDistance: geoSphericalDistance,
102510                 geoZoomToScale: geoZoomToScale,
102511                 geoAngle: geoAngle,
102512                 geoChooseEdge: geoChooseEdge,
102513                 geoEdgeEqual: geoEdgeEqual,
102514                 geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
102515                 geoHasLineIntersections: geoHasLineIntersections,
102516                 geoHasSelfIntersections: geoHasSelfIntersections,
102517                 geoRotate: geoRotate,
102518                 geoLineIntersection: geoLineIntersection,
102519                 geoPathHasIntersections: geoPathHasIntersections,
102520                 geoPathIntersections: geoPathIntersections,
102521                 geoPathLength: geoPathLength,
102522                 geoPointInPolygon: geoPointInPolygon,
102523                 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
102524                 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
102525                 geoViewportEdge: geoViewportEdge,
102526                 geoRawMercator: geoRawMercator,
102527                 geoVecAdd: geoVecAdd,
102528                 geoVecAngle: geoVecAngle,
102529                 geoVecCross: geoVecCross,
102530                 geoVecDot: geoVecDot,
102531                 geoVecEqual: geoVecEqual,
102532                 geoVecFloor: geoVecFloor,
102533                 geoVecInterp: geoVecInterp,
102534                 geoVecLength: geoVecLength,
102535                 geoVecNormalize: geoVecNormalize,
102536                 geoVecNormalizedDot: geoVecNormalizedDot,
102537                 geoVecProject: geoVecProject,
102538                 geoVecSubtract: geoVecSubtract,
102539                 geoVecScale: geoVecScale,
102540                 geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
102541                 geoOrthoCalcScore: geoOrthoCalcScore,
102542                 geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
102543                 geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
102544                 modeAddArea: modeAddArea,
102545                 modeAddLine: modeAddLine,
102546                 modeAddPoint: modeAddPoint,
102547                 modeAddNote: modeAddNote,
102548                 modeBrowse: modeBrowse,
102549                 modeDragNode: modeDragNode,
102550                 modeDragNote: modeDragNote,
102551                 modeDrawArea: modeDrawArea,
102552                 modeDrawLine: modeDrawLine,
102553                 modeMove: modeMove,
102554                 modeRotate: modeRotate,
102555                 modeSave: modeSave,
102556                 modeSelect: modeSelect,
102557                 modeSelectData: modeSelectData,
102558                 modeSelectError: modeSelectError,
102559                 modeSelectNote: modeSelectNote,
102560                 operationCircularize: operationCircularize,
102561                 operationContinue: operationContinue,
102562                 operationDelete: operationDelete,
102563                 operationDisconnect: operationDisconnect,
102564                 operationDowngrade: operationDowngrade,
102565                 operationExtract: operationExtract,
102566                 operationMerge: operationMerge,
102567                 operationMove: operationMove,
102568                 operationOrthogonalize: operationOrthogonalize,
102569                 operationReflectShort: operationReflectShort,
102570                 operationReflectLong: operationReflectLong,
102571                 operationReverse: operationReverse,
102572                 operationRotate: operationRotate,
102573                 operationSplit: operationSplit,
102574                 operationStraighten: operationStraighten,
102575                 osmChangeset: osmChangeset,
102576                 osmEntity: osmEntity,
102577                 osmNode: osmNode,
102578                 osmNote: osmNote,
102579                 osmRelation: osmRelation,
102580                 osmWay: osmWay,
102581                 qaError: qaError,
102582                 osmIntersection: osmIntersection,
102583                 osmTurn: osmTurn,
102584                 osmInferRestriction: osmInferRestriction,
102585                 osmLanes: osmLanes,
102586                 osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
102587                 osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
102588                 osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
102589                 osmJoinWays: osmJoinWays,
102590                 get osmAreaKeys () { return osmAreaKeys; },
102591                 osmSetAreaKeys: osmSetAreaKeys,
102592                 get osmPointTags () { return osmPointTags; },
102593                 osmSetPointTags: osmSetPointTags,
102594                 get osmVertexTags () { return osmVertexTags; },
102595                 osmSetVertexTags: osmSetVertexTags,
102596                 osmNodeGeometriesForTags: osmNodeGeometriesForTags,
102597                 osmOneWayTags: osmOneWayTags,
102598                 osmPavedTags: osmPavedTags,
102599                 osmIsInterestingTag: osmIsInterestingTag,
102600                 osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
102601                 osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
102602                 osmRailwayTrackTagValues: osmRailwayTrackTagValues,
102603                 presetCategory: presetCategory,
102604                 presetCollection: presetCollection,
102605                 presetField: presetField,
102606                 presetPreset: presetPreset,
102607                 presetIndex: presetIndex,
102608                 rendererBackgroundSource: rendererBackgroundSource,
102609                 rendererBackground: rendererBackground,
102610                 rendererFeatures: rendererFeatures,
102611                 rendererMap: rendererMap,
102612                 rendererPhotos: rendererPhotos,
102613                 rendererTileLayer: rendererTileLayer,
102614                 services: services$1,
102615                 serviceKeepRight: serviceKeepRight,
102616                 serviceImproveOSM: serviceImproveOSM,
102617                 serviceMapillary: serviceMapillary,
102618                 serviceMapRules: serviceMapRules,
102619                 serviceNominatim: serviceNominatim,
102620                 serviceOpenstreetcam: serviceOpenstreetcam,
102621                 serviceOsm: serviceOsm,
102622                 serviceOsmWikibase: serviceOsmWikibase,
102623                 serviceStreetside: serviceStreetside,
102624                 serviceTaginfo: serviceTaginfo,
102625                 serviceVectorTile: serviceVectorTile,
102626                 serviceWikidata: serviceWikidata,
102627                 serviceWikipedia: serviceWikipedia,
102628                 svgAreas: svgAreas,
102629                 svgData: svgData,
102630                 svgDebug: svgDebug,
102631                 svgDefs: svgDefs,
102632                 svgKeepRight: svgKeepRight,
102633                 svgIcon: svgIcon,
102634                 svgGeolocate: svgGeolocate,
102635                 svgLabels: svgLabels,
102636                 svgLayers: svgLayers,
102637                 svgLines: svgLines,
102638                 svgMapillaryImages: svgMapillaryImages,
102639                 svgMapillarySigns: svgMapillarySigns,
102640                 svgMidpoints: svgMidpoints,
102641                 svgNotes: svgNotes,
102642                 svgMarkerSegments: svgMarkerSegments,
102643                 svgOpenstreetcamImages: svgOpenstreetcamImages,
102644                 svgOsm: svgOsm,
102645                 svgPassiveVertex: svgPassiveVertex,
102646                 svgPath: svgPath,
102647                 svgPointTransform: svgPointTransform,
102648                 svgPoints: svgPoints,
102649                 svgRelationMemberTags: svgRelationMemberTags,
102650                 svgSegmentWay: svgSegmentWay,
102651                 svgStreetside: svgStreetside,
102652                 svgTagClasses: svgTagClasses,
102653                 svgTouch: svgTouch,
102654                 svgTurns: svgTurns,
102655                 svgVertices: svgVertices,
102656                 uiFields: uiFields,
102657                 uiFieldDefaultCheck: uiFieldCheck,
102658                 uiFieldOnewayCheck: uiFieldCheck,
102659                 uiFieldCheck: uiFieldCheck,
102660                 uiFieldMultiCombo: uiFieldCombo,
102661                 uiFieldNetworkCombo: uiFieldCombo,
102662                 uiFieldSemiCombo: uiFieldCombo,
102663                 uiFieldTypeCombo: uiFieldCombo,
102664                 uiFieldCombo: uiFieldCombo,
102665                 uiFieldUrl: uiFieldText,
102666                 uiFieldNumber: uiFieldText,
102667                 uiFieldTel: uiFieldText,
102668                 uiFieldEmail: uiFieldText,
102669                 uiFieldText: uiFieldText,
102670                 uiFieldAccess: uiFieldAccess,
102671                 uiFieldAddress: uiFieldAddress,
102672                 uiFieldCycleway: uiFieldCycleway,
102673                 uiFieldLanes: uiFieldLanes,
102674                 uiFieldLocalized: uiFieldLocalized,
102675                 uiFieldMaxspeed: uiFieldMaxspeed,
102676                 uiFieldStructureRadio: uiFieldRadio,
102677                 uiFieldRadio: uiFieldRadio,
102678                 uiFieldRestrictions: uiFieldRestrictions,
102679                 uiFieldTextarea: uiFieldTextarea,
102680                 uiFieldWikidata: uiFieldWikidata,
102681                 uiFieldWikipedia: uiFieldWikipedia,
102682                 uiIntro: uiIntro,
102683                 uiInfoPanels: uiInfoPanels,
102684                 uiPanelBackground: uiPanelBackground,
102685                 uiPanelHistory: uiPanelHistory,
102686                 uiPanelLocation: uiPanelLocation,
102687                 uiPanelMeasurement: uiPanelMeasurement,
102688                 uiSettingsCustomBackground: uiSettingsCustomBackground,
102689                 uiSettingsCustomData: uiSettingsCustomData,
102690                 uiInit: uiInit,
102691                 uiAccount: uiAccount,
102692                 uiAttribution: uiAttribution,
102693                 uiBackground: uiBackground,
102694                 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
102695                 uiBackgroundOffset: uiBackgroundOffset,
102696                 uiChangesetEditor: uiChangesetEditor,
102697                 uiCmd: uiCmd,
102698                 uiCombobox: uiCombobox,
102699                 uiCommit: uiCommit,
102700                 uiCommitChanges: uiCommitChanges,
102701                 uiCommitWarnings: uiCommitWarnings,
102702                 uiConfirm: uiConfirm,
102703                 uiConflicts: uiConflicts,
102704                 uiContributors: uiContributors,
102705                 uiCurtain: uiCurtain,
102706                 uiDataEditor: uiDataEditor,
102707                 uiDataHeader: uiDataHeader,
102708                 uiDisclosure: uiDisclosure,
102709                 uiEditMenu: uiEditMenu,
102710                 uiEntityEditor: uiEntityEditor,
102711                 uiFeatureInfo: uiFeatureInfo,
102712                 uiFeatureList: uiFeatureList,
102713                 uiField: uiField,
102714                 uiFieldHelp: uiFieldHelp,
102715                 uiFlash: uiFlash,
102716                 uiFormFields: uiFormFields,
102717                 uiFullScreen: uiFullScreen,
102718                 uiGeolocate: uiGeolocate,
102719                 uiHelp: uiHelp,
102720                 uiImproveOsmComments: uiImproveOsmComments,
102721                 uiImproveOsmDetails: uiImproveOsmDetails,
102722                 uiImproveOsmEditor: uiImproveOsmEditor,
102723                 uiImproveOsmHeader: uiImproveOsmHeader,
102724                 uiInfo: uiInfo,
102725                 uiInspector: uiInspector,
102726                 uiKeepRightDetails: uiKeepRightDetails,
102727                 uiKeepRightEditor: uiKeepRightEditor,
102728                 uiKeepRightHeader: uiKeepRightHeader,
102729                 uiLasso: uiLasso,
102730                 uiLoading: uiLoading,
102731                 uiMapData: uiMapData,
102732                 uiMapInMap: uiMapInMap,
102733                 uiModal: uiModal,
102734                 uiNotice: uiNotice,
102735                 uiNoteComments: uiNoteComments,
102736                 uiNoteEditor: uiNoteEditor,
102737                 uiNoteHeader: uiNoteHeader,
102738                 uiNoteReport: uiNoteReport,
102739                 uiPresetEditor: uiPresetEditor,
102740                 uiPresetIcon: uiPresetIcon,
102741                 uiPresetList: uiPresetList,
102742                 uiQuickLinks: uiQuickLinks,
102743                 uiRadialMenu: uiRadialMenu,
102744                 uiRawMemberEditor: uiRawMemberEditor,
102745                 uiRawMembershipEditor: uiRawMembershipEditor,
102746                 uiRawTagEditor: uiRawTagEditor,
102747                 uiRestore: uiRestore,
102748                 uiScale: uiScale,
102749                 uiSelectionList: uiSelectionList,
102750                 uiSidebar: uiSidebar,
102751                 uiSourceSwitch: uiSourceSwitch,
102752                 uiSpinner: uiSpinner,
102753                 uiSplash: uiSplash,
102754                 uiStatus: uiStatus,
102755                 uiSuccess: uiSuccess,
102756                 uiTagReference: uiTagReference,
102757                 uiToggle: uiToggle,
102758                 uiTooltipHtml: uiTooltipHtml,
102759                 uiVersion: uiVersion,
102760                 uiViewOnOSM: uiViewOnOSM,
102761                 uiViewOnKeepRight: uiViewOnKeepRight,
102762                 uiZoom: uiZoom,
102763                 utilArrayChunk: utilArrayChunk,
102764                 utilArrayDifference: utilArrayDifference,
102765                 utilArrayFlatten: utilArrayFlatten,
102766                 utilArrayGroupBy: utilArrayGroupBy,
102767                 utilArrayIntersection: utilArrayIntersection,
102768                 utilArrayUnion: utilArrayUnion,
102769                 utilArrayUniq: utilArrayUniq,
102770                 utilArrayUniqBy: utilArrayUniqBy,
102771                 utilAsyncMap: utilAsyncMap,
102772                 utilCleanTags: utilCleanTags,
102773                 utilDetect: utilDetect,
102774                 utilDisplayName: utilDisplayName,
102775                 utilDisplayNameForPath: utilDisplayNameForPath,
102776                 utilDisplayType: utilDisplayType,
102777                 utilDisplayLabel: utilDisplayLabel,
102778                 utilEntityRoot: utilEntityRoot,
102779                 utilEditDistance: utilEditDistance,
102780                 utilEntitySelector: utilEntitySelector,
102781                 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
102782                 utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
102783                 utilFastMouse: utilFastMouse,
102784                 utilFunctor: utilFunctor,
102785                 utilGetAllNodes: utilGetAllNodes,
102786                 utilGetSetValue: utilGetSetValue,
102787                 utilHashcode: utilHashcode,
102788                 utilHighlightEntities: utilHighlightEntities,
102789                 utilKeybinding: utilKeybinding,
102790                 utilNoAuto: utilNoAuto,
102791                 utilObjectOmit: utilObjectOmit,
102792                 utilPrefixCSSProperty: utilPrefixCSSProperty,
102793                 utilPrefixDOMProperty: utilPrefixDOMProperty,
102794                 utilPreset: utilPreset,
102795                 utilQsString: utilQsString,
102796                 utilRebind: utilRebind,
102797                 utilSetTransform: utilSetTransform,
102798                 utilSessionMutex: utilSessionMutex,
102799                 utilStringQs: utilStringQs,
102800                 utilTagDiff: utilTagDiff,
102801                 utilTagText: utilTagText,
102802                 utilTiler: utilTiler,
102803                 utilTriggerEvent: utilTriggerEvent,
102804                 utilWrap: utilWrap,
102805                 validationAlmostJunction: validationAlmostJunction,
102806                 validationCloseNodes: validationCloseNodes,
102807                 validationCrossingWays: validationCrossingWays,
102808                 validationDisconnectedWay: validationDisconnectedWay,
102809                 validationFixmeTag: validationFixmeTag,
102810                 validationGenericName: validationGenericName,
102811                 validationImpossibleOneway: validationImpossibleOneway,
102812                 validationIncompatibleSource: validationIncompatibleSource,
102813                 validationFormatting: validationFormatting,
102814                 validationMaprules: validationMaprules,
102815                 validationMissingRole: validationMissingRole,
102816                 validationMissingTag: validationMissingTag,
102817                 validationOutdatedTags: validationOutdatedTags,
102818                 validationPrivateData: validationPrivateData,
102819                 validationTagSuggestsArea: validationTagSuggestsArea,
102820                 validationUnsquareWay: validationUnsquareWay
102821         });
102822
102823         // polyfill requestIdleCallback
102824         window.requestIdleCallback = window.requestIdleCallback ||
102825             function(cb) {
102826                 var start = Date.now();
102827                 return window.requestAnimationFrame(function() {
102828                     cb({
102829                         didTimeout: false,
102830                         timeRemaining: function() {
102831                             return Math.max(0, 50 - (Date.now() - start));
102832                         }
102833                     });
102834                 });
102835             };
102836
102837         window.cancelIdleCallback = window.cancelIdleCallback ||
102838             function(id) {
102839                 window.cancelAnimationFrame(id);
102840             };
102841         window.iD = iD;
102842
102843 }());
102844 //# sourceMappingURL=iD.js.map